SG90舵機驅動簡介
舵機是一種位置(角度)伺服的驅動器,適用于那些需要角度不斷變化并可以保持的控制系統。在攝像頭云臺中,我們使用了兩個SG90舵機。
舵機的工作原理是:控制信號由接收機的通道進入信號調制芯片,獲得直流偏置電壓。它內部有一個基準電路,產生周期為20ms,寬度為1.5ms的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。后,電壓差的正負輸出到電機驅動芯片決定電機的正反轉。當電機轉速一定時,通過級聯減速齒輪帶動電位器旋轉,使得電壓差為0,電機停止轉動。當然我們可以不用去了解它的具體工作原理,知道它的控制原理就夠了。就象我們使用晶體管一樣,知道可以拿它來做開關管或放大管就行了,至于管內的電子具體怎么流動是可以完全不用去考慮的。
舵機的控制一般需要一個20ms左右的時基脈沖,該脈沖的高電平部分一般為0.5ms~2.5ms范圍內的角度控制脈沖部分。以180度角度伺服(SG90)為例,那么對應的控制關系是這樣的:
0.5ms-------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
SG90接線:紅 - 正、棕 - 負、橙 - 信號
STM32CubeMX配置
使用TIM33的通道1、2進行控制。
PWM配置
PWM周期為19.8ms,當設置通道Pulse值在45-225之間時產生的脈沖范圍為0.5ms~2.5ms,而且Pulse寬度剛好為180,方便調值。
源碼
#include "pwm.h"
#include "oled.h"
extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim3;
void Change_Pulse(uint16_t left,uint16_t right)
{
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, left);
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4, right);
uint8_t speed[3]={32,32,'%'};
speed[0]=left/100+'0';
speed[1]=(left%100)/10+'0';
OLED_ShowStr(48,5,speed,2);
speed[0]=right/100+'0';
speed[1]=(right%100)/10+'0';
OLED_ShowStr(80,5,speed,2);
}
void Change_Pulse_Left(uint16_t left)
{
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, left);
uint8_t speed[3]={32,32,'%'};
speed[0]=left/100+'0';
speed[1]=(left%100)/10+'0';
OLED_ShowStr(48,5,speed,2);
}
void Change_Pulse_Right(uint16_t right)
{
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4, right);
uint8_t speed[3]={32,32,'%'};
speed[0]=right/100+'0';
speed[1]=(right%100)/10+'0';
OLED_ShowStr(80,5,speed,2);
}
void Change_Pulse_Rudder1(uint16_t angle)
{
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, angle);
}
void Change_Pulse_Rudder2(uint16_t angle)
{
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, angle);
}