stm32f103c8t6最小系统板四路舵机
时间: 2024-12-26 18:26:48 浏览: 54
STM32F103C8T6最小系统板控制四路舵机
一、硬件准备
为了实现STM32F103C8T6最小系统板对四个舵机的控制,需准备好如下材料:
- STM32F103C8T6最小系统板
- ST-LINK V2下载器用于程序烧录[^2]
- CH340模块(如果需要通过USB接口与电脑通信)
- SG90型号或其他兼容PWM信号输入的小型舵机×4
- 杜邦线若干根连接各部件间线路
- 可选:专用舵机驱动板简化连线过程并提高稳定性
二、软件环境搭建
确保安装好必要的开发工具链,包括但不限于Keil MDK或IAR Embedded Workbench IDE以及对应的编译器版本。
三、初始化配置
在编写具体的应用逻辑之前,先完成基本外设功能设置。对于本案例而言,主要涉及TIM定时器来生成精确周期性的PWM波形作为伺服电机转动角度指令依据;GPIO端口则用来指定实际物理引脚映射关系以便于后续操作这些设备。
#include "stm32f1xx_hal.h"
// 定义使用的定时器通道和对应IO口
#define SERVO_TIM TIM2
#define SERVO_CHANNEL_1 GPIO_PIN_0, GPIOA
#define SERVO_CHANNEL_2 GPIO_PIN_1, GPIOA
#define SERVO_CHANNEL_3 GPIO_PIN_2, GPIOA
#define SERVO_CHANNEL_4 GPIO_PIN_3, GPIOA
void MX_GPIO_Init(void);
void MX_TIM2_Init(void);
int main(void){
HAL_Init();
MX_GPIO_Init(); // 初始化GPIO
MX_TIM2_Init(); // 配置定时器
while (1){
// 主循环体可以留空,因为PWM输出由定时器自动处理
}
}
四、PWM信号产生机制说明
利用高级定时计数器(TIMx)配合特定模式下的捕获/比较单元(CCRy),能够轻松构建起满足需求特性的脉宽调制(PWM)输出路径。这里采用向上计数方式,并设定预分频系数使得载波频率处于合理范围内(通常建议保持在50Hz左右)[^1]。
static void Servo_Config(uint16_t channel, uint32_t tim_base_freq, float angle_degrees){
__HAL_RCC_TIM2_CLK_ENABLE();
TIM_HandleTypeDef htim;
/* Timer configuration */
htim.Instance = SERVO_TIM;
htim.Init.Prescaler = SystemCoreClock / tim_base_freq - 1; // 设置预分频值达到期望的基础频率
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
htim.Init.Period = 20000 - 1; // 周期为20ms即50Hz刷新率
htim.Init.ClockDivision= TIM_CLOCKDIVISION_DIV1;
if(HAL_TIM_PWM_Init(&htim)!= HAL_OK){
Error_Handler(__FILE__, __LINE__);
}
/* Channel Configuration */
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = CalculatePulseWidth(angle_degrees); // 计算占空比宽度转换成CCR寄存器数值
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
switch(channel){
case 1:
HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1);
break;
case 2:
HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_2);
break;
case 3:
HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_3);
break;
case 4:
HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_4);
break;
default:
break;
}
}
uint32_t CalculatePulseWidth(float degree){
const int min_pulse_width_us = 544 ; // 对应0度位置处最短有效高电平持续时间(us)
const int max_pulse_width_us = 2400; // 对应180度最大极限情况(ms)
return ((degree * (max_pulse_width_us - min_pulse_width_us)) / 180 + min_pulse_width_us)*SystemCoreClock/(1e6*20000)+1;
}
上述代码片段展示了如何基于STM32CubeMX自动生成框架之上进一步定制化服务函数以适应多路独立可控PWM输出场景的需求。其中CalculatePulseWidth()
负责将给定的角度参数转化为适用于当前平台特性下具体的CCR寄存器写入值。
五、应用实例分析
假设现在要让这四个舵机分别指向不同方向,则可以在主函数内部调用预先定义好的辅助方法传递相应的目标方位角信息即可达成目的。
int main(void){
...
// 设定各个舵机初始状态
Servo_Config(SERVO_CHANNEL_1, 50, 0); // 舵机1转到0°
Servo_Config(SERVO_CHANNEL_2, 50, 90); // 舵机2转到90°
Servo_Config(SERVO_CHANNEL_3, 50, 45); // 舵机3转到45°
Servo_Config(SERVO_CHANNEL_4, 50, 135); // 舵机4转到135°
while (1){
// 用户可以根据实际情况调整此处逻辑使能动态改变舵机姿态等功能扩展
}
}
相关推荐


















