stm32标准库sg90舵机驱动代码
时间: 2025-05-26 08:40:07 浏览: 36
### 使用STM32标准库控制SG90舵机的驱动代码
以下是基于STM32标准库实现SG90舵机控制的一个完整示例。该示例假设使用TIM2定时器通道1来生成PWM信号[^4]。
#### 1. 头文件定义
```c
#include "stm32f10x.h"
#define SERVO_MIN_PULSE_WIDTH 500 // 对应0°,单位us
#define SERVO_MAX_PULSE_WIDTH 2500 // 对应180°,单位us
#define SERVO_PERIOD 20000 // 周期为20ms,单位us
```
#### 2. 定义舵机类初始化函数
```c
void Servo_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 配置GPIO模式为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PA0作为TIM2_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 设置定时器基本参数
TIM_TimeBaseStructure.TIM_Period = (SERVO_PERIOD / 2) - 1; // ARR=周期的一半
TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock / 1000000 - 1; // 分频系数设置为1微秒计数
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 配置捕获比较寄存器
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_Pulse = (SERVO_MIN_PULSE_WIDTH / 2); // 初始占空比对应最小脉宽
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_Cmd(TIM2, ENABLE); // 启动定时器
}
```
#### 3. 实现角度控制功能
```c
void Set_Servo_Angle(uint16_t angle) {
uint16_t pulse_width;
if(angle > 180){
angle = 180;
}
if(angle < 0){
angle = 0;
}
pulse_width = ((angle * (SERVO_MAX_PULSE_WIDTH - SERVO_MIN_PULSE_WIDTH)) / 180) + SERVO_MIN_PULSE_WIDTH;
TIM_SetCompare1(TIM2, pulse_width / 2); // 更新CCR1值
}
```
#### 4. 主循环调用
```c
int main(void) {
Servo_Init();
while(1) {
Set_Servo_Angle(0); // 转向0度
for(volatile int i=0;i<1000000;i++); // 简单延时替代delayMs()
Set_Servo_Angle(90); // 转向90度
for(volatile int i=0;i<1000000;i++);
Set_Servo_Angle(180); // 转向180度
for(volatile int i=0;i<1000000;i++);
}
}
```
以上代码实现了通过STM32标准库控制SG90舵机的功能。其中`Set_Servo_Angle()`函数用于动态调整PWM信号的占空比从而改变舵机的角度[^4]。
---
###
阅读全文
相关推荐


















