舵機控制
型號:SG90
接線
黃線:信號線
紅線:電源線
棕線:地線
PWM周期
需要通過信號線往舵機輸入PWM波,才能驅(qū)動舵機轉(zhuǎn)動
PWM波的頻率不能太高,大約50HZ,即周期=1/頻率=1/50=0.02s,20ms左右
舵機的控制一般需要一個20ms左右的時基脈沖,該脈沖的高電平部分一般為0.5ms-2.5ms范圍內(nèi)的角度控制脈沖部分,總間隔為2ms。以180度角度伺服為例,那么對應(yīng)的控制關(guān)系是這樣的:
以下是一個周期內(nèi)高電平所占的時間:
0.5ms————0度; 2.5% 對應(yīng)函數(shù)中占空比為250
1.0ms————45度; 5.0% 對應(yīng)函數(shù)中占空比為500
1.5ms————90度; 7.5% 對應(yīng)函數(shù)中占空比為750
2.0ms————135度; 10.0% 對應(yīng)函數(shù)中占空比為1000
2.5ms————180度; 12.5% 對應(yīng)函數(shù)中占空比為1250
定時器可設(shè)置為500us,即0.5ms,通過中斷處理函數(shù)的count++可以得到0.5ms倍數(shù)的周期時間,那么定時20ms = 0.5ms*40,count ==40即一個周期,再通過設(shè)置比較值得到不同的占空比文章來源:http://www.zghlxwxcb.cn/news/detail-638391.html
程序
#include <REGX52.H>
#include "Timer0.h"
sbit Sg90_com = P1^0;
unsigned char compare,count; //compare比較值控制占空比大小,控制舵機轉(zhuǎn)動的角度
void Delay1ms(unsigned int num) //@11.0592MHz
{
unsigned char i, j;
while(num--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void main()
{
Timer0Init();
while(1)
{
compare = 1; //0度
Delay1ms(2000);
compare = 2; //45度
Delay1ms(2000);
compare = 3; //90度
Delay1ms(2000);
compare = 4; //135度
Delay1ms(2000);
compare = 5; //180度
Delay1ms(2000);
}
}
void Timer0_Rountine() interrupt 1 //每次定時器溢出時是0.5ms
{
TL0 = 0x33;
TH0 = 0xFE;
count++;
//PWM控制
if(count < 40) //每一個0.5mscount都會++,加了40次就20ms,是舵機控制的一個周期
{
if(count < compare) //通過比較值控制高電平占據(jù)周期的時間,也就是占空比大小
{
Sg90_com = 1;
}
else
{
Sg90_com = 0;
}
}
else //count加到40后清零
{
count = 0;
Sg90_com = 1;
}
}
注意
定時器的的中斷處理函數(shù)不一定要放到main.c文件中,也可以放到其他的文件,處理函數(shù)要用到變量可以在對應(yīng)文件中聲明,如果該變量要在main函數(shù)中改變的,如PWM控制的compare比較值,可以在main.c文件的開頭聲明該變量,用extern關(guān)鍵字,告訴編譯器compare變量雖然在main.c文件中被改變了,但不是在main.c文件中定義的,該定義在別的文件中,去別的文件找文章來源地址http://www.zghlxwxcb.cn/news/detail-638391.html
extern unsigned char compare;
到了這里,關(guān)于SG90舵機使用介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!