stm32f103ze舵机sg90例程
时间: 2024-12-28 11:22:22 浏览: 12
### STM32F103ZE 控制 SG90 舵机 示例代码
为了实现STM32F103ZE对SG90舵机的有效控制,可以采用定时器PWM功能来发送特定频率和占空比的脉冲信号。下面提供一段完整的C语言示例代码用于配置并驱动SG90舵机。
#### 初始化定时器以生成PWM波形
```c
#include "stm32f1xx_hal.h"
// 定义使用的GPIO端口和引脚
#define SERVO_GPIO_PORT GPIOA
#define SERVO_PIN GPIO_PIN_0
#define TIMx_TIM PWM_TIMER_INSTANCE // 替换成实际使用的定时器实例
void Servo_Init(void){
__HAL_RCC_TIMx_CLK_ENABLE(); // 开启定时器时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 配置PA0作为AF推挽输出
GPIO_InitStruct.Pin = SERVO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(SERVO_GPIO_PORT, &GPIO_InitStruct);
TIM_HandleTypeDef htim;
// 设置定时器参数
htim.Instance = TIMx_TIM;
htim.Init.Prescaler = 79; // APB1=72MHz/80=900kHz -> 1us计数周期
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
htim.Init.Period = 20000 - 1; // 周期设为20ms (即50Hz), 减一是因为计数值是从0开始算起
htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if(HAL_TIM_PWM_Init(&htim) != HAL_OK){
Error_Handler();
}
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; // 使用低电平有效
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
if(HAL_TIM_PWM_ConfigChannel(&htim,&sConfigOC,TIM_CHANNEL_1)!= HAL_OK){
Error_Handler();
}
}
```
这段初始化函数设置了定时器的工作方式以及PWM通道的相关属性[^3]。通过调整`Prescaler`和`Period`值可改变PWM载波频率及时基单位;而设置不同的`OCPolarity`则决定了PWM高低电平表示的意义,在这里选择了低电平时触发舵机动作更为直观易懂。
#### 发送指定角度对应的PWM信号
```c
void SetServoAngle(float angle){
uint16_t pulse_width_us;
float min_pulse = 544; // 对应于0度的角度范围内的最小脉宽(微秒)
float max_pulse = 2400; // 对应于180度的最大脉宽(微秒)
if(angle<0 || angle>180){return;} // 角度过界保护
pulse_width_us=(uint16_t)((angle*(max_pulse-min_pulse)/180)+min_pulse);
__HAL_TIM_SET_COMPARE(TIMx_TIM,TIM_CHANNEL_1,pulse_width_us);
}
```
此部分实现了根据输入的角度计算相应的PWM脉冲宽度,并将其应用到之前定义好的PWM通道上。对于SG90来说,默认情况下其接受的标准脉冲宽度大约是在0.5毫秒至2.5毫秒之间变化,对应着从0°到180°的不同位置[^2]。
以上两段代码结合起来就可以完成基本的STM32F103ZE对SG90舵机的控制逻辑了。需要注意的是具体硬件连接还需要按照实际情况进行适配,比如确认所选IO口是否正确分配给了定时器资源等细节问题。
阅读全文