Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
樓主: mjx4mois
打印 上一主題 下一主題

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

[複製鏈接]
then0011 該用戶已被刪除
1#
發表於 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上打上自行車改裝 然後就會找到電機.
請教我一下   非常感謝!
then0011 該用戶已被刪除
2#
發表於 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 該用戶已被刪除
3#
發表於 2009-8-22 14:40:22 | 顯示全部樓層
如果是廣告我只是想說明我是用那個芯片才可以,另電機轉速一樣.       這個我不知道,我只是想請教各位!
then0011 該用戶已被刪除
4#
發表於 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 該用戶已被刪除
5#
發表於 2009-8-22 21:20:18 | 顯示全部樓層
錯誤之處!
他們用的松下 螺是EWTS4的
傳感器是這個ADXL311
then0011 該用戶已被刪除
6#
發表於 2009-8-22 21:20:58 | 顯示全部樓層
錯誤之處!
他們用的松下 陀螺儀是EWTS4的
傳感器是這個ADXL311
then0011 該用戶已被刪除
7#
發表於 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 該用戶已被刪除
8#
發表於 2009-8-23 12:49:56 | 顯示全部樓層
2、可以提供給我電路圖嗎,需要的電子零件清單。
then0011 該用戶已被刪除
9#
發表於 2009-8-25 21:47:21 | 顯示全部樓層
請問大家,誰有驅動器電路圖,原理圖也可以,最好是有電路圖!
then0011 該用戶已被刪除
10#
發表於 2009-8-25 21:48:45 | 顯示全部樓層
需要支持 DC24V 250W 14A的,能用什麼芯片,和電子零件。
then0011 該用戶已被刪除
11#
發表於 2009-8-28 01:29:28 | 顯示全部樓層
更新2009/8/28日。
今天去了深圳高交會做電腦技術支持,看到很多都是生產貼片機的機器,全自動的,有德國的,有日本的,有深圳,有台灣的。反正很多,他們有技術論壇,各個都在說技術的問題。從波蜂焊到激光焊,等等。美女如雲,也有很多人,非常多的。累死了,今天電腦沒出問題,恩非常好。沒有什麼事,但非常在意那台電腦,時不時需要走過去看一下,沒事就找個角落做下,看看手提電腦,鬱悶的是那裡上不了網。

不說了,正題。

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

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

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


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

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

陀螺儀比較貴!呵呵鬱悶了   不知道誰可以提供電路圖。先在這裡謝謝了!
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-23 23:41 , Processed in 0.284645 second(s), 9 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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