STM32F1系列驱动SG90舵机模块


SG90舵机模块介绍

标准库代码实现驱动舵机

由上图可知可以通过PWM来实现驱动舵机,这里采用STM32F103C8T6的TIM2的通道4来实现,即该芯片的A3口引脚,如下图所示

配置20ms的时基单元(以PLL时钟频率为72MHz为例),那么就是将TIM2的定时器的周期配置为20ms(50Hz),即设置ARR= 2000 - 1PSC = 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%
$$


文章作者: LsWorld
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 LsWorld !
评论
  目录