stm32pwm控制舵机寄存器版
时间: 2025-05-08 17:22:00 浏览: 36
### STM32通过PWM使用寄存器控制舵机
在STM32微控制器中,可以通过配置定时器模块的寄存器来生成PWM信号并用于控制舵机。以下是一个基于STM32F1系列芯片的示例代码,展示如何利用寄存器直接设置PWM输出以控制舵机。
#### 配置GPIO端口
首先需要初始化GPIO引脚作为复用功能推挽输出模式。这一步是为了让指定的GPIO引脚能够连接到定时器通道上:
```c
// 初始化 GPIOA 的第9针 (PA9),将其配置为 TIM1_CH1 复用功能
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // 启用 GPIOA 时钟
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // 启用 AFIO 时钟
GPIOA->CRL &= ~(0xF << 4*9); // 清除 PA9 的低四位
GPIOA->CRL |= (0xB << 4*9); // 设置 PA9 为复用推挽输出模式
```
#### 定时器TIM1的初始化
接下来是对定时器TIM1进行初始化,使其工作于PWM模式下。这里假设我们希望频率为50Hz(典型舵机刷新率),占空比可调范围从5%至10%,对应脉宽约为1ms到2ms之间[^2]。
```c
// 配置 TIM1 时基单元
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // 开启 TIM1 时钟
TIM1->PSC = 72 - 1; // 设定预分频系数, 假设系统时钟为72MHz,则此值使得计数器每秒增加一次
TIM1->ARR = 20000 - 1; // 自动重装载寄存器设定周期数值(即 PWM 总周期)
// 配置 TIM1 CH1 输出比较模式
TIM1->CCR1 = 1500; // 初始 CCR1 值决定初始占空比
TIM1->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2;// 设置 OC1 模式为 PWM Mode 1
TIM1->CCER |= TIM_CCER_CC1E; // 使能 CC1 输出
TIM1->CNT = 0; // 计数器清零
TIM1->BDTR |= TIM_BDTR_MOE; // 主输出使能
TIM1->CR1 |= TIM_CR1_CEN; // 启动计数器
```
上述代码片段展示了如何通过修改寄存器的方式,在不依赖HAL库的情况下完成基本的PWM信号生成过程。其中`TIM1->CCR1`决定了具体的占空比大小,从而影响最终施加给舵机的实际角度位置[^1]。
#### 动态调整舵机角度
为了改变舵机转动的角度,只需更新对应的捕获/比较寄存器即可。例如要将舵机转向某个新的目标角位移处,可以重新计算相应的有效高电平时间长度,并写回到该通道关联的CCRx寄存器里去:
```c
void setServoPosition(uint16_t pulseWidth){
uint16_t dutyCycle = pulseWidth * ((float)(TIM1->ARR + 1)/20000);
TIM1->CCR1 = dutyCycle;
}
```
以上函数接受一个参数 `pulseWidth` 表示期望产生的正向脉冲宽度(单位us)。它会依据当前所使用的总周期值自动转换成合适的占空比例再赋值回去。
---
阅读全文
相关推荐












