DIY遙控船(一):電調和舵機的驅動[使用STC89C52]

在動力模型中,有兩樣東西是最基本、最必要的,即舵機和無刷電機。舵機提供轉動特定角度的功能,而無刷電機需要由電調--電子調速器驅動。

  1. 舵機
舵機又叫伺服電機,可以按照輸入的指令把舵機臂轉動之後停在在0-180度之間的某一度數。

盜幾張圖說明一下大概的組成結構

關於原理方面,舵機採用一個閉環反饋控制系統來控制其轉向的角度,通過控制電路讀取該電阻值的大小,就能根據阻值適當調整電機的速度和方向,使電機向指定角度旋轉。(關於這個閉環控制系統我現在還不是很瞭解)放一張原理圖在這裏,要是以後可以瞭解清楚其原理再寫自己的理解。

ok,那怎麼來控制舵機的角度呢。
舵機使用大約50hz的pwm波形來控制角度,其中高電平的佔空比從0.5ms到2.5ms有效,其中1.5ms對應着舵機角度的90,0.5ms對應着舵機的0度,而2.5ms對應着舵機的180度。(這些參數對應都是說的普通類型的舵機,還有一些特殊的舵機也許不遵循這個對應關係)
波形是用示波器顯示是這個樣子。測量圖取自天地飛6 接收機的 第3通道,也就是油門通道(油門通道和舵機通道還略有不同後面說)

測量模式看是這個樣子

頻率大概能夠滿足50hz即可

2.電調
好,現在說說電調,同樣,電調也使用50hz的pwm,脈衝寬度調製波進行控制,和舵機不同的是,波形的佔空比對應的是電調輸出的油門百分比。
而且一個關鍵的對應關係是,正頻寬1.0ms時,對應的油門值是0% ,到2.5ms時對應100%,和舵機的中點90度對應的正頻寬並不是同一個值
上面那張圖顯示的正是 天地飛6接收機的油門通道爲0%時候的波形,即正頻寬是1.0ms。
電調的控制和舵機的區別就在這裏!這個很關鍵,去年我想用arduino裏面的servo 函數來控制電調,一直都不成功,就是因爲不知道這個關鍵的特性。

下面上代碼 ,代碼使用keil4,89c52實現4路pwm分別控制電調和舵機,其中P2^3控制電調,其他控制舵機(哪個引腳控制哪個東西可以通過修改程序來修改)
//2015年新版本,改爲11.0592的晶振
//GYZ

#include <reg52.h>


unsigned int percent = 0;//控制50HZ的關鍵變量
unsigned int pwm_value_1;
unsigned int pwm_value_2;
unsigned int pwm_value_3;
unsigned int pwm_value_4;

 


//引腳位定義
sbit pwm1 = P2^0;
sbit pwm2 = P2^1;
sbit pwm3 = P2^2;
sbit pwm4 = P2^3;




void initialTimer0()
{
	TH0 = (65536-66)/256;
	TL0 = (65536-66)%256;
}//定時器裝初值

void initial()
{
	EA=1;//打開總中斷
	ET0 =1;//開中斷1
	TMOD = 0x01; //T0工作,採用方式1,16位定時器
	initialTimer0();
	TR0 = 1;//開啓T0定時器
	P2=0x00;//P2置低電平
	//4路PWM初始值設定,3號爲油門通道其它爲舵機通道
	percent = 0;
	pwm_value_1 = 14;
	pwm_value_2 = 14;
	pwm_value_3 = 9;
	pwm_value_4 = 14;
}//啓動初始化函數

void Timer0() interrupt 1 using 0
{
	percent +=1;
	//每次中斷加1
	if(percent == 198)//到此數值是20ms,50hz的週期
	{
		pwm1 = 1;//PWM引腳統一置高電平
		pwm2 = 1;
		pwm3 = 1;
		pwm4 = 1;
		percent = 0;
	}
	//以下4路是PWM的正頻寬到期時置低電平
	if(percent == pwm_value_1)
	{
		pwm1 = 0;
	}
	if(percent == pwm_value_2)
	{
		pwm2 = 0;
	}
	if(percent == pwm_value_3)
	{
		pwm3 = 0;
	}
	if(percent == pwm_value_4)
	{
		pwm4 = 0;
	}
	initialTimer0();//重新裝初值
}
void delay(unsigned int x)
{
	unsigned i,j;
	for (i = x; i >= 0; --i) {
		for (j = 120; j >= 0; --j) {
			;
		}
	}
}
void main()
{
	initial();
	while(1)
	{//insert you code here...
		;
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章