stm32f103c8t6控制舵机sg90代码
时间: 2025-04-29 22:54:13 浏览: 34
### STM32F103C8T6 控制 SG90 舵机 示例代码
以下是基于 HAL 库的 STM32F103C8T6 控制 SG90 舵机的完整代码示例:
#### 主程序部分
```c
#include "stm32f1xx_hal.h"
TIM_HandleTypeDef htim2;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
while (1)
{
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 50); // 设置舵机角度为 0° 左右位置 [^2]
HAL_Delay(1000);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 100); // 设置舵机角度为中间位置
HAL_Delay(1000);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 200); // 设置舵机角度为 180° 右边位置 [^2]
HAL_Delay(1000);
}
}
// 定义定时器初始化函数
static void MX_TIM2_Init(void)
{
TIM_OC_InitTypeDef sConfigOC;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 79; // 预分频器设置,系统时钟假设为 8MHz,则此值对应 1us 的分辨率
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 20000; // 自动重装载寄存器值,对应 20ms 周期
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim2);
HAL_TIM_PWM_Init(&htim2);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 1500; // 初始脉冲宽度,默认指向中心位置
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); // 启动 PWM 输出
}
```
#### GPIO 初始化部分
```c
static void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_1; // PA1 连接到 SG90 舵机信号输入端
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
```
---
### 关键技术说明
1. **PWM 波形生成**
使用 `TIM2` 定时器生成 PWM 波形。通过调整比较寄存器 (`__HAL_TIM_SET_COMPARE`) 中的数值来改变占空比,从而控制舵机的角度。
2. **定时器配置细节**
- 预分频器 (`Prescaler`) 和自动重载值 (`Period`) 确定了 PWM 的周期为 20ms。
- 占空比范围通常在 1ms 至 2ms 之间变化,分别对应舵机的最小和最大角度[^1]。
3. **多通道同步特性**
如果需要在同一定时器上扩展多个 PWM 输出,需注意所有通道共享同一计数器,因此频率一致,但可以通过独立的 CCR 寄存器调节各通道的占空比[^3]。
---
### 接线图及硬件连接
- 将 STM32 的 `PA1` 引脚连接到 SG90 舵机的信号输入端。
- 舵机电源正极 (+V) 连接至外部稳压电源(建议 5V),负极 (-GND) 与 STM32 地相连。
---
阅读全文
相关推荐


















