如何将STM32F103C6的PB6配置为PWM端口驱动舵机?
STM32F103C6 将PB6配置为PWM输出端口(舵机驱动适配)
核心结论
PB6在STM32F103C6上是TIM4_CH1的复用功能引脚,必须将原代码中的TIM2更换为TIM4来输出PWM。
具体操作步骤
1. 修改GPIO配置
替换原PA0的配置,开启GPIOB时钟并将PB6设为复用推挽输出:
// 开启GPIOB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出,适配PWM复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);
2. 修改定时器基础配置
将原TIM2的配置替换为TIM4(TIM4挂载在APB1总线,时钟开启方式不同):
// 开启TIM4时钟(APB1总线) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 舵机需要50Hz PWM(周期20ms),基于72MHz系统时钟计算参数 // 预分频系数7199,计数周期199 → 72MHz/(7200*200) = 50Hz TIM_TimeBaseStructure.TIM_Prescaler = 7199; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 199; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
3. 修改PWM通道配置
替换原TIM2_CH1的配置为TIM4_CH1:
TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 舵机180度对应脉宽0.5ms-2.5ms,对应计数范围5-25(每计数单位10us) TIM_OCInitStructure.TIM_Pulse = 15; // 初始值对应90度中间位置 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM4, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
4. 启动定时器
替换原TIM2的启动代码为TIM4:
TIM_Cmd(TIM4, ENABLE);
5. 调整舵机角度控制代码
将原控制TIM2_CH1脉宽的代码替换为TIM4_CH1:
// 替换原TIM_SetCompare1(TIM2, value)为以下代码 TIM_SetCompare1(TIM4, value); // value取值范围5-25,对应舵机0-180度(5→0.5ms→0度,25→2.5ms→180度)
关键注意事项
- STM32F103C6的TIM4为16位定时器,完全满足舵机PWM的精度需求
- 必须确保PB6配置为复用推挽输出,普通IO模式无法输出PWM
- 脉宽计算逻辑:预分频后每计数单位为10us,因此脉宽(ms) = value * 0.01ms
内容的提问来源于stack exchange,提问作者Pharaon
相关产品推荐
相关产品推荐

