stm32F103控制sg90360舵机角度
时间: 2025-03-05 20:12:02 浏览: 37
STM32F103 控制 SG90 360° 舵机角度
对于使用STM32F103微控制器来控制SG90 360°舵机的角度,主要通过配置定时器生成PWM信号实现。具体来说,在智能衣柜系统中,尝试让SG90在0°到180°之间转动以模拟衣柜门的开合动作[^1]。
针对此需求,可以利用TIM3初始化函数设定PWM周期为20ms,这对应于标准伺服电机刷新率50Hz的要求。代码如下所示:
// 初始化PWM周期为20ms
TIM3_PWM_Init(1999,719); // PWM周期为20ms = (7200 * 200) / 72000000
当需要调整舵机位置至特定角度时,则需改变占空比。例如要使舵机转向180度的位置,可以通过修改比较寄存器中的值完成操作:
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,150); // 设置舵机转角为180度
需要注意的是上述例子适用于常规范围内的SG90舵机(即0~180度),而对于支持更广旋转范围如360度连续旋转特性的版本,可能需要额外考虑其工作模式转换以及具体的脉宽映射关系。
下面给出一段完整的C语言程序片段用于演示如何基于STM32CubeMX HAL库驱动SG90 360°舵机并设置不同角度:
#include "main.h"
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); // 设定初始位置
HAL_Delay(1000);
for(int i=50;i<=250;i+=5){ // 循环增加角度
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,i);
HAL_Delay(20);
}
for(int i=250;i>=50;i-=5){ // 循环减少角度
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,i);
HAL_Delay(20);
}
}
}
void Error_Handler(void){}
void MX_TIM2_Init(void){
TIM_OC_InitTypeDef sConfigOC={0};
htim2.Instance=TIM2;
htim2.Init.Prescaler=719;
htim2.Init.CounterMode=TIM_COUNTERMODE_UP;
htim2.Init.Period=1999;
htim2.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE;
if(HAL_TIM_PWM_Init(&htim2)!=HAL_OK){
Error_Handler();
}
sConfigOC.OCMode=TIM_OCMODE_PWM1;
sConfigOC.Pulse=0;
sConfigOC.OCPolarity=TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode=TIM_OCFAST_DISABLE;
if(HAL_TIM_PWM_ConfigChannel(&htim2,&sConfigOC,TIM_CHANNEL_1)!=HAL_OK){
Error_Handler();
}
}
这段代码实现了从最小角度逐渐增大再减小的过程循环执行的效果,其中Pulse
参数决定了实际输出给舵机电压的时间比例从而影响最终达到的角度位置。
相关推荐

















