Robofun 機器人論壇

標題: 請問RC伺服器馬達用8051怎麼控制 [打印本頁]

作者: mjx4mois    時間: 2009-8-20 20:28
標題: 請問RC伺服器馬達用8051怎麼控制
小弟最近迷上機器人,

尤其是蜘蛛機器人

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

雖然不懂原理

但是去網路爬文一下

自己用C語言寫了一段


是可以正反轉

但是兩邊轉的角度卻不同

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

結果,今天一直try

就聽到啪一聲

之後轉就不順了

結果拆開來

發現齒輪斷了……

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

或者用8051 大概怎麼寫

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

去控制正反轉

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

duty 不一樣  一個高態1.8ms

另一個高態0.2ms

卻轉的角度不同

不知有哪位高手能幫幫我

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

是GWS這個公司生產的

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

沒有寫它的工作原理..

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

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

角度小於90度

但是還是不夠精確

書已經有去找了  還在調貨中
作者: then0011    時間: 2009-8-21 16:08
我可以提供給你一段代碼  不知道 你可不可以 教我怎麼做電路板和需要什麼零件,我知道的是 需要陀螺,傾角傳感器然後呢!還有就是怎麼連接他們的線路.
我先提供一段先   以表誠意!
-----------------------------------------
#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上打上自行車改裝 然後就會找到電機.
請教我一下   非常感謝!
作者: g921002    時間: 2009-8-22 12:14
本帖最後由 g921002 於 2009-8-22 12:18 編輯

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

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

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

角度小於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    時間: 2009-8-22 14:37
/* 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    時間: 2009-8-22 14:40
如果是廣告我只是想說明我是用那個芯片才可以,另電機轉速一樣.       這個我不知道,我只是想請教各位!
作者: g921002    時間: 2009-8-22 17:17
本帖最後由 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。....
作者: mjx4mois    時間: 2009-8-22 21:14
精度跟你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.

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

真的想做出來

不過有很多問題待解決
作者: mjx4mois    時間: 2009-8-22 21:18
/* 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    時間: 2009-8-22 21:18
謝謝你的發言,呵呵 我是個菜鳥,不是很清楚你說的,都是專業名詞,呵呵   
控制器我沒買,呵呵 不過還是很謝謝你的建議,我會去買的,這個我也考慮過,
不過我不會電路線路,不知道可以提供一下不  我是有圖不過 他們用的陀螺是EWTS4松下的傳感器是這個ADXL311

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

更新時間 2009/8/22   21:18分。
作者: then0011    時間: 2009-8-22 21:20
錯誤之處!
他們用的松下 螺是EWTS4的
傳感器是這個ADXL311
作者: then0011    時間: 2009-8-22 21:20
錯誤之處!
他們用的松下 陀螺儀是EWTS4的
傳感器是這個ADXL311
作者: g921002    時間: 2009-8-22 21:46
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中斷去想辦法解決問題做做看。
作者: g921002    時間: 2009-8-22 22:13
謝謝你的發言,呵呵 我是個菜鳥,不是很清楚你說的,都是專業名詞,呵呵   
控制器我沒買,呵呵 不過還是很謝謝你的建 ...
then0011 發表於 2009-8-22 21:18


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

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

做兩輪車應該先想好要用怎樣方式控制才去找對應的東西。而不是先找了東西才去東修改西修改。
1.馬達能不能用你要先分析過。看看他的傳遞函數表現如何。怎樣使用。比如一開始若是需要ENCODER,買馬達時就找馬達商連Encoder一起配好,而不是買馬達後自己硬幹找ENCODER。
2.用怎樣的演算法及sensor,去估測姿態。用了一個大家都沒在用的步就是自找麻煩?
3.控制算法用怎樣的方法做?平衡點附近是線性系統,遠離平衡點是非線性系統,用怎樣的搭配控制?
4.做電路板時,電源配置、選用,數位/類比線路怎樣走,信號怎樣配置都是問題。
做這東西只是硬幹的話,會做的事倍功半。
作者: lungman    時間: 2009-8-23 01:12
本帖最後由 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    時間: 2009-8-23 10:50
謝謝!
#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    時間: 2009-8-23 12:49
2、可以提供給我電路圖嗎,需要的電子零件清單。
作者: mjx4mois    時間: 2009-8-25 00:50
貼上一段程式給你參考(剛好也是控制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 可以控很多馬達呢?
作者: mjx4mois    時間: 2009-8-25 00:54
10# mjx4mois
程式可以改成
P2.0=1;       (  P2.0 控制第一顆   P2.1控制第二顆  )
delay_ms(1.5);
P2.0=0;
P2.1=1;
delay_ms(2.0);  
g921002 發表於 2009-8-22 21:46


變種8051?!

哪個型號呢?

不好意思問這麼多

我的夢想就是完成一隻蜘蛛機器人

那它的寫法跟8051差在哪呢?!

請你幫幫我><"

我是有想過

用很多555去做出該藥的PWM

然後再用8051控制多工器去選擇要輸出哪個PWM

不過感覺上很費時間跟金錢

你說的變種8051 是?

可以用最原始的8051燒錄器燒嗎?

還是要用萬用燒錄器?
作者: g921002    時間: 2009-8-25 01:27
變種8051?!
哪個型號呢?
不好意思問這麼多
我的夢想就是完成一隻蜘蛛機器人
那它的寫法跟8051差在哪呢?!
請你幫幫我>
mjx4mois 發表於 2009-8-25 00:54

類似這種的:
https://www.silabs.com/products/mcu/pages/default.aspx
內部有硬體的PWM,不用軟體去做。這樣MCU有充裕的時間作其他的控制。
不過也可以用「外掛」去產生PWM波型:
http://www.playrobot.com/motro_driver/motor_motor&RC%20servodriver_RCmotordriver.html
這樣可以免除更換MCU的困擾,就算用變種的51,也要時間適應的。
或直接用利基的產品,不要用51了...
作者: then0011    時間: 2009-8-25 21:47
請問大家,誰有驅動器電路圖,原理圖也可以,最好是有電路圖!
作者: then0011    時間: 2009-8-25 21:48
需要支持 DC24V 250W 14A的,能用什麼芯片,和電子零件。
作者: then0011    時間: 2009-8-28 01:29
更新2009/8/28日。
今天去了深圳高交會做電腦技術支持,看到很多都是生產貼片機的機器,全自動的,有德國的,有日本的,有深圳,有台灣的。反正很多,他們有技術論壇,各個都在說技術的問題。從波蜂焊到激光焊,等等。美女如雲,也有很多人,非常多的。累死了,今天電腦沒出問題,恩非常好。沒有什麼事,但非常在意那台電腦,時不時需要走過去看一下,沒事就找個角落做下,看看手提電腦,鬱悶的是那裡上不了網。

不說了,正題。

今天去買了軸承了四個,4塊一個    4*4=16快。今天在網上聯繫了,明天需要去買軸,硬度是60以上的鋼。叫直線光軸,1米。能支持100斤吧,也不知道,看看了。
不過他們的也是那樣的,也不清楚是怎麼樣。   不行的話我跟他說了,可以換。
到這裡機械的問題就告一段落了。

下一步需要製作或是買驅動器和陀螺儀,以及角傳感器,把他們連接在一起組成,傳感器組,把他接在單片機上。  然後單片機接在驅動器上。

還需要程序。所以,在次之上還需要花錢  。


鬱悶的是驅動器 DC24V 250W  14A的成品需要150/,不知道能不能支持2個有刷電機,這個比較鬱悶。

還有一快是單片機和陀螺儀以及角傳感器。需要400塊。角傳感器我看到一款是50元的成品,不知道能不能360度的轉。

陀螺儀比較貴!呵呵鬱悶了   不知道誰可以提供電路圖。先在這裡謝謝了!
作者: xu3u4rmp4    時間: 2009-9-8 10:47
http://www.wretch.cc/blog/za5955565
作者: xu3u4rmp4    時間: 2009-9-16 23:54
請問lungman大大
假如有8顆馬達
您的波形圖意思是在20mS之內依序輪流輸出8顆馬達的Hi時間
那如果要控制16顆馬達呢?
那程式的架構為何?
波形又是怎樣呢?
因為我會控制8顆馬達卻寫不出控制16顆馬達的程式
我想是我的程式寫法出錯了
所以想請教各位




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2