STM32--SG-90舵机模块
SG-90舵机属于模拟舵机 模拟舵机与数字舵机的区别在于,模拟舵机需要持续不断地用PWM信号驱动,(由于没玩过数字舵机,可能存在错误)

长这样
接线:
pwm:橙色
VCC:红色(4.8-6v)
GND:棕色
工作原理:内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号(高电平T0=1.5ms),将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。例如输入PWM周期也为20ms,高电平T2=2ms(一般在0.5ms~2.5ms之间),则有
2-1.5=▲T=0.5ms 这个▲T=0.5ms的时间决定了舵机的旋转角度和正反转。有如下关系(需验证)
| T2 | 角度 |
| 0.5ms | 0 |
| 1.0ms | 45 |
| 1.5ms | 90 |
| 2.0ms | 135 |
| 2.5ms | 180 |

需要注意的是舵机的旋转速度一般为0.22/60度或0.18/60度(即如果让它从0°到180°,则必须给它足够长的时间完成旋转)
使用过程大致是这样的:利用定时器PWM设定出50HZ的输出,即20ms为一个计数周期,然后通过控制占空比来调整舵机的旋转角度,(占空比为高电平占一个周期的时间比)
还有一种控制思路为中断。如在一个20ms的周期内,前2ms输出高电平,且2ms后产生中断,变成输出18ms的低电平,然后再中断,输出高电平。也可以完成类似于PWM的控制
本文为PWM控制方法
PWM的初始化
1 void PWM_Init(u16 arr,u16 psc)
2 {
3 //定义初始化结构体
4 GPIO_InitTypeDef GPIO_InitStructure;
5 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
6 TIM_OCInitTypeDef TIM_OCInitStructure;
7
8
9 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
10
11 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
12
13 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM5 PA0
14 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
15 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
16 GPIO_Init(GPIOA, &GPIO_InitStructure);
17
18 TIM_TimeBaseStructure.TIM_Period = arr;
19 TIM_TimeBaseStructure.TIM_Prescaler =psc;
20 TIM_TimeBaseStructure.TIM_ClockDivision = 0;
21 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
22 TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
23
24 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
25
26 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
27 TIM_OCInitStructure.TIM_Pulse = 0;
28 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
29 TIM_OC1Init(TIM5, &TIM_OCInitStructure);
30
31 TIM_CtrlPWMOutputs(TIM5,ENABLE);
32
33 TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);
34 TIM_OC2Init(TIM5, &TIM_OCInitStructure);
35
36
37 TIM_ARRPreloadConfig(TIM5, ENABLE);
38 TIM_Cmd(TIM5, ENABLE);
39
40 }
通过独立函数设定占空比
TIM_SetCompare1(TIM5,angle);
main
1 int main(void)
2 {
3 delay_init();
4 PWM_Init(9999,143);//不分频。PWM频率=72*10^6/(9999+1)/(143+1)=50Hz 即 20ms一个周期
5 SG90_Init(0);
6 delay_ms(1500);
7 while(1)
8 {
9 SG90_Init(180);
10 delay_ms(1500);
11 SG90_Init(0);
12 delay_ms(1500);
13 SG90_Init(120);
14 delay_ms(1500);
15 SG90_Init(60);
16 delay_ms(1500);
17 SG90_Init(90);
18 delay_ms(1500);
19
20 }
21 }
1 void SG90_Init(float angle)
2 { angle=(u16)(50.0*angle/9.0+249.0);
3 TIM_SetCompare1(TIM5,angle);
4 }
比如想调整为c=90°,则要输出t1=1.5ms的高电平,pwm设定为从0计数到9999为t2=20ms(向上计数)
则容易得出(9999+1)*(t1/20)=750,即从0计数到749用1.5ms,由此得出角度和CRRX的关系
| 0° | 249 |
| 45° | 499 |
| 90° | 749 |
| 135° | 999 |
| 180° | 1249 |

浙公网安备 33010602011771号