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;

}

}