Ⅰ 一般控制舵機用什麼單片機比較好了!
51、52都可也,
舵機電源與單片機電源用一個穩壓源,
單片機輸出的控制信號直接接舵機控制線都可以,如果無法驅動,加上一個上拉電阻就可驅動。
Ⅱ 單片機怎麼控制舵機
給個思路吧!
一個按鍵掃描函數
掃描到按鍵1按下
調用正轉函數
延時等待舵機轉完
掃描到按鍵2按下
調用反轉函數
延時等待舵機轉完
正轉:
某腳延時2ms高電平,然後延時18ms低電平
反轉:
某腳延時1ms高電平,然後延時19ms低電平
有些舵機電平范圍可能大於1--2ms
適當調整就可以轉180°了
舵機控制周期一般都是20ms
Ⅲ 單片機控制舵機程序
//12MHz
#include <reg51.h>
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x0B1;
TL0 = 0x0E0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void delay(void) //誤差 0us 延時1ms 此處可以修改高電平周期
//修改此處的延時可以更改舵機轉的角度 ,45度具體是多少 你可以試試
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void main(void)
{
InitTimer0();
P1_2=0;
while(1);
}
void Timer0Interrupt(void) interrupt 1
{
//20ms中斷
TH0 = 0x0B1;
TL0 = 0x0E0;
P1_2=1;
delay();
P1_2=0;
}
Ⅳ 單片機控制數字舵機
舵機是閉環反饋的可編程電機,需要20ms的方波,要求方波精度非常的高,你用延時控制方波肯定是相當不準的,再者要求輸出的是20ms的方波,然後調整方波的占空比來調節舵機的轉動角度,你這可不是20ms是40ms,也沒辦法調節啊。你舵機會顫抖說明波形不穩定,有示波器可以用示波器看下你輸出的波形,個人意見使用定時器中斷控制方波,很精確。
Ⅳ 怎麼用51單片機控制舵機
操作步驟:
1 單片機,舵機,電源共地;
2 用兩個穩壓晶元進行供電,將電源分開來;
3 舵機信號端沒有直接連接單片機IO口,我串了一個10K的電阻,也就是這一步之後就可以控制舵機。
Ⅵ 使用51單片機驅動舵機
先別著急調試程序,先用5v電源試試舵機的電機(假如是5V工作的)轉不轉,如果轉,那就用示波器觀察一下各引腳是否有波形輸出,再就是你驅動電機的電路是否損壞,比如三極體壞了等等。
Ⅶ 我想問一下,如何給舵機單獨供電。我是這么認為的,單片機只能提供3.3和5v的電壓,要提供更高的電壓
給舵機單獨供電,不但能提高電壓,增大電流,以提供大的驅動功率,而且能改善單片機體統供電質量,提高抗干擾能力,是一比較優化的供電方案。
要提供更高的電壓給舵機單獨供電,要把舵機的vcc端用線引出來,接到電源上,同時將兩電源的地線連接到一起。需要注意的是,單獨供電的電源電壓要保證舵機電路安全,單片機驅動部分,如果需要還要進行電平轉換。
舵機,又稱伺服馬達,是一種具有閉環控制系統的機電結構。舵機主要是由外 殼、電路板、無核心馬達、齒輪與位置檢測器所構成。其工作原理是由控制器發出PWM(脈沖寬度調制)信號給舵機,經電路板上的IC處理後計算出轉動方向, 再驅動無核心馬達轉動,透過減速齒輪將動力傳至擺臂,同時由位置檢測器(電位器)返回位置信號,判斷是否已經到達設定位置,一般舵機只能旋轉180度。舵機有3根線,棕色為地,紅色為電源正,橙色為信號線,但不同牌子的舵機,線的顏色可能不同,需要注意。
舵機的轉動位置是靠控制PWM(脈沖寬度調制)信號的占空比來實現的,標准PWM(脈沖寬度調制)信號的周期固定為20ms,占空比0.5~2.5ms 的正脈沖寬度和舵機的轉角-90°~90°(即0~180度)相對應。注意,由於舵機牌子不同,其控制器解析出的脈沖寬度也不同,所以對於同一信號,不同牌子的舵機旋轉的角度也不同。其原理是:它內部有一個基準電路,產生周期為20ms,寬度為1.5ms的基準信號, 控制信號由接收機的通道進入信號調制晶元,獲得直流偏置電壓。將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最後,電壓差的正負輸出到電機驅動晶元決定電機的正反轉。當電機轉速一定時,通過級聯減速齒輪帶動電位器旋轉,使得電壓差為0,電機停止轉動。
Ⅷ 單片機STC89C52 如何控制舵機
#include<reg52.h> //51單片機頭文件
#define uint unsigned int //宏定義
#define uchar unsigned char //宏定義
void delay(uint); //延時子函數聲明
void enable1(void);
void enable2(void);
sbit P1_0=P1^0; //PWM信號輸出端
sbit K1=P1^1;
sbit K2=P1^2;
sbit K3=P1^3;
/****************************主函數***********************************/
void main()
{
P1_0=1; //置PWM初始輸出為高電平
while(1)
{
if(K1==0)
{
delay(20);
if(K1==0)
{
while(!K1);
enable1();
//while(!s2)
}
}
if(K2==0)
{
delay(20);
if(K2==0)
{
while(!K2);
enable2();
}
}
/* if(K3==0)
{
delay(20);
if(K3==0)
{
Init3;
}
}
*/
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void enable1(void)
{
TMOD=0x01; //設置定時器0工作方式1後面運行TR位啟動
TH0=(65536-1500)/256;
TL0=(65536-1500)%256; //1.5ms 的高電平
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0
}
void enable2(void)
{
TMOD=0x10; //設置定時器1工作方式1後面運行TR位啟動
TH1=(65536-900)/256;
TL1=(65536-900)%256; //1.5ms 的高電平
EA=1; //開總中斷
ET1=1; //開定時器1中斷
TR1=1; //啟動定時器1
}
//設置第三種PWM方式的初始化
/*
void Init3()
{
TMOD=0x01; //設置定時器0工作方式1後面運行TR位啟動
TH0=(65536-1500)/256;
TL0=(65536-1500)%256; //1.5ms 的高電平
}
*/
/******************************中斷服務程序**********************************/
void PWM1() interrupt 1 //定時器0 中斷,產生方波
{
if(P1_0==1) //如果上個電平為1,則下個低電平的時間為18.5ms
{
TH0=(65536-18500)/256;
TL0=(65536-18500)%256;
}
else //如果上個電平為0,則下個高電平為1.5ms
{
TH0=(65535-1500)/256;
TL0=(65535-1500)%256;
}
P1_0=~P1_0;
}
void PWM2() interrupt 3 //定時器1中斷,產生方波
{
if(P1_0==1) //如果上個電平為1,則下個低電平的時間為18.5ms
{
TH0=(65536-19000)/256;
TL0=(65536-19000)%256;
}
else //如果上個電平為0,則下個高電平為1.5ms
{
TH0=(65535-900)/256;
TL0=(65535-900)%256;
}
P1_0=~P1_0;
}
//定時器2設置第三種PWM波
/* void PWM3() interrupt 5 //定時器2 中斷,產生方波
{
if(P1_0==1) //如果上個電平為1,則下個低電平的時間為18.5ms
{
TH0=(65536-18500)/256;
TL0=(65536-18500)%256;
}
else //如果上個電平為0,則下個高電平為1.5ms
{
TH0=(65535-1500)/256;
TL0=(65535-1500)%256;
}
P1_0=~P1_0;
}
*/
辛苦之作,如果能夠回答你的問題,別忘了給分哦~~喵喵