STM32小车篇之舵机控制角度

STM32小车篇之舵机控制角度

舵机组成
舵机的主要组成部分为伺服电机,所谓伺服就是服从信号的要求而动作。在信号来之前,转子停止不动;信号来到之后,转子立即运动。因此我们就可以给舵机输入不同的信号,来控制其旋转到不同的角度。
舵机接收的是PWM信号,当信号进入内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,使电压差为零时,电机停转,从而达到伺服的效果。简单来说就是给舵机一个特定的PWM信号,舵机就可以旋转到指定的位置。
舵机上有三根线,分别是GND、VCC和SIG,也就是地线、电源线和信号线,其中的PWM波就是从信号线输入给舵机的。首先是舵机的引线,**一般为三线控制:红色为电源,棕色为地,黄色为信号。**控制舵机的时候,需要不断的给PWM波才能使得舵机在某个角度有扭矩。
一般来说,舵机接收的PWM信号频率为50HZ,即基本周期为20ms。如下图:
STM32小车篇之舵机控制角度_第1张图片
编码
在代码中要特别注意的是时基结构体的TIM_Period(自动重装载寄存器值,简称arr)和TIM_Prescaler(预分频寄存器值,简称psc),因为这两个决定了输出PWM信号的周期。具体的周期计算公式为:周期=(arr+1)*(psc+1)/CLK。其中CLK为计数器的时钟频率,我的是72MHZ,也就是72000000。最后计算结果单位为秒,结果为0.02s,也就是20ms。这样的配置就是为了让输出的PWM信号达到前面说到的舵机要求的20ms周期。
前面说过,在周期20ms的PWM信号中,不同的脉宽对应舵机不同的转动角度,在0.5ms-2.5ms间有效,因此我们可以在main函数中配置几个不同的脉宽。要注意的是stm32并不直接配置脉宽,而是通过配置占空比来配置脉宽的。

角度
角度是由来自控制线的持续的脉冲所产生。这种控制方法叫做脉冲调制。脉冲的长短决定舵机转动多大角度。范围为(0~180°)
舵机转动0度代表它的占空比是2.5%,转动180度代表它的占空比是12.5%。即设arr(自动重装载值)为x时。转动角度所对应的值=(x+1)*(1-占空比)(将PWM1极性设置为TIM_OCPolarity_High时)

int main(void)
{
	delay_init(); //延时函数初始化
	LED_Init();	//LED端口初始化
	TIM2_PWM_Init(1999,719); //不分频,PWM频率=72000000/720/2000=50hz	
	while(1){	
		TIM_SetCompare2(TIM2,1950); //对应0度	    2.5%
  	  	delay_ms(1000);	
		TIM_SetCompare2(TIM2, 1900); //对应45度		5%	
    	delay_ms(1000);
		TIM_SetCompare2(TIM2, 1850); //对应90度		7.5%
   		delay_ms(1000);
		TIM_SetCompare2(TIM2, 1800); //对应135度	10%
		delay_ms(1000);
		TIM_SetCompare2(TIM2,1750); //对应180度		12.5%
		delay_ms(1000);
	}
}

转动角度所对应的值=(x+1)*占空比(将PWM2极性设置为TIM_OCPolarity_Low时),程序如下:

int main(void)
{
	delay_init(); //延时函数初始化
	LED_Init();	//LED端口初始化
	TIM2_PWM_Init(1999,719); //不分频,PWM频率=72000000/720/2000=50hz	
	while(1)
	{	
		TIM_SetCompare2(TIM2,250); //对应180度  12.5%
   		 delay_ms(1000);	
		TIM_SetCompare2(TIM2, 200); //对应135度	10%
    	delay_ms(1000);
		TIM_SetCompare2(TIM2, 150); //对应90度	7.5%
    	delay_ms(1000);
		TIM_SetCompare2(TIM2, 100); //对应45度	5%
		delay_ms(1000);
		TIM_SetCompare2(TIM2,50); //对应0度	2.5%
		delay_ms(1000);
	}
}

你可能感兴趣的:(stm32,物联网,嵌入式)