舵机是用PWM波控制的,学完PWM就可以简单的控制舵机啦。
我用的是stm32c8t6单片机,高级定时器TIM1_CH1,使用通用定时器也行,大同小异,结果都一样。定时器部分的知识,代码网上都有,我这里不再赘述。
开始之前我们先了解一下舵机的特点:①舵机的确是有顺时针,逆时针转动,但是舵机不需要知道原来的角度位置,只要有新的PWM信号,该信号的角度是多少,它就会转到多少度(百度网友的回答)。
②舵机需要MCU产生一个20ms(即50Hz)的脉冲信号。在这个信号中,0.5ms对应0度,1.0ms对应45度,1.5ms对应90度,2.0ms对应135度,2.5ms对应180度。
程序配置:
PERIOD - 199
PSC - 7199
PULSE - 200
main.c程序如下:
while( 1 )
{ //顺时针:先从0度转到45度位置,然后回到0度位置,再转到90度的位置,
//逆时针:在90度位置逆时针转45度,再回到90度的位置,再逆时针转90度,回到起点。
TIM_SetCompare1(TIM1, 195); //0度位置
SysTick_Delay_ms(3000);
TIM_SetCompare1(TIM1, 190); //45度位置
SysTick_Delay_ms(3000);
TIM_SetCompare1(TIM1, 195); //0度位置
SysTick_Delay_ms(3000);
TIM_SetCompare1(TIM1, 185); //90度位置
SysTick_Delay_ms(3000);
TIM_SetCompare1(TIM1, 190);
SysTick_Delay_ms(3000);
TIM_SetCompare1(TIM1, 185);
SysTick_Delay_ms(3000);
TIM_SetCompare1(TIM1, 195);
}
调用 TIM_SetCompare1(TIM1, 195)这个函数就可以输出相应的PWM波了。
有一个小插曲:我的单片机用Stlink下载不进去,经同学的帮助,原来串口也可以下载。串口上分别有5V,VCC,3V3,TXD,RXD,GND.其中,TXD连接单片机的USART1的RXD引脚,即PA9,RXD连接TXD引脚,即PA10。另外下载时要把Boot0拉高,而Boot1拉低。当执行程序时,要把Boot0拉低,Boot1依然是低电位。执行程序时有时还要按一下复位键才会执行程序。
欢迎交流学习!