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的關系

249
45° 499
90° 749
135° 999
180° 1249


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM