㈠ 那位大神給段c語言控制舵機從0~180持續來回轉動的程序,不勝感激
180度舵機是一特殊的機器人專用舵機。你所說的0-180度,在專業玩家裡不這樣說的,而是說成±90度。即順時針90度,逆時針90度。
你可以自己寫一個的。這種舵機比陵告較特殊,但是只要滿足尺明明一下PWM就可以實現了:
1. 周期T=20ms(即50HZ),占空比500us-2500us。槐困
2. 500us舵機逆時針轉90度,2500us舵機順時針轉90讀。 (其中0度是1500us)
3. 即: TL+TH=20ms 改變TH的值,舵機角度隨之改變。參數參照以上1.2點。
TL TH
_____ ____
_________| |_________| | _________|
4. 電路原理很簡單,接好電源,地,信號線。
信號線接到單片機或者其他能輸出PWM的控制腳。
㈡ 求一段c語言舵機程序
給段偽代碼吧
intmain()
{
初始化src_angle_A,dst_angle_A;
初始化src_angle_B,dst_angle_B;
初始化src_angle_C,dst_angle_C;
初始化src_angle_D,dst_angle_D;
intA_flag=0;
intB_flag=0;
intCD_flag=0;
while(1)
{
if(key1_down())
{
if(A_flag==0)
{
set_angle_A(dst_angle_A);
}
else
{
set_angle_A(src_angle_A);
}
A_flag=1-A_flag;
}
if(key2_down())
{
if(B_flag==0)
{
set_angle_B(dst_angle_B);
}
else
{
set_angle_B(src_angle_B);
}
B_flag=1-B_flag;
}
if(key3_down())
{
if(CD_flag==0)
{
set_angle_C(dst_angle_C);
set_angle_D(dst_angle_D);
}
else
{
set_angle_C(src_angle_C);
set_angle_D(src_angle_D);
}
CD_flag=1-CD_flag;
}
delay_ms(10);
}
return0;
}
㈢ 單片機C語言控制舵機
如果需要上電就動作笑中液
只需要把程序裡面的if(KEY)判碰物斷語句直接去掉就可以了。
不判斷直接執培帶行動作即可。
㈣ 單片機C語言控制舵機
如果需要上電就動作
只需要把程序裡面的if(KEY)判斷語句直接去掉就可以了。
不判斷直接執行動作即可。
㈤ 51單片機控制舵機轉角的C語言程序
定時器0表示的是脈沖總周期20ms,定時器1表示的是正脈沖寬度(如pwm_value = 1500時表示正脈沖寬度為1.5ms), 而while循序只是為了改變正脈沖寬度。運行過程是:定時器0和定時器,1同時開啟,此時pwm = 1,定時器1的時間到了之後pwm = 0,並關閉定時器1,等待脈沖總周期達到20ms即定時器0中斷,在定時器0的中斷服務中又將pwm賦值為1並開啟定時器1……以這樣的方式循環就可以控制舵機轉動了!
㈥ 如何用51單片機控制舵機的單片機程序是怎麼寫的希望你也能給我發一個編寫程序和電路圖
單片機系統實現對舵機輸出轉角的控制,必須首先完成兩項任務:首先,產生基本的PWM周期信號,即產生20ms的周期信號;其次,調整脈寬,即單片機調節PWM信號的占空比。單片機能使PWM信號的脈沖寬度實現微秒級的變化,從而提高舵機的轉角精度。單片機完成控制演算法,再將PWM信號輸出到舵機。
發一個自己原來寫的簡單的。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar count,jd;
sbit pwm=P1^0;
sbit jia=P3^2;
sbit jian=P3^3;
uchar code table[10] = {0x3f,0x06,0x5b,
0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f};
//延時函數
void delay(uchar x)
{
uchar i,j;
for(i=x;i>0;i--)
for(j=125;j>0;j--);
}
//定時器初始化
void Time0_init()
{
TMOD=0x01; //定時器0工作方式1
IE=0x82;
TH0=0xfe;
TL0=0x33; //11.0592MHZ晶振,0.5ms
TR0=1;
}
//定時器0中斷程序
void Time0() interrupt 1
{
TH0=0xfe;
TL0=0x33;
if(count<jd) //判斷0.5ms次數是否小於角度標識
pwm=1; //是,pwm輸出高電平
else
pwm=0; //否,輸出低電平
count=count+1;
count=count%40; //次數始終保持為40,即保持周期為20ms
}
//按鍵掃描
void keyscan()
{
if(jia==0)
{
delay(10);
if(jia==0)
{
jd++; //角度增加 1
count=0; //按鍵按下則20ms周期重新開始計時
if(jd==6)
jd=5; //已經是180度,保持
while(jia==0);
}
}
if(jian==0)
{
delay(10);
if(jian==0)
{
jd--;
count=0;
if(jd==0)
jd=1; //已經0度,保持
while(jian==0);
}
}
}
//數碼管顯示
void display()
{
uchar ,shi,ge ;
switch(jd)
{
case 1:
=0;
shi=0;
ge=0;
break;
case 2:
=0;
shi=4;
ge=5;
break;
case 3:
=0;
shi=9;
ge=0;
break;
case 4:
=1;
shi=3;
ge=5;
break;
case 5:
=1;
shi=8;
ge=0;
break;
}
P0=table[];
P2=1;
delay(5);
P0=table[shi];
P2=2;
delay(5);
P0=table[ge];
P2=3;
delay(5);
}
void main()
{
//jd=1;
count=0;
Time0_init();
while(1)
{
keyscan();
display();
}
}
電路圖很簡單的,幾個按鍵,再在單片機最小系統上接出一個信號線,再給舵機供上電就可以了。
㈦ 求問單片機控制舵機連續來回轉動而不停下來的C程序怎麼寫
因為舵機中有電位器,輸出1.5ms寬度的脈沖寬度是正90度,所以你可以寫一個for循環,然後引進一個參數,不停地改變0.5ms到2.5ms之間的脈沖寬度就行了。(用延遲函數可以調整速度)希望能幫到你!
㈧ 求高人寫一個用c語言寫一個51單片機輸出PWM控制舵機的程序,舵機參數可以自己定。最好加註釋。高分謝謝啦
用帶PWM輸出的單片機做吧!51單片機只能通過定時器來實現。
想12C2052AD這些單片機就帶PWM輸出的。他的PWM輸出程序:
#include<reg52.h>
sfr CCON =0xD8;
sfr CMOD=0xD9;
sfr CL=0xE9;
sfr CH =0xF9;
sfr CCAP0L=0xEA;
sfr CCAP0H=0xFA;
sfr CCAPM0=0xDA;
sfr CCAPM1=0xDB;
sbit CR =0xDE
void main(void)
{
CMOD = 0X02;//
CL =0X00;//
CH =0X00;//
CCAP0L = 0xc0;//設置初值
CCAP0H= 0xc0;//輸出占型團空比為25%的波形
CCAPM0 = 0x42;//PWM的輸出模式
CR =1 ;啟動PCA定時器
while(1){};
}
上面是輸出PWM的裂汪程序,你把肆租仔PWM輸出端接到你的舵機控制端,再啟動PCA就OK了,改變CCAP0的值就可以改變占空比
㈨ 怎麼用51單片機控制舵機
操作步驟:
1 單片機,舵機,電源共地;
2 用兩個穩壓晶元進行供電,將電源分開來;
3 舵機信號端沒有直接連接單片機IO口,我串了一個10K的電阻,也就是這一步之後就可以控制舵機。
㈩ 急求51單片機控制舵機C語言程序,舵機可以根據設定旋轉任意角度!急求啊,大神幫幫忙!非常感謝!
#include<reg52.h>typedef unsigned int uint;typedef unsigned char uchar;sbit pwm=P0^3;//輸出PWM信號uchar count=0;uint pwm_value=1500;//初值為1.5msuint value[]={1500,1000,1500,2000,1500};//void delay_ms(uint x){uint i;while(x--)for(i=0;i<125;i++);}void InitTimer(void){TMOD=0x11;//開定時器0,1TH0=-20000/256;//定時20MS,20MS為一個周期TL0=-20000%256;TH1=-1500/256;//定時1.5MS,這時舵機處於0度TL1=-1500%256;EA=1;//開總斷TR0=1;//開定時器0ET0=1;TR1=1;//開定時器1ET1=1;}void timer0(void) interrupt 1//定時器0中斷函數{pwm=1;TH0=-20000/256;TL0=-20000%256;TR1=1;count++;}void timer1(void) interrupt 3//定時器1中斷函數{pwm=0;TH1=-pwm_value/256;TL1=-pwm_value%256;TR1=0;}void main(void)//主函數{uchar i;InitTimer();pwm_value=1500;while(1){for(i=0;i<5;i++){pwm_value=value[i];//通過數組就可以改變舵機的轉角度delay_ms(1000);}}}