STM32--SG-90舵机模块

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

 长这样

接线:

pwm:橙色

VCC:红色
GND:棕色

使用过程大致是这样的:利用定时器PWM设定出50HZ的输出,即20ms为一个计数周期,然后通过控制占空比来调整舵机的旋转角度,(占空比为高电平占一个周期的时间比)

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 }

猜你喜欢

转载自www.cnblogs.com/yasina/p/12439035.html