Robofun 機器人論壇
標題:
[求助]8051控制6足機器人,pwm問題
[打印本頁]
作者:
john800422
時間:
2010-11-30 23:48
標題:
[求助]8051控制6足機器人,pwm問題
最近在製作6足機器人
結構做好了
但程式有很大的問題 > <
目前我只會控制8個馬達(可以分別控制的)
我寫的程式碼在下面
請問一下
要如何修改
才能分別控制18顆馬達
可能只用一個8051寫出來嗎??
//==========================================//硬體資料
8051:MPC82G516
石英震盪器:24MHZ
//==========================================//
//==========================================//檔案庫讀取
#include<reg_mpc82g516.h>
//==========================================//
//==========================================//變數設定
#define DutyC 40000 //20ms
#define Max 5000 //2.5ms
#define Med 3000 //1.5ms
#define Min 1000 //0.5ms
#define Vel 3 //轉動速度
//==========================================//
//==========================================//全域變數設定
unsigned int K,M,M1,M2,M3,M4,M5,M6,M7,M8;
//==========================================//
//==========================================//副程式宣告
void Delay_1ms(unsigned int T);
void Initial(void);
void Contral(void);
void Servo1(void);
void Servo2(void);
void Servo3(void);
void Servo4(void);
void Servo5(void);
void Servo6(void);
void Servo7(void);
void Servo8(void);
//==========================================//
//==========================================//主程式
void main(void)
{
Initial();
while(1){
Contral();
}
}
//==========================================//
//==========================================//控制副程式
void Contral(void)
{
switch(K){
case 1:
Servo1();
if(P22==0&&K==1){
K++;
}
break;
case 2:
Servo2();
if(P22==0&&K==2){
K++;
}
break;
case 3:
Servo3();
if(P22==0&&K==3){
K++;
}
break;
case 4:
Servo4();
if(P22==0&&K==4){
K++;
}
break;
case 5:
Servo5();
if(P22==0&&K==5){
K++;
}
break;
case 6:
Servo6();
if(P22==0&&K==6){
K++;
}
break;
case 7:
Servo7();
if(P22==0&&K==7){
K++;
}
break;
case 8:
Servo8();
if(P22==0&&K==8){
K=1;
}
break;
}
}
//==========================================//
//==========================================//計時中斷Timer1副程式
void Timer1() interrupt 3
{
switch(M){
case 1:
TR1=0; //計時器關閉
TH1=(65536-M1)/256; //設定時間
TL1=(65536-M1)%256; //設定時間
TR1=1; //計時器開啟
P30=1;
break;
case 2:
TR1=0;
TH1=(65536-M2)/256;
TL1=(65536-M2)%256;
TR1=1;
P30=0;
P31=1;
break;
case 3:
TR1=0;
TH1=(65536-M3)/256;
TL1=(65536-M3)%256;
TR1=1;
P31=0;
P32=1;
break;
case 4:
TR1=0;
TH1=(65536-M4)/256;
TL1=(65536-M4)%256;
TR1=1;
P32=0;
P33=1;
break;
case 5:
TR1=0;
TH1=(65536-M5)/256;
TL1=(65536-M5)%256;
TR1=1;
P33=0;
P34=1;
break;
case 6:
TR1=0;
TH1=(65536-M6)/256;
TL1=(65536-M6)%256;
TR1=1;
P34=0;
P35=1;
break;
case 7:
TR1=0;
TH1=(65536-M7)/256;
TL1=(65536-M7)%256;
TR1=1;
P35=0;
P36=1;
break;
case 8:
TR1=0;
TH1=(65536-M8)/256;
TL1=(65536-M8)%256;
TR1=1;
P36=0;
P37=1;
break;
case 9:
TR1=0;
TH1=(65536-(DutyC-(M1+M2+M3+M4+M5+M6+M7+M8)))/256; //把剩餘時間DELAY掉
TL1=(65536-(DutyC-(M1+M2+M3+M4+M5+M6+M7+M8)))%256; //把剩餘時間DELAY掉
TR1=1;
P37=0;
M=0;
break;
}
M++;
}
//==========================================//
//==========================================//初始值副程式
void Initial(void)
{
IE=0x88;
TMOD=0x10;
TH1=(65536-DutyC)/256;
TL1=(65536-DutyC)%256;
TR1=1;
M=1;
M1=Med;
M2=Med;
M3=Med;
M4=Med;
M5=Med;
M6=Med;
M7=Med;
M8=Med;
P3=0x00;
}
//==========================================//
//==========================================//Delay副程式
void Delay_1ms(unsigned int T)
{
unsigned i,j;
for(i=0;i<T;i++)
for(j=0;j<2000;j++);
}
//==========================================//
//==========================================//Servo1副程式
void Servo1(void){
while(M1<=Max&&P20==0){
M1+=Vel;
Delay_1ms(1);
}
while(M1>=Min&&P21==0){
M1-=Vel;
Delay_1ms(1);
}
}
//==========================================//
//==========================================//Servo2副程式
void Servo2(void){
while(M2<=Max&&P20==0){
M2+=Vel;
Delay_1ms(1);
}
while(M2>=Min&&P21==0){
M2-=Vel;
Delay_1ms(1);
}
}
//==========================================//
//==========================================//Servo3副程式
void Servo3(void){
while(M3<=Max&&P20==0){
M3+=Vel;
Delay_1ms(1);
}
while(M3>=Min&&P21==0){
M3-=Vel;
Delay_1ms(1);
}
}
//==========================================//
//==========================================//Servo4副程式
void Servo4(void){
while(M4<=Max&&P20==0){
M4+=Vel;
Delay_1ms(1);
}
while(M4>=Min&&P21==0){
M4-=Vel;
Delay_1ms(1);
}
}
//==========================================//
//==========================================//Servo5副程式
void Servo5(void){
while(M5<=Max&&P20==0){
M5+=Vel;
Delay_1ms(1);
}
while(M5>=Min&&P21==0){
M5-=Vel;
Delay_1ms(1);
}
}
//==========================================//
//==========================================//Servo6副程式
void Servo6(void){
while(M6<=Max&&P20==0){
M6+=Vel;
Delay_1ms(1);
}
while(M6>=Min&&P21==0){
M6-=Vel;
Delay_1ms(1);
}
}
//==========================================//
//==========================================//Servo7副程式
void Servo7(void){
while(M7<=Max&&P20==0){
M7+=Vel;
Delay_1ms(1);
}
while(M7>=Min&&P21==0){
M7-=Vel;
Delay_1ms(1);
}
}
//==========================================//
//==========================================//Servo8副程式
void Servo8(void){
while(M8<=Max&&P20==0){
M8+=Vel;
Delay_1ms(1);
}
while(M8>=Min&&P21==0){
M8-=Vel;
Delay_1ms(1);
}
}
//==========================================//
SG90-Timer.C
(5.71 KB, 下載次數: 1086)
2010-11-30 23:41 上傳
點擊文件名下載附件
伺服馬達控制程式
作者:
vegewell
時間:
2010-12-2 11:54
請多多參考以前的文章
機器蟲hexapod的零件-串列伺服機控制板自製達成
http://www.robofun.net/forum/vie ... p;extra=&page=1
marbol大有提到:
[其實8051有32隻腳可以做IO控制輸出,如同您實做的,減去了一隻串列RX腳後就剩31隻腳可用,
接下來要瞭解的是您是用輪序的方式提供PWM輸出 ,還是用計時匹配的方式提供PWM輸出,
一開始我的想法是用到輪序的方式(類似步進馬達的控制的時序,大原則是PWM週期不變),不過以最大的脈波2.5ms來除20ms的PWM週期,最多只能有8隻腳的PWM可以控制,若是要多加幾隻腳來用,那麼唯一的途徑就是延展PWM週期,不過延展PWM週期會造成伺服機動作變慢,其實延展PWM週期這個想法用在調控伺服機的速度上是一個不錯的方法,不過既要增加接腳,那麼勢必要放棄調控速度的這個方法,同時間只能折衷做選擇~~~~~~~~~~~
]
歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/)
Powered by Discuz! X3.2