Robofun 機器人論壇

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

請問RC伺服器馬達用8051怎麼控制

[複製鏈接]
跳轉到指定樓層
1#
發表於 2009-8-20 20:28:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
小弟最近迷上機器人,

尤其是蜘蛛機器人

但是今天買了一顆RC回家完

雖然不懂原理

但是去網路爬文一下

自己用C語言寫了一段


是可以正反轉

但是兩邊轉的角度卻不同

最後它會跑到另一邊的底卡死

結果,今天一直try

就聽到啪一聲

之後轉就不順了

結果拆開來

發現齒輪斷了……

想請教大大 RC伺服馬達真正的動作原理

或者用8051 大概怎麼寫

我是用 for 迴圈不斷的讓他跑

去控制正反轉

但是兩個副程式寫的一樣只是

duty 不一樣  一個高態1.8ms

另一個高態0.2ms

卻轉的角度不同

不知有哪位高手能幫幫我

我已經弄壞了一顆RC伺服馬達

是GWS這個公司生產的

但是我去他們公司的網站找

沒有寫它的工作原理..

請大大們幫幫我.
2#
發表於 2009-8-21 02:04:53 | 只看該作者
市面上已有些單晶專題製作的書有提到RC伺服器的控制原理可以參考
基本上控制馬達的pwm脈波週期約為20ms,當高態脈寬為1.5ms時,
馬達維持中央的位置;若大於1.5ms則正轉,反之則逆轉.
通常只能正負90度
3#
 樓主| 發表於 2009-8-21 13:23:49 | 只看該作者
那請問怎麼樣才能控制它的角度呢?

我自己有寫一段可以來回跑

角度小於90度

但是還是不夠精確

書已經有去找了  還在調貨中
then0011 該用戶已被刪除
4#
發表於 2009-8-21 16:08:22 | 只看該作者
我可以提供給你一段代碼  不知道 你可不可以 教我怎麼做電路板和需要什麼零件,我知道的是 需要陀螺,傾角傳感器然後呢!還有就是怎麼連接他們的線路.
我先提供一段先   以表誠意!
-----------------------------------------
#include <pic.h>
// Machine Science library
// includes functions for usart and adc
#include "mxapi.h"

/* Radio debugging defines */
#define TX_START 0xFF
#define TX_ESC 0xFE
#define ESC1 0b10000000
#define ESC2 0b01000000

#define TX_LT 0x01
#define TX_AX 0x02
#define TX_AS 0x03
#define TX_GZ 0x04
#define TX_AE 0x05
#define TX_ML 0x06
#define TX_MR 0x07
-------------------------------------
這個是250W電機的,是安裝自行車改裝用的,在www.taobao.com上打上自行車改裝 然後就會找到電機.
請教我一下   非常感謝!
5#
發表於 2009-8-22 12:14:15 | 只看該作者
本帖最後由 g921002 於 2009-8-22 12:18 編輯

上面只有header file宣告和,macro define,沒有RC馬達控制的代碼。也沒有說明是用哪顆PIC。不知道貼這代碼是要幹嘛用的?

自行車改裝用的大多是輪鼓馬達,用於兩輪車可能會有問題。不過我還沒試過。有人找我弄,東西還推在倉庫。
6#
發表於 2009-8-22 12:25:12 | 只看該作者
那請問怎麼樣才能控制它的角度呢?

我自己有寫一段可以來回跑

角度小於90度

但是還是不夠精確

書已經有去找了  還在調貨中
mjx4mois 發表於 2009-8-21 13:23

精度跟你Duty High的分割精度有關係,正負45度是從1ms~2ms,看你要分割到多細。
但RC馬達轉角迴授靠的是一般可變電阻(電位計),精度本身不是很理想,用的經驗是Futaba3001的精度約1度,所以90分割即可,不要去用到正負90度,超過正負45度的區域線性度不好。所以能在1ms分割90分割就差不多,也可以為了方便用100分割,這樣分割精度在1ms/100=10us及足夠。

更高精度可以用機器人用的馬達,像茂綸有65535分割的系統,但是價格也是要多一兩個零。自己考慮在用。
then0011 該用戶已被刪除
7#
發表於 2009-8-22 14:37:48 | 只看該作者
/* trims */
#define AX_OFFSET 512
#define AS_OFFSET 512
#define GZ_OFFSET 522

/* control parameters */
#define KP 0.4        // proportional
#define KD 0.5        // derivative
#define KS 4.0        // steering

/* Used for deadband hysteresis */
#define FORWARD 1
#define REVERSE 0


/* Fancy segway code.
* Disclaimer: If you fall off, it's your fault.
*/


/* Handles motor pulses and main loop timer with onboard timers & interrupts. */
void interrupt segwayctl() {

        if (TMR1IF) { /* 10ms timer for motors -- turns them on for start of pulse. */
                TMR1H = 55535 >> 8;
                TMR1L = 55535 & 0xFF;
                RC1 = RC2 = 1;
                TMR1IF = 0;
        }

        if (CCP1IF) { /*end motor pulse*/
                RC1 = 0;
                CCP1IF = 0;
        }

        if (CCP2IF) { /*end motor pulse*/
                RC2 = 0;
                CCP2IF = 0;
        }
}


/* Sends information to radio for debugging. */
void tx(unsigned char addr, unsigned char byte1, unsigned char byte2) {

        usart_write(TX_START);

        if (byte1 == TX_START) {
                usart_write(TX_ESC);
                addr |= ESC1;
        } else {
                usart_write(byte1);
        }

        if (byte2 == TX_START) {
                usart_write(TX_ESC);
                addr |= ESC2;
        } else {
                usart_write(byte2);
        }

        usart_write(addr);
}

/* IT RUNS AT 100HZ!
* MAGICALLY!
*/
void main() {

        signed int lmotor = 512, rmotor = 512;
        signed int speed_offset = 0;
        signed int turn = 0;
        unsigned char tx_i = 1;
        unsigned char dtmr; /* Loop time */
        unsigned char direction = FORWARD;
       
        unsigned char rider;

        signed int ax_adc, as_adc, gz_adc; /* Analog values */
        signed int ax_deg, as_deg, gz_vel; /* Unit values */
        float angle = 0, motor = 0;

        /*setup interrupts*/
        /*sensors are on pins 1 and 2, values AN0 and AN1*/
        GIE = PEIE = CCP1IE = CCP2IE = TMR1IE = 1;
        T1CON = 1;
        PR2 = 0xFF;
        CCP1CON = CCP2CON = 0b1010;
        TRISC1 = TRISC2 = 0; /* TRISC1 and TRISC2 set pins as outputs. */
        TRISB1 = 1;
        RBPU = 0; // pull up resistors on PORTB

        /* Setting up Timer 0, this was a pain to figure out */
        T0CS = PSA = PS0 = 0;
        PS2 = PS1 = 1;
       
        usart_init(19200);
        adc_init(ALL_ANALOG);
   
        CCPR1H = (56523 + 512) >> 8;
        CCPR1L = (56523 + 512) & 0xFF;
        CCPR2H = (56523 + 512) >> 8;
        CCPR2L = (56523 + 512) & 0xFF;

        delay_ms(3000);       

        if(RB1 == 1)
        {
                // Wait for signal from RFID key reader.
                while(usart_read() != TX_START);
                // Grab rider ID.
                rider = usart_read();
        }

        while (1) {

                dtmr = TMR0;
                TMR0 = 0x00;

                /* Here we transmit variables to a laptop so we can see them in real-time.
                 * Every time this loop goes through we transmit one -- indicated by the value
                 * of tx_i.
                 */
                switch(tx_i) {
                        case(TX_LT): { tx(TX_LT, rider, dtmr); break;}
                        case(TX_AX): { tx(TX_AX, ax_adc >> 8, ax_adc & 0xFF); break; }
                        case(TX_AS): { tx(TX_AS, as_adc >> 8, as_adc & 0xFF); break; }
                        case(TX_GZ): { tx(TX_GZ, gz_adc >> 8, gz_adc & 0xFF); break; }
                        case(TX_AE): { tx(TX_AE, ((signed int)angle + 512) >> 8, ((signed int)angle + 512) & 0xFF); break; }
                        case(TX_ML): { tx(TX_ML, lmotor >> 8, lmotor & 0xFF); break; }
                        case(TX_MR): { tx(TX_MR, rmotor >> 8, rmotor & 0xFF); tx_i = 0; break; }
                }
                tx_i++;   
我並不是什麼廣告,我這個是寫出來的    鬱悶  今天又給你們貼上去了這麼多   你自己看一下是不是廣告,如果是廣告我只是想說明我是用那個芯片才可以.   我是只我用的自己的電機來說明,但我不知道你們是什麼電機呵呵所以就只能說明我自己這個電機.         

我的電機是250w  24DC 14A   

這個是圖片 我連接的是taobao一個賣家的   我不認識這個賣家 只是拿來做圖片給你們看,

芯片的話,我也不知道,所以的話 我需要去找一下,不知道大大們,能不能請教呢!
then0011 該用戶已被刪除
8#
發表於 2009-8-22 14:40:22 | 只看該作者
如果是廣告我只是想說明我是用那個芯片才可以,另電機轉速一樣.       這個我不知道,我只是想請教各位!
9#
發表於 2009-8-22 17:17:24 | 只看該作者
本帖最後由 g921002 於 2009-8-22 17:21 編輯

你在買馬達時,應該有連控制器一起買吧?看你的CODE,控制器應該是一般馬達控制的介面。(CW,CCW或Pules,Dir)這類。另外你的Sensor的部分,你用的我沒看過,一般玩家用加速規的是ADXL330比較多,如果你只是車子要平衡,加速規應該夠了。但是如果有Gyro擔任外迴路的feedback就會更好,Gyro選擇很多,ADI的比較好買,如ADXRS610,但是不太好銲接。如果你需要兩輪車能維持在原地,你的馬達需要Encoder在上面。你用的uC是PIC,所以A/D內建對你的case有幫助。至於Sensor怎樣接?要看你用的Sensor的Datasheet的參考電路。還有PCB Layout時能不能保證信號完整性。

你PO上來的CODE......我是覺得不如不PO。....
10#
 樓主| 發表於 2009-8-22 21:14:57 | 只看該作者
精度跟你Duty High的分割精度有關係,正負45度是從1ms~2ms,看你要分割到多細。
但RC馬達轉角迴授靠的是一般可變電阻(電位計),精度本身不是很理想,用的經驗是Futaba3001的精度約1度,所以90分割即可,不要去用到 ...
g921002 發表於 2009-8-22 12:25


嗯嗯瞭解

今天去測RC碼達的角度

從最左底0.5到最又3.3ms

已經大概知道它的動作原理

不過問題來了

如果要鎖死在那個角度

然單晶片又要同時輸出時候

因為delay time 的關係

每隻腳的控制都要分別寫為副程式再呼叫

問題就來了

當第一個副程式 動作 第一隻腳的動作

在這期間其它腳也要同時洞(可是動作方式不同

會有delay 的影響在

現在就式要想怎麼能夠同時動作

因為 程式(部分的)

P2.0=1;       (  P2.0 控制第一顆   P2.1控制第二顆  )
delay_ms(1.5);
P2.0=0;
delay_ms(15);
P2.1=1;
delay_ms(2.0);  <-----這樣會造成DELAY TIME 的不準確 因為要控制多顆rc碼達
P2.0=0;
delay_ms(15);
PWM控制是非常重要,可是這樣寫又會有問題。

不知道有何方式寫可以解決此問題。

我想做一個六足的機器人,利用8051.

我的資源很少 所以只能用最便宜的

真的想做出來

不過有很多問題待解決
11#
 樓主| 發表於 2009-8-22 21:18:26 | 只看該作者
/* trims */
#define AX_OFFSET 512
#define AS_OFFSET 512
#define GZ_OFFSET 522

/* control parameters */
#define KP 0.4        // proportional
#define KD 0.5        // derivative
#define KS 4.0        // steering
...
then0011 發表於 2009-8-22 14:37


抱歉喔

雖然有CODE可式不同CHIP有不同寫法

所以給我參考也沒有甚麼用,不過謝謝你的熱心

我最主要是要搞懂RC伺服馬達的原理.

而且我的RC碼達沒有那麼大顆

你這顆應該是步進馬達吧?還是普通的伺服馬達?
then0011 該用戶已被刪除
12#
發表於 2009-8-22 21:18:40 | 只看該作者
謝謝你的發言,呵呵 我是個菜鳥,不是很清楚你說的,都是專業名詞,呵呵   
控制器我沒買,呵呵 不過還是很謝謝你的建議,我會去買的,這個我也考慮過,
不過我不會電路線路,不知道可以提供一下不  我是有圖不過 他們用的陀螺是EWTS4松下的傳感器是這個ADXL311

我需要請問幾個問題,
1、我會發完完整的代碼。
2、我需要請教各位,所以我會把我完成的平衡雙輪車做成DOC文件給你們。
3、我會及時更新資料,給你們參考。不過我是需要去開個博客,所以最近我會開來的。
5、現在我買了電機,輪子兩套,還需要電路板的線路及電子元件和電路板。
6、你們也可以公開你們自己的代碼,這個沒什麼好保留的,就想linux一樣。
7、我覺得交流的是好的工具,代碼是思想,你的思考、像開拓者,電路是一個控制、像手一樣、你交流、就是進步。像李小龍說的一樣,各家的拳的不傳播,各自保留。結果一什麼都不變,外面來了個新的拳給打的措手不急。但日本的拳傳播的到處是,結果,外來的拳很難打的了,因為他們都非常精通拳道。
8、希望我能得到幫助。
9、我的馬達是 MY1025  DC24V  
10、感器和編碼器,不知道用什麼型號的,所以還需要請教各位。
11、我感謝每位對我的幫助。  

更新時間 2009/8/22   21:18分。
then0011 該用戶已被刪除
13#
發表於 2009-8-22 21:20:18 | 只看該作者
錯誤之處!
他們用的松下 螺是EWTS4的
傳感器是這個ADXL311
then0011 該用戶已被刪除
14#
發表於 2009-8-22 21:20:58 | 只看該作者
錯誤之處!
他們用的松下 陀螺儀是EWTS4的
傳感器是這個ADXL311
15#
發表於 2009-8-22 21:46:56 | 只看該作者
10# mjx4mois
程式可以改成
P2.0=1;       (  P2.0 控制第一顆   P2.1控制第二顆  )
delay_ms(1.5);
P2.0=0;
P2.1=1;
delay_ms(2.0);  <-----這樣會造成DELAY TIME 的不準確 因為要控制多顆rc碼達
P2.1=0;
delay_ms(20-1.5-2.0);

這樣控制個三、四顆沒問題,不過你的蜘蛛機器人的RC馬達太多,最好有專用的周邊去處裡。不太適合只用8051,滿多變種51有PWM或Output Compare的硬體週邊能用。不然光Delay就沒空做其他事情了。或是用Timer中斷去想辦法解決問題做做看。
16#
發表於 2009-8-22 22:13:06 | 只看該作者
謝謝你的發言,呵呵 我是個菜鳥,不是很清楚你說的,都是專業名詞,呵呵   
控制器我沒買,呵呵 不過還是很謝謝你的建 ...
then0011 發表於 2009-8-22 21:18


妳好像誤會了。好像也沒有人要你給文件和源代碼的樣子。這裡是討論版,你做的過程有問題,直接把問題交代清楚PO上來討論即可,不需要用交換方式。自助而後人助之。

合作,有合作的方法。在討論版有在討論版的方法。主要是你的問題有沒有交代清楚。這裡我看uC用的很雜,每個人用的IDE都不見得一樣。PO源代碼意義不大。

做兩輪車應該先想好要用怎樣方式控制才去找對應的東西。而不是先找了東西才去東修改西修改。
1.馬達能不能用你要先分析過。看看他的傳遞函數表現如何。怎樣使用。比如一開始若是需要ENCODER,買馬達時就找馬達商連Encoder一起配好,而不是買馬達後自己硬幹找ENCODER。
2.用怎樣的演算法及sensor,去估測姿態。用了一個大家都沒在用的步就是自找麻煩?
3.控制算法用怎樣的方法做?平衡點附近是線性系統,遠離平衡點是非線性系統,用怎樣的搭配控制?
4.做電路板時,電源配置、選用,數位/類比線路怎樣走,信號怎樣配置都是問題。
做這東西只是硬幹的話,會做的事倍功半。
17#
發表於 2009-8-23 01:12:45 | 只看該作者
本帖最後由 lungman 於 2009-8-23 01:17 編輯

貼上一段程式給你參考(剛好也是控制6個馬達的機器人)

#include <AT89X51.h>
int count=0;
int nopu=0;
int mo[8];
int a;
int outP2=0x01;
int speed=400;
bit t1=0;  
unsigned int  mode;
void T0_int(void)interrupt 1//計時0中斷
{
if (count==0) { nopu=0; a=mo[0]; outP2=0x01; }//週期起始,所有參數歸零
  if (nopu < 6)   //判斷所有伺服馬達輸出脈波是否結束,只有4個馬達(未結束)
  {
    if (a > 0)    //判斷單一伺服馬達輸出脈波是否結束(未結束)
     {
       P2=outP2;  //輸出脈波
       a--;       //單一伺服馬達輸出脈波週期減1
     }
    else          //判斷單一伺服馬達輸出脈波是否結束(已結束)
     {        
       nopu++;    //換下一個伺服馬達輸出脈波
       outP2<<=1; //P2左移1個Bit
       a=mo[nopu];//存入下一個伺服馬達的脈波資料
     }
   }   
  else            //判斷所有伺服馬達輸出脈波是否結束(已結束)
    P2=0;         //輸出歸零
  count++;        //週期加1
  if ( count==speed ) count=0; //判斷週期是否結束,若結束則週期歸零
}

void delay(int g)//延時副程式
{
int i,j;
   for (i=0; i<g; i++)
  {
       for (j=0; j<1000; j++);
  }
}
void stop_all(int i)// 停止
{
  
  mo[0]=28;  mo[1]=26; mo[2]=28; mo[3]=30;  mo[4]=28;   mo[5]=28;
delay(i);
}
void hi_up_rf(int i)//高舉右腳
{
  int gg;
    for (gg=1; gg<=3; gg++)
{
     mo[0]=28;  mo[1]=26; mo[2]=28-gg; mo[3]=30;  mo[4]=28;   mo[5]=28-gg*2;
    }
     delay(i);
}
then0011 該用戶已被刪除
18#
發表於 2009-8-23 10:50:23 | 只看該作者
謝謝!
#include <pic.h>
// Machine Science library
// includes functions for usart and adc
#include "mxapi.h"

/* Radio debugging defines */
#define TX_START 0xFF
#define TX_ESC 0xFE
#define ESC1 0b10000000
#define ESC2 0b01000000

#define TX_LT 0x01
#define TX_AX 0x02
#define TX_AS 0x03
#define TX_GZ 0x04
#define TX_AE 0x05
#define TX_ML 0x06
#define TX_MR 0x07
-----------------------複製到這裡 下次在複製
/* trims */
#define AX_OFFSET 512
#define AS_OFFSET 512
#define GZ_OFFSET 522

/* control parameters */
#define KP 0.4        // proportional
#define KD 0.5        // derivative
#define KS 4.0        // steering

/* Used for deadband hysteresis */
#define FORWARD 1
#define REVERSE 0


/* Fancy segway code.
* Disclaimer: If you fall off, it's your fault.
*/


/* Handles motor pulses and main loop timer with onboard timers & interrupts. */
void interrupt segwayctl() {

        if (TMR1IF) { /* 10ms timer for motors -- turns them on for start of pulse. */
                TMR1H = 55535 >> 8;
                TMR1L = 55535 & 0xFF;
                RC1 = RC2 = 1;
                TMR1IF = 0;
        }

        if (CCP1IF) { /*end motor pulse*/
                RC1 = 0;
                CCP1IF = 0;
        }

        if (CCP2IF) { /*end motor pulse*/
                RC2 = 0;
                CCP2IF = 0;
        }
}


/* Sends information to radio for debugging. */
void tx(unsigned char addr, unsigned char byte1, unsigned char byte2) {

        usart_write(TX_START);

        if (byte1 == TX_START) {
                usart_write(TX_ESC);
                addr |= ESC1;
        } else {
                usart_write(byte1);
        }

        if (byte2 == TX_START) {
                usart_write(TX_ESC);
                addr |= ESC2;
        } else {
                usart_write(byte2);
        }

        usart_write(addr);
}

/* IT RUNS AT 100HZ!
* MAGICALLY!
*/
void main() {

        signed int lmotor = 512, rmotor = 512;
        signed int speed_offset = 0;
        signed int turn = 0;
        unsigned char tx_i = 1;
        unsigned char dtmr; /* Loop time */
        unsigned char direction = FORWARD;
       
        unsigned char rider;

        signed int ax_adc, as_adc, gz_adc; /* Analog values */
        signed int ax_deg, as_deg, gz_vel; /* Unit values */
        float angle = 0, motor = 0;

        /*setup interrupts*/
        /*sensors are on pins 1 and 2, values AN0 and AN1*/
        GIE = PEIE = CCP1IE = CCP2IE = TMR1IE = 1;
        T1CON = 1;
        PR2 = 0xFF;
        CCP1CON = CCP2CON = 0b1010;
        TRISC1 = TRISC2 = 0; /* TRISC1 and TRISC2 set pins as outputs. */
        TRISB1 = 1;
        RBPU = 0; // pull up resistors on PORTB

        /* Setting up Timer 0, this was a pain to figure out */
        T0CS = PSA = PS0 = 0;
        PS2 = PS1 = 1;
       
        usart_init(19200);
        adc_init(ALL_ANALOG);
   
        CCPR1H = (56523 + 512) >> 8;
        CCPR1L = (56523 + 512) & 0xFF;
        CCPR2H = (56523 + 512) >> 8;
        CCPR2L = (56523 + 512) & 0xFF;

        delay_ms(3000);       

        if(RB1 == 1)
        {
                // Wait for signal from RFID key reader.
                while(usart_read() != TX_START);
                // Grab rider ID.
                rider = usart_read();
        }

        while (1) {

                dtmr = TMR0;
                TMR0 = 0x00;

                /* Here we transmit variables to a laptop so we can see them in real-time.
                 * Every time this loop goes through we transmit one -- indicated by the value
                 * of tx_i.
                 */
                switch(tx_i) {
                        case(TX_LT): { tx(TX_LT, rider, dtmr); break;}
                        case(TX_AX): { tx(TX_AX, ax_adc >> 8, ax_adc & 0xFF); break; }
                        case(TX_AS): { tx(TX_AS, as_adc >> 8, as_adc & 0xFF); break; }
                        case(TX_GZ): { tx(TX_GZ, gz_adc >> 8, gz_adc & 0xFF); break; }
                        case(TX_AE): { tx(TX_AE, ((signed int)angle + 512) >> 8, ((signed int)angle + 512) & 0xFF); break; }
                        case(TX_ML): { tx(TX_ML, lmotor >> 8, lmotor & 0xFF); break; }
                        case(TX_MR): { tx(TX_MR, rmotor >> 8, rmotor & 0xFF); tx_i = 0; break; }
                }
                tx_i++;
----------------------------------------------------------------------複製到這裡               
                /* Read analog values, calculate unit values */
                ax_adc = adc_read(0);
                gz_adc = adc_read(1);
                as_adc = adc_read(2);
                ax_deg = (ax_adc - AX_OFFSET) * 14 >> 5;
                ax_deg += speed_offset;        /* speed limit by leaning back */
                as_deg = (as_adc - AS_OFFSET) * 14 >> 5;
                gz_vel = (gz_adc - GZ_OFFSET) * 11 >> 5;

                angle = 0.97 * (angle + (float)gz_vel * (float)dtmr * 0.000128);
                angle += 0.03 * ((float)ax_deg);
               
                /* 'motor' is the base value of the motors, independent from turning speeds. */
                motor += ((KP * angle) + (KD * (float)gz_vel));
                if (motor <= -511) { motor = -511; }
                else if (motor >= 511) { motor = 511; }
                speed_offset = (int)(motor * 0.025);

                lmotor = rmotor = 511 + (int)motor;

                /* Steering */
                turn = (int)((float)as_deg * KS);

                /* Factor in steering with motors*/
                lmotor += turn;
                rmotor -= turn;

                /* Kill deadzone*/
                if (lmotor < 547 && lmotor > 477 && direction == FORWARD) { lmotor = 547; }
                else if (rmotor < 547 && rmotor > 477 && direction == REVERSE) { rmotor = 477; }
                if (lmotor <= 547) { direction = FORWARD; }
                else if (motor >= 466) { direction = REVERSE; }

                /* Making sure the motor values don't overflow and mess up */
                if (lmotor > 1022) { lmotor = 1022; }
                else if (lmotor < 0) { lmotor = 0; }
                if (rmotor > 1022) { rmotor = 1022; }
                else if (rmotor < 0) { rmotor = 0; }

                /* Killswitch - not used at the moment */
                if (0 == 1) {
                        rmotor = lmotor = 512;
                        motor = 0;
                }

                /* Actually control motors */
                CCPR1H = (56523 + lmotor) >> 8;
                CCPR1L = (56523 + lmotor) & 0xFF;
                CCPR2H = (56523 + rmotor) >> 8;
                CCPR2L = (56523 + rmotor) & 0xFF;
        }
}

這個是代碼

不過還是沒解決我的問題
1、要使用什麼陀螺儀和角度傳感器 和編碼器
2、可以提供給我電路圖嗎,需要的電子零件。
3、我的電機是24VDC 250W  14A電流。
4、那裡可以買到 傳感器  ADXL311    陀螺儀  松下的    EWTS4。
5、價格不要太貴,負擔不起。
then0011 該用戶已被刪除
19#
發表於 2009-8-23 12:49:56 | 只看該作者
2、可以提供給我電路圖嗎,需要的電子零件清單。
20#
 樓主| 發表於 2009-8-25 00:50:22 | 只看該作者
貼上一段程式給你參考(剛好也是控制6個馬達的機器人)

#include
int count=0;
int nopu=0;
int mo[8];
int a;
int outP2=0x01;
int speed=400;
bit t1=0;  
unsigned int  mode;
void T0_int(void)inter ...
lungman 發表於 2009-8-23 01:12





嗯大概瞭解

不過我控制的機器人目前是12顆RC馬達

而且在第一顆馬達pwm升為1的其間第二顆馬達的pwm也要升為1

目前我用陣列去令哪一隻腳為1

然後用for迴圈去跑

分割成0.1ms抓陣列接腳哪隻為1

可是這樣又有點寫死

我去網路上搜尋了 pwm ic

不過控制接腳有點少?

是否還有其它的 ic 可以控很多馬達呢?
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-11 20:48 , Processed in 0.232073 second(s), 8 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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