Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 4146|回復: 1
打印 上一主題 下一主題

[求助]8051控制6足機器人,pwm問題

[複製鏈接]
跳轉到指定樓層
1#
發表於 2010-11-30 23:48:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近在製作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)
2#
發表於 2010-12-2 11:54:00 | 只看該作者
請多多參考以前的文章
機器蟲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週期這個想法用在調控伺服機的速度上是一個不錯的方法,不過既要增加接腳,那麼勢必要放棄調控速度的這個方法,同時間只能折衷做選擇~~~~~~~~~~~
]
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-11-24 00:45 , Processed in 0.159282 second(s), 9 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表