參考單片機——SG90舵機工作原理_掏一淘哆啦A夢的奇妙口袋的博客-CSDN博客??????
這位博主做的代碼,在此基礎上進行簡單修改成可以用51單片機的定時器和中斷實現(xiàn)SG90舵機任意角度轉動
完整代碼如下:
#include <REGX52.H>
sbit PWM=P0^0; //對應舵機的PWM引腳,自己修改
int count=0; //全局變量count用于定時器計數(shù)
int c=0; //這個值為高低電平的臨界值,可以改變,
//這里初始化為0表示開始讓舵機復位到0度位置(輸出0.5ms的高電平)
int th;
int tl;
int co;
void angle_Init(int angle) //這里定義一個函數(shù),根據(jù)不同角度進行定時器初值的修改
{
th=(65536-(11.0592/12)*(500+angle/0.09));
tl=(65536-(11.0592/12)*(500+angle/0.09));
co=((20000*11.0592/12)/(500+angle/0.09));
}
void Timer_Init()
{
TMOD=0X01;
TH0=th/256;
TL0=tl%256;
ET0=1;
TR0=1;
EA=1;
}
void main()
{
angle_Init(0);
Timer_Init();
while(1);
}
void Timer() interrupt 1
{
TH0=th/256;
TL0=tl%256;
if(count<=c)
{
PWM=1;
}
else
{
PWM=0;
}
count++;
if(count>=co)
{
count=0;
}
}
?這里對主要的內(nèi)容進行解釋。
th=(65536-(11.0592/12)*(500+angle/0.09));
tl=(65536-(11.0592/12)*(500+angle/0.09));
根據(jù)51單片機定時器計數(shù)初值的計算方法,這里采用模式1,最大計數(shù)為2^16,晶振為11.0592MHz,所以計數(shù)初值為
,
注意這里計時時間單位應該為us。按照所參考的SG90舵機的資料,我們可以得到高電平時間和轉角之間的關系
代入上式即可。
co=((20000*11.0592/12)/(500+angle/0.09));
?這里主要是考慮一個周期20ms時要清零進行下一周期。主要就是根據(jù)count參數(shù),當count大于co時進行清零。所以co的計算就是在20ms內(nèi)count++了幾次。20ms共需要計數(shù)20000*11.0592/12次,除以一次定時計數(shù)次數(shù)(500+angle/0.09)。文章來源:http://www.zghlxwxcb.cn/news/detail-596911.html
本文章是在自己學習51單片機時總結的,由于需要控制舵機旋轉任意角度,網(wǎng)上也找不到相關內(nèi)容,所以自己摸索出來,本人知識水平有限,難免出現(xiàn)錯誤,歡迎指出。文章來源地址http://www.zghlxwxcb.cn/news/detail-596911.html
到了這里,關于51單片機實現(xiàn)SG90舵機任意角度轉動的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!