提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

 

文章目录

  • 一、PWM是什么?
  • 二、如何控制舵机?
  •  

     

    一、PWM是什么?

    PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进
    行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通
    过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的
    时间占据整个信号周期的百分比,例如方波的占空比就是50%.

    脉冲宽度调制
    通过占空比编码模拟信号
    占空比 一个周期内,高电平占据时长的百分比

     

    二、如何控制舵机?

    1. 什么是舵机
    如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制
    用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等
    常见的有0-90°、0-180°、0-360°

    319b8f6b88df43db92e5056d8b7319e6.png

     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.打开总中断EA
    	EA=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.5ms
    		cnt =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开始,计算下一次的20ms
    		sg90_c=1; //每次cnt为0时(即初始状态)处于高电平,等待PWM
    	}
    		
    }
    

     


     

     

     

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单片机PWM舵机控制

    发表评论