SG90舵机模块介绍
标准库代码实现驱动舵机
由上图可知可以通过PWM来实现驱动舵机,这里采用STM32F103C8T6的TIM2的通道4来实现,即该芯片的A3口引脚,如下图所示
配置20ms的时基单元(以PLL时钟频率为72MHz为例),那么就是将TIM2的定时器的周期配置为20ms(50Hz),即设置ARR= 2000 - 1
,PSC = 720 -1
,则定时器的时钟周期就为20ms,并且我在初始位置设置为90°,即起始值设置为150,代码如下:
void TIM2_PWM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 配置定时器周期为20ms(50Hz)
TIM_TimeBaseStructure.TIM_Period = 2000 - 1; // 72MHz / 7200 = 10KHz
TIM_TimeBaseStructure.TIM_Prescaler = 720 - 1; // 10KHz / 720 = 50Hz
TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时钟不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 初始化TIM2
// 配置PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能
TIM_OCInitStructure.TIM_Pulse = 150; // 初始位置1.5ms
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性高
TIM_OC4Init(TIM2, &TIM_OCInitStructure); // 使用通道4
// 使能TIM2
TIM_Cmd(TIM2, ENABLE);
TIM_CtrlPWMOutputs(TIM2, ENABLE); // 主输出使能
}
这里我采用A3口作为舵机的驱动引脚,那么GPIO的配置就应该是以下:
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// Enable GPIOA clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// Configure PA3 as TIM2_CH4 alternate function push-pull output
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
然后可以通过TIM_SetCompare4();
该函数设置捕获/比较寄存器4(CCR4)的值,来动态调整占空比,从而控制每个周期的高电平时间,实现舵机的转向。
即
TIM_SetCompare4(TIM2, 150); //此时占空比为7.5%,高电平时间为1.5ms
计算公式:
$$
高电平时间= \frac{定时器时钟频率}{TIM_Pulse}= \frac{150}{0.1MHz} =1.5ms
$$
$$
占空比=(\frac{TIM_Pulse}{TIM_Period +1})×100%=\frac{150}{2000}×100%=7.5%
$$