8051控制伺服機MG995
******千萬別跟51共VCC!!,除非你51不想要了,要與51共地****
首先要理解伺服機的3條線
黃:PWM訊號(實測Ton=0.5ms~2.2ms每台特性不同要自己試,但範圍不會差太大) 此範例中接8051的P2_0
紅:給伺服機用的電源,因起動電流過大,會讓MCU當機,所以勿共接VCC!
棕:與PWM產生裝置(8051或其他方波產生器)共接地
電路圖
點圖可以放大
再來又是PWM(一天到晚有人問)
請多加利用我寫的PWM程式產生器(在Visual Basic專欄裡,原理不再說了,不會換算HZ=幾秒的一起下載計時器產生器)
重點是主程式,裡面有角度說明,一般人誤以為伺服機只有2個角度或3個角度是錯誤的,可能是拿現成的模組來用,如果將主程式改變Ton的時間,只要是在0~2.2ms範圍內,你就會知道伺服機有多少個角度變化了,我有測了八個角度很OK,不會錯位,跟步進很像。
執行影片
==========原始碼(只做3個角度,要用到其他角度就自己改嚕)========
#include <regx51.h>
unsigned int dutytime=45536; //65536-45536就是責任週期
unsigned int ton=10000; //高電位比例=50%
unsigned int toff=10000; //低電位比例=50%
unsigned int temp; //給計時器工作用
void timer0_initialize(void) //初始化計時器0
{
EA=0; //關閉中斷功能(所有中斷副程式失效)
IE|=0x02; //開啟計時器中斷功能
TMOD|=0x01; //設定計時器模式
temp=65536-dutytime; //設定中斷一次的時間(預設是dutytime)
TH0=temp/256; //填入高八位
TL0=temp%256; //填入低八位
TR0=1; //啟動計時器
EA=1; //開啟中斷功能(中斷副程式可以執行)
}
void timer0_isr(void) interrupt TF0_VECTOR using 1 //使用計時器中斷副程式產生PWM
{
if(P2_0==1)
{
TR0=0;
temp=65536-toff;
TH0=temp/256;
TL0=temp%256;
TR0=1;
P2_0=0;
}
else
{
TR0=0;
temp=65536-ton;
TH0=temp/256;
TL0=temp%256;
TR0=1;
P2_0=1;
}
}
void main(void) //主程式開始
{
timer0_initialize(); //呼叫計時器初始化副程式
//主程式中可直接改變ton或toff即可改變高電位跟低電位佔的比例
while(1)
{
if(P1_0==0)ton=2200; //2.2ms 左轉
if(P1_1==0)ton=1500; //1.5ms 中間
if(P1_2==0)ton=900; //0.9ms 右轉 千萬別以為就3個角度0.5~2.2之間都可調角度
toff=20000-ton;
}
}