此篇文章免费分享给大家,这篇文章结合笔者所学以及在往上参考大神的讲解,通过自己的理解整理成文档,在此免费分享给大家,由于笔者是一名在读学生,文中难免有不当之处,如有错误,望大家指正!!!我会把源文档和源程序放在附件中,有黑币的直接下载,没有的留下邮箱,看见回
SG90舵机(模拟舵机) 一、日常吐槽额~~~~~~,在开始今天的主题之前,占用大家一些时间。容我骂街一番,$##%%%$%#$#$$%^艹……………….,哎呀妈呀,骂的有点喘不过来了,额~呸,是言(文明人,文明人)。
可能就奇了怪了,你不好好码字,骂什么街呢!说来惭愧,上边被骂的人就是笔者自己。今天在调试程序的时候,对,就这个鬼舵机,怎么都不转!!!检查硬件---检查程序---百度,如此反复N小时。始终找不到问题所在,程序呢,怎么看,怎么美!硬件呢,怎么看,怎么帅!说是急,那是快,电闪雷鸣,刀光剑影,啪,一个数字1摔在脸上,于是乎,快速打开课本,啪~啪~啪,数字0、1,大脑瓜子一拍,哎呀,一定是这错误了!快速拿起闪闪发光的鼠标,熟练的打开Keil4,一段操作猛如虎,只听见那吱~吱~吱~吱,舵机工作了~~~~
粗心大意:定时器0对应的中端口----void Timer() interrupt 1
马虎大意的我写成了这样:void Timer() interrupt 0.
家都走错了,人家咋可能给你钱,大家一定要引以为戒,细心细心再细心
中断号
| 中断源
| 0
| 外部中断0
| 1
| 定时器中断0
| 2
| 外部中断1
| 3
| 定时器中断1
| 4
| 串行口中断1
| 注意:C语言用关键字“interrupt+数字”来代替汇编中中断入口地址
——————————————————————————————————
以上非本次笔记重点,只是笔者一点小小的吐槽,外加一点小小的知识
——————————————————————————————————
二、主咖登场基本概念:1.舵机:舵机是一种位置(角度)伺服的驱动器,适用那些需要角度不断变化并可以保持的控制系统。舵机只是一种通俗的叫法,其实质是一个伺服马达。
2.模拟舵机:需要不断的发送目的地PWM信号,才能旋转到指定位置。例如:我现在让它旋转90度,我就需要不断的发送90度的PWM信号直到到达指定位置才能停止。
3.数字舵机:只需给一个目的地PWM信号,即可旋转到指定位置。例如:我现在让它旋转90度,我只需要发送一次90度的PWM信号,它就可以旋转到90度。
4.PWM信号:PWM(脉冲宽度调制)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。那么什么叫PWM信号呢,笔者就简单的谈一下自己的看法,我们都知道,我们所使用的单片机都是数字电路,它的I/O口只有两种状态,那就是高电平(1),低电平(0)。知道了这些之后,我们通过控制微处理器输出1-0-1-0-1-0-1-0……如此循环往复,就成为下图1所示的情况,这就是PWM信号。
图1.PWM信号
5.占空比:高电平(或者低电平)占整个周期的时间就叫作占空比。
6.PWM频率:PWM频率是指每秒钟信号从高电平到低电平再到高电平的次数。
工作原理 理解以上的概念,对我们接下来的学习是非常有必要的,希望大家能好好掌握上面的概念。
我所使用的SG90舵机,如下图2所示
图2
接线方法:
红-------------------------VCC
棕色----------------------GND
橙色----------------------信号线
原理:舵机内部有一个基准电压,微处理器产生的PWM信号通过信号线进入舵机产生直流偏置电压,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。当舵机开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。
重点:作为一个单片机编写者,具体的原理,我们不必要搞清楚,我们只需知道如何控制它即可,以下将讲解如何控制舵机运转。
第一步:我们需要使用单片机产生周期为20ms,高电平t等于0.5ms-2.5ms之间的这样一个方波。定时器+中断产生这样的方波。
高电平在一个周期(20ms)的持续时间对应的舵机角度,如下图所示。
高电平t占整个周期T(20ms)的时间
| 舵机旋转的角度
| 0.5ms
| 0度
| 1ms
| 45度
| 1.5ms
| 90度
| 2ms
| 135度
| 2.5ms
| 180度
| 第二步:简单讲一下编程思想吧,我所使用的是方法是定时器+中断,定时器每0.5ms中断一次,需要中断40次才能达到20ms。我们此时需要一个全局变量来记录中断的次数,当中断达到40次时,全局变量重新清零。当中断次数小于a时,信号线输出高电平,否则输出零。此时a的值对应关系如下(1--0度,2--45度,3--90度,4--135度,5--180度)。
第三步:着重讲程序中一个语句的含义
为什么此处要此处a==16,a==32,首先,这个值是我一步步测试出来的,如果你看见源程序的话,上面有详细的介绍,此处不再赘述。
我们知道SG90是一个模拟舵机,需要不断的给出信号才能到达指定的位置。到达这个位置并不是一蹴而就的,它需要时间,实际上面的a==16,相当于延时,这段时间刚好能够让舵机达到指定的位置,然后在接收下一个回摆程序。a==32,是因为我需要让它来回摆动的时间对称,所以才用a==32的。有兴趣的可以改变a的值,观察一下具体的情况。
程序此处都不贴出来,时间紧迫,我会放在附件中,有黑币的直接下载,没有的,留下邮箱
单片机源程序如下:
- #include<reg52.h>
- sbit SG_PWM=P0^0;
- unsigned char count=0;
- unsigned char PWM_count=3; //1--0度,2--45度,3--90度,4--135度,5--180度
- unsigned char a=0;
- void Timer_Init()
- {
- TMOD=0X01; //T0定时方式1
- TH0=0Xfe;
- TL0=0X33; //计数初值设置为0.5ms
- ET0=1; //打开定时器0的中断
- TR0=1; //打开定时器0
- EA=1; //开总中断
- }
- void Timer() interrupt 1 //特别注意此处,0--外部中断0,1--定时器中断0,2--外部中断1,3--定时器中断1,4--串行口中断1
- {
- TR0=0;
- TH0=0Xfe;
- TL0=0X33; //重新赋计数初值为0.5ms
- if(count<=PWM_count)
- {
- SG_PWM=1;
- }
- else
- {
- SG_PWM=0;
- }
- count++;
- if(count>=40)
- {
- count=0;
- a++;
- }
- TR0=1;
- }
- void main()
- {
- Timer_Init();
- while(1)
- {
- if(a==16) //20是比较舒服的连贯动作,20以上动作些许不连贯 10的时候出现打架情况,15的时候打架几乎没有,16比较完美
- {
- PWM_count=1;
- }
- if(a==32)
- {
- PWM_count=3;
- a=0;
- }
- }
- }
复制代码
全部资料51hei下载地址:
SG90舵机--自动控制.7z
(8.99 KB, 下载次数: 1154)
SG90舵机--按键控制.7z
(9.62 KB, 下载次数: 927)
浅谈SG90舵机.docx
(139.68 KB, 下载次数: 464)
|