STM32 SG90舵机应用

本文介绍了舵机的工作原理,对比普通电机,舵机能够精确地旋转到指定角度并停止。文章深入探讨了舵机的位置控制精度,脉冲宽度调制(PWM)控制方法,并通过实测数据展示了舵机角度控制的实现过程。

无意中翻到了一个舵机,想了解一下舵机的使用。
在这里插入图片描述
舵机与普通的电机不同,它可以根据指令旋转到0至180度之间的任意角度然后精准的停下来。

原理是啥我也不知道。

从找的资料看到
“很多舵机的位置等级有1024个,如果舵机的有效角度范围为180度的话,其控制的角度精度是可以达到180/1024度约0.18度了,从时间上看其实要求的脉宽控制精度为2000/1024us约2us。
如果你拿了个舵机,连控制精度为1度都达不到的话,而且还看到舵机在发抖。在这种情况下,只要舵机的电压没有抖动,那抖动的就是你的控制脉冲了。”

橙色信号线 红色正极 棕色负极

舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;

然而我的实测却不一样。

void Servo_Play(void)
{
	TIM_SetCompare2(TIM2, 40);
	delay_ms(500);
	TIM_SetCompare2(TIM2, 75);
	delay_ms(500);
	TIM_SetCompare2(TIM2, 110);
	delay_ms(500);
	TIM_SetCompare2(TIM2, 149);
	delay_ms(500);
	TIM_SetCompare2(TIM2, 199);
	delay_ms(500);
}

周期20ms,代码中的数字单位为10us。

对舵机有了初步的认识,先写下来,以免忘了。

### 控制方法 将STM32控制器与SG90舵机进行连接,并进行必要的硬件和软件配置是实现舵机控制的关键一步。在硬件连接后,软件方面通常使用PWM(脉冲宽度调制)信号来控制SG90舵机的角度。通过调整PWM信号的占空比,可以改变舵机的旋转角度。例如,不同的占空比对应舵机不同的角度位置,如占空比为5/200对应舵机角度为0°,占空比为15/200对应舵机角度为90°,占空比为25/200对应舵机角度为180°[^1][^3]。 ### 代码示例 #### 示例一 ```c #include "stm32f10x.h" #include "pwm.h" #include "delay.h" int main(void) { delay_init();//延时函数初始化 PWMInit(7200,200);//初始化定时器,频率为72mhz/7200/200 = 50hz while(1) { delay_ms(1000);//延迟1s TIM_SetCompare1(TIM2,5);//占空比为5/200,舵机角度为0° delay_ms(1000);//延时1s TIM_SetCompare1(TIM2,15);//占空比为15/200,舵机角度为90° delay_ms(1000);//延时1s TIM_SetCompare1(TIM2,25);//占空比为25/200,舵机角度为180° } } ``` 此代码通过定时器初始化设置PWM频率为50Hz,然后在主循环中通过`TIM_SetCompare1`函数改变PWM的占空比,从而控制舵机在0°、90°、180°之间切换,每次切换间隔1秒[^3]。 #### 示例二 ```c #include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "usart.h" #include "oled.h" #include "timer.h" int i, delay_time = 25; unsigned char j = 50; unsigned char flag = 1; //实现流畅正反转 但是刚开始时舵机位置还会突变 int main(void) { delay_init(); //延时函数初始化 uart_init(115200); //串口初始化为115200 LED_Init(); //初始化与LED连接的硬件接口 OLED_Init(); OLED_ShowString(0,0,"Welcome To STM32",16); //TIM3_Int_Init(1999,7199);//Tout= (arr+1)(psc+1)/TCLK; TIM3_PWM_Init(1999,719);//PWM周期为20ms = (7200*200)/72000000 while(1) { if(flag) TIM_SetCompare2(TIM3, j++); //50 0度 250 180度 else TIM_SetCompare2(TIM3, j--); delay_ms(delay_time); if(j >= 250) { flag = 0; } if(j <= 51) { flag = 1; } printf("%d\r\n",i++); } } ``` 该代码实现了舵机的流畅正反转。通过`TIM3_PWM_Init`初始化PWM周期为20ms,在主循环中根据`flag`标志位控制`j`的值递增或递减,进而改变PWM的占空比,实现舵机在0°到180°之间的正反转,同时会在串口输出计数信息[^4]。 #### 示例三 ```c void Servo_SetDirection(uint8_t direction) { int ccrMs = 2000; uint16_t pulse = 0; switch (direction) { case 0: // 正向最大速度 pulse = 0.75 * ccrMs; // 0.75ms break; case 1: // 停止 pulse = 1.5 * ccrMs; // 1.5ms break; case 2: // 反向最大速度 pulse = 2.25 * ccrMs; // 2.25ms break; default: pulse = backMax * ccrMs; // 默认停止 break; } __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pulse); } ``` 此函数通过`switch`语句根据输入的`direction`参数设置不同的PWM脉冲宽度,从而控制舵机的旋转方向和速度。正向最大速度对应0.75ms的脉冲宽度,停止对应1.5ms的脉冲宽度,反向最大速度对应2.25ms的脉冲宽度,最后使用`__HAL_TIM_SET_COMPARE`函数设置定时器的比较值来输出相应的PWM信号[^5]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值