提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、PWM是什么?
- 二、如何控制舵机?
一、PWM是什么?
PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进
行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通
过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的
时间占据整个信号周期的百分比,例如方波的占空比就是50%.
脉冲宽度调制
通过占空比编码模拟信号
占空比 一个周期内,高电平占据时长的百分比
二、如何控制舵机?
1. 什么是舵机
如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制
用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等
常见的有0-90°、0-180°、0-360°
2. 怎么控制舵机
向黄色信号线“灌入”PWM信号,通过控制高电平的时间,来控制舵机的角度
PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,20ms左右
数据:
0.5ms-------------0度; 2.5% 对应函数中占空比为250
1.0ms------------45度; 5.0% 对应函数中占空比为500
1.5ms------------90度; 7.5% 对应函数中占空比为750
2.0ms-----------135度; 10.0% 对应函数中占空比为1000
2.5ms-----------180度; 12.5% 对应函数中占空比为1250
3、定时器定时
定时器需要定时20ms, 关心的单位0.5ms, 40个的0.5ms,初值0.5ms,定时器看晶振频率。
加1经过了多少时间
当晶振频率(时钟频率)是11.0592MHz的时候,等于11059.2KHz = 11059200Hz
机器周期 = 12 x 时钟周期 =12 x (1/时钟频率) 秒 = 12 / 时钟频率 秒 = 12 / 11059200 秒 = 12 000 000/ 11059200 微秒 = 1.085 微秒
代码如下(示例):
#include <reg52.h>
int jd;
sbit sg90_c = P1^1;
int cnt =0;
void Delay300ms() //@11.0592MHz
{unsigned char i, j, k;i = 3;j = 26;k = 223;do{do{while (--k);} while (--j);} while (--i);
}void Time0init() //定时器0初始化
{//1.配置定时器0工作模式位16位计时TMOD=0x01; //TL0,TH0全用 0 1//2.给初值,定一个10ms出来TL0= 0x33;TH0= 0xFE; //TL0存放低八位00,TH0存放高8位DC//3.开始计时TR0=1;//4.打开定时器0中断ET0=1;//5.打开总中断EAEA=1;
}void main()
{Delay300ms();Time0init();jd =1; //角度为1,即只有一个0.5ms的高电平,为0°cnt = 0;sg90_c = 1; //先让舵机一开始处于高电平//4.爆表了while(1){jd=4; //舵机转135°时,高电平时间是2ms,需要4个0.5mscnt =0;Delay300ms();jd = 1;cnt=0;Delay300ms();}
}//TF0爆表时,硬件自动调用中断函数
void Time0Handler() interrupt 1 //定时器0的中断号
{cnt++;//重新赋初值TL0=0x33;TH0=0xFE;if(cnt<jd) //舵机转135°时,高电平时间是2ms,需要4个0.5ms{sg90_c=1; }else{sg90_c = 0; //一直保持低电平到结束}if(cnt==40) //爆表40次,经过20ms,结束第一次PWM周期,PWM为50HZ{cnt=0; //重新让cnt从0开始,计算下一次的20mssg90_c=1; //每次cnt为0时(即初始状态)处于高电平,等待PWM}}