STC12LE5612AD芯片使用心得(十)PWM与舵机

        脉冲宽度调制英语:Pulse Width Modulation,缩写:PWM),简称脉宽调制,是将模拟信号变换为脉冲波的一种技术,一般变换后脉冲的周期固定,但脉冲的占空比会依模拟信号的大小而改变。

        在模拟电路中,模拟信号的值可以连续进行变化,在时间和值的幅度上都几乎没有限制,基本上可以取任何实数值,输入与输出也呈线性变化。所以在模拟电路中,电压和电流可直接用来进行控制对象,例如家用电器设备中的音量开关控制、采用卤素灯泡灯具的亮度控制等等。但模拟电路有诸多的问题:例如控制信号容易随时间漂移,难以调节;功耗大;易受噪声和环境干扰等等。

        与模拟电路不同,数字电路是在预先确定的范围内取值,在任何时刻,其输出只可能为ON和OFF两种状态,所以电压或电流会通/断方式的重复脉冲序列加载到模拟负载。PWM技术是一种对模拟信号电平的数字编码方法,通过使用高分辨率计数器(调制频率)调制方波的占空比,从而实现对一个模拟信号的电平进行编码。其最大的优点是从处理器到被控对象之间的所有信号都是数字形式的,无需再进行数模转换过程;而且对噪声的抗干扰能力也大大增强(噪声只有在强到足以将逻辑值改变时,才可能对数字信号产生实质的影响),这也是PWM在通讯等信号传输行业得到大量应用的主要原因。目前在很多微型控制器(MCU)内部都包含有PWM控制器模块。

        脉冲宽度调制是指使用一个脉冲宽度会被调制的方波,使得波型的平均值会有所变化。如果我们考虑一个周期为  的脉冲波  ,低值  ,高值为  ,跟一个工作循环D(duty cycle),(参照下图),此波的平均值为:

STC12LE5612AD芯片使用心得(十)PWM与舵机_第1张图片

{\displaystyle {\bar {y}}={\frac {1}{T}}\int _{0}^{T}f(t)\,dt.}

当 {\displaystyle f(t)} 是一个脉冲波,它的值在 {\displaystyle 0 是 {\displaystyle y_{\text{max}}},而在 {\displaystyle D\cdot T 是 {\displaystyle y_{\text{min}}},上式的描述可以变为:

{\displaystyle {\begin{aligned}{\bar {y}}&={\frac {1}{T}}\left(\int _{0}^{DT}y_{\text{max}}\,dt+\int _{DT}^{T}y_{\text{min}}\,dt\right)\\&={\frac {1}{T}}\left(D\cdot T\cdot y_{\text{max}}+T\left(1-D\right)y_{\text{min}}\right)\\&=D\cdot y_{\text{max}}+\left(1-D\right)y_{\text{min}}.\end{aligned}}}

以上表示可以在很多状况下被简化,当 {\displaystyle y_{\text{min}}=0} 及 {\displaystyle {\bar {y}}=D\cdot y_{\text{max}}}。从这是可以看出,波型的平均值非常明显地直接与工作循环之值D有关。

        脉冲宽度调制输出后,在对应引脚上得到的波形依旧类似方波,需要解调电路将其转换为模拟信号,通过改变占空比可以得到不同的电压值,在时间连续的情况下不同的电压便可以连续成为一个新的脉冲波,即输入PWM波与输入等效的得到的效果是一样的。


    舵机:在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出是的单片机系统非常容易与之接口。

     舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型,遥控机器人中已经使用的比较普遍,舵机是一种俗称,其实是一种伺服马达。

    工作原理:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压和电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。以180度角度伺服为例:

 STC12LE5612AD芯片使用心得(十)PWM与舵机_第2张图片

    在我的项目中,使用舵机旋转超声波发射头以实现多点测控。使用STC12LE5612AD的PWM实现。代码如下:

    首先需要设置PCA模块为PWM输出模式(如何设置PCA模式),使用定时器0作为时钟源(因为舵机的驱动信号为50Hz的脉冲,而系统时钟为22.1184无法改变,通过分频无法获得50Hz的脉冲波)要注意在舵机到达指定位置后应关闭PWM输出,否则如果占空比设置出现错误可能会导致舵机持续转动发出嗡嗡声,可以通过延时一定的时间来实现。

    该单片机为8位PWM,因此控制等级只有25级,要求T0的溢出率为1/50/256=78us。

    void Timer0Init(void){//78微秒@22.1184MHz,8位自动重载模式

        ET0 = 1;         //打开中断是为了使用Timer0做时基处理,但要注意在Timer0中断服务程序中不要装在TH0和TL0

        AUXR &= 0x7F; //定时器时钟12T模式

        TMOD &= 0xF0; //设置定时器模式

        TMOD |= 0x02; //设置定时器模式

        TL0 = 0x70; //设置定时初值

        TH0 = 0x70; //设置定时重载值

        TF0 = 0; //清除TF0标志

        TR0 = 1; //定时器0开始计时

}

CMOD = 0x84; //1000,0100,PCA脉冲时钟源为定时器0

CCAP1H = CCAP1L = 0xec;

//设置比较器和比较器重载寄存器的值,该值除以255可以得到低电平所占的比例,即占空比 = 1 - CCAP1L / 255;

//为得到从0到180的角度,需要根据输入的角度值确定CCAP1L的装载值,计算公式如下:

//CCAP1L = CCAP1H = 255 - (7 + 25 * angle / 180);但由于没有进行四舍五入,因此该公式误差较大。

CCAPM1 = 0x42;//0100,0010//b6

CR = 1;//开启PCA

//延时一定时间之后,要关闭PWM输出

delay(1000);    //延时1s

CMOD = 0x02;

CCAPM1 = 0x00;

你可能感兴趣的:(STC12LE5612AD芯片使用心得(十)PWM与舵机)