天天看點

51單片機控制小舵機

以前從沒有想過寫部落格,但是最近發現以前的代碼老是找不到,而且找到了也不一定想得起當時的邏輯,很麻煩,是以打算寫寫提醒一下自己。

最近老闆讓做一個掃描二維碼裝鑰匙的小盒子,就給個小舵機和3D列印機,傳動結構啥的基本搞定了,就差程式了,是以打算先測試一下舵機

說明一下舵機給20ms為周期高電平占0.5到2.5ms的的PWM波就能動,接下來上代碼

#include <reg52.h> 
#include <math.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit PWM_OUT=P2^7; //PWM輸出口
uint PWM_Value; //定義pwm值 
uint flag; //中斷标志
void Delay(unsigned int s); //延時函數聲明
           

用不到延時函數是以就沒寫

void Init_Timer0() // 定時器初始化 
{
	TMOD=0x01;//定時器0 工作模式一,16位計數
	TH0=(65535-10)/256;//應該是每次10us
	TL0=(65535-10)%256;
	EA = 1;
	ET0 = 1;
	TR0 = 1;
	PT0=1;
} 
           

這裡我剛開始的時候寫完程式舵機總是不動,折騰了半個小時沒發現哪裡有錯,是以就翻出了邏輯分析儀測了一下引腳的信号,發現有點問題,計算了一下一次定時中斷有0.4432ms是以把後面主函數的代碼也稍微改了改。因為就用小舵機開關門,精度要求不高是以就不管這些了。我記得以前好像沒遇到過這樣的問題,希望有人指點一下。

void timer0(void) interrupt1 //實測一次中斷0.04432ms
{ 
	TH0=(65535-10)/256; 
	TL0=(65535-10)%256; 
	if (flag>PWM_Value)
	{
		PWM_OUT=0;
	}
	else
	{
		PWM_OUT=1;
	}
	if (flag>451)
	{
		flag=0;
	}
	flag++; 
}
           

主函數簡單點

void main()
{
	PWM_Value = 25; //pwm值為11-56,42時門框打開,25時門框閉合
	Init_Timer0();
	while(1);

}
           

程式比較簡單,打算留着,過些日子閑下來沒事幹再做個4足。