嵌入式常用动力源之舵机——基于STM32HAL库

舵机因其大扭矩在对瞬时动力要求高的场合很适用,比如机械臂,但是也有其劣势,只能在规定角度范围内来回转动。市面上的舵机转动角度分为180度,270度,和360度三种。

这里记录通过hal库进行舵机的最简单使用。

(1)输出PWM配置

这里上篇文章已经记录过了STM32G431定时器产生PWM(Hal库)-CSDN博客,不清楚的看一下

(2)如何通过PWM驱动舵机

舵机有三根线,电源线,接地线,还有信号线,电源线一般接5V,可以容忍6V,接地线保证和输出PWM的单片机共地即可,信号线接定时器输出PWM的通道,这里使用定时器3的通道CH1,对应STM32的引脚是PA6,。

本次使用的是角度范围270度的舵机,对常见的任意转动角度的舵机,在配置PWM的三个参数时,需要满足输出的PWM的周期为20ms,高电平宽度为0.5ms-2.5ms.在使用主频是170MHZ的单片机下,具体到PSC,ARR,CCR的值即是:PSC=170-1,ARR=20000-1,CCR∈(500,2500)。

Cubemax配置好之后,在keil里通过hal库自己生成的这个宏可以修改CCR的值,不熟悉宏用法的可能看着一脸懵逼,实际上在这里把它当成一个可以传入三个参数的函数即可,嵌入式常用动力源之舵机——基于STM32HAL库_第1张图片线性调整CCR的值在500-2500之前即可得到所用电机的允许范围内任意角度,但是这样一点都不直观,所以把这个宏封装成一个更加清晰明了的函数,比如我想让舵机转动到90度就给参数90.

void Servo_SetAngle(float Angle)
{
	__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1,Angle / 270 * 2000 + 500);
}

有两个地方需要着重注意一下,不管用的是180度,270度,还是360的舵机,他们CCR的范围都是500-2500,在封装的函数里,只需改变angle的除数即可,比如我用的是270度的舵机就/270。

注意:对舵机来说给一个角度是转动“到”该角度对应的位置,而不是从当前位置转动该角度,举个例子,如果程序运行之前舵机就在它45度的位置,这时候给函数的参数是90度,它不是转动90度,而是转动45度。因此如果想把舵机的范围角度充分利用起来,需要在一开始就测量0°和270°在哪个位置,然后舵机固定合适的初始角度,比如中间角度135°,这样可避免之后用舵机组装如机械臂之类的设备时,组装到一半发现一开始的默认固定位置离舵机转动角度的上下限很近,导致舵机无法大角度转动

嵌入式常用动力源之舵机——基于STM32HAL库_第2张图片嵌入式常用动力源之舵机——基于STM32HAL库_第3张图片

你可能感兴趣的:(单片机,嵌入式硬件)