一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

聚豐項(xiàng)目 > 基于AB32VG1的自平衡自行車

基于AB32VG1的自平衡自行車

基于AB32VG1開發(fā)板設(shè)計(jì)的自平衡自行車機(jī)器人,具有一定的觀賞性。車體姿態(tài)通過串口陀螺儀WT931獲取,由S3010舵機(jī)控制前輪轉(zhuǎn)向,使用RS-385電機(jī)和絕對(duì)值編碼器實(shí)現(xiàn)后輪速度閉環(huán)控制,使用直流減速電機(jī)驅(qū)動(dòng)動(dòng)量輪。硬件部分測(cè)試穩(wěn)定,利用STM32裸機(jī)平臺(tái)完成了整機(jī)控制。現(xiàn)階段軟件控制部分利用RTT Studio完成了串口陀螺儀角度數(shù)據(jù)獲取,單極性電機(jī)驅(qū)動(dòng)控制。對(duì)于RTT了解還不夠深入,有待后續(xù)積累經(jīng)驗(yàn)。

zhuyshuang zhuyshuang

分享
1 喜歡這個(gè)項(xiàng)目
團(tuán)隊(duì)介紹

zhuyshuang zhuyshuang

團(tuán)隊(duì)成員

zhuyshuang 學(xué)生

分享
項(xiàng)目簡(jiǎn)介
基于AB32VG1開發(fā)板設(shè)計(jì)的自平衡自行車機(jī)器人,具有一定的觀賞性。車體姿態(tài)通過串口陀螺儀WT931獲取,由S3010舵機(jī)控制前輪轉(zhuǎn)向,使用RS-385電機(jī)和絕對(duì)值編碼器實(shí)現(xiàn)后輪速度閉環(huán)控制,使用直流減速電機(jī)驅(qū)動(dòng)動(dòng)量輪。硬件部分測(cè)試穩(wěn)定,利用STM32裸機(jī)平臺(tái)完成了整機(jī)控制。現(xiàn)階段軟件控制部分利用RTT Studio完成了串口陀螺儀角度數(shù)據(jù)獲取,單極性電機(jī)驅(qū)動(dòng)控制。對(duì)于RTT了解還不夠深入,有待后續(xù)積累經(jīng)驗(yàn)。
硬件說明
  1. 電源模塊

    1. 電池:電池采用3300mah 2s航模電池,該類型電池具有高效的利用率和穩(wěn)定的性能,一直被作為各種航模、電動(dòng)車等的供電設(shè)備

    2. 穩(wěn)6V電源模塊:使用TI公司開關(guān)電源TPS5430降壓到6V供舵機(jī)使用。電路原理圖如圖所示。

    3. 穩(wěn)5V電源模塊:TPS7350是TI公司生產(chǎn)的高性能線性穩(wěn)壓芯片,其使用方便,電路的設(shè)計(jì)原理如圖所示。

    2.電機(jī)驅(qū)動(dòng)模塊:本設(shè)計(jì)的驅(qū)動(dòng)電路由4片mos管構(gòu)成H橋。通過控制4個(gè)MOS管的導(dǎo)通和關(guān)斷來實(shí)現(xiàn)正反轉(zhuǎn),并通過控制輸入的PWM波的占空比來調(diào)節(jié)電機(jī)兩端的平均電壓,達(dá)到控制電機(jī)的轉(zhuǎn)速的目的,具體電路圖如圖所示

    3.陀螺儀:陀螺儀使用維特智能的WT931串口陀螺儀模塊,模塊集成高精度的陀螺儀、加速度計(jì)、地磁場(chǎng)傳感器,采用高性能的微處理器和先進(jìn) 的動(dòng)力學(xué)解算與卡爾曼動(dòng)態(tài)濾波算法,能夠快速求解出模塊當(dāng)前的實(shí)時(shí)運(yùn)動(dòng)姿態(tài)。



軟件說明
  1. QQ截圖20211215212648.png

  2. 車模速度控制:車模速度采用PID控制,P為比例參數(shù),I為積分參數(shù),D為微分參數(shù),P項(xiàng)使輸出隨誤差大小變化,I項(xiàng)消除由于摩擦力等因素導(dǎo)致的速度的穩(wěn)態(tài)誤差,使得實(shí)際速度始終跟隨目標(biāo)速度,提高車模運(yùn)行速度的穩(wěn)定性,D項(xiàng)提高速度的動(dòng)態(tài)響應(yīng)能力及降低超調(diào),使速度響應(yīng)及時(shí)且平順。

  3. 車模姿態(tài)獲?。?/span>

    參考WT931的操作手冊(cè)寫串口定長(zhǎng)數(shù)據(jù)接收處理即可,以下為與上位機(jī)通信代碼,用于實(shí)際調(diào)試。

  4. void SCI_Send_Datas()
    {
        static unsigned short int send_data[3][4] = { { 0 }, { 0 }, { 0 } };
        short int checksum=0;
        unsigned char xorsum=0,high,low;

        send_data[0][0] = (unsigned short int)(Roll);
        send_data[0][1] = (unsigned short int)(90);
        send_data[0][2] = (unsigned short int)(0);
        send_data[0][3] = (unsigned short int)(0);

        send_data[1][0] = (unsigned short int)(output);
        send_data[1][1] = (unsigned short int)(0);
        send_data[1][2] = (unsigned short int)(0);
        send_data[1][3] = (unsigned short int)(0);

        send_data[2][0] = (unsigned short int)(0);
        send_data[2][1] = (unsigned short int)(0);
        send_data[2][2] = (unsigned short int)(0);
        send_data[2][3] = (unsigned short int)(0);

        rt_sprintf(tx_buf0, "%c",0x53);
        rt_device_write(serial, 0, tx_buf0, (sizeof(tx_buf0)) );
        rt_sprintf(tx_buf0, "%c",0x54);
        rt_device_write(serial, 0, tx_buf0, (sizeof(tx_buf0)) );

        for (int i = 0; i < 3; i++)
        for (int j = 0; j < 4; j++)
        {
          low=(unsigned char)(send_data[i][j] & 0x00ff);
          high=(unsigned char)(send_data[i][j] >> 8u);

          rt_sprintf(tx_buf0, "%c",low);
          rt_device_write(serial, 0, tx_buf0, (sizeof(tx_buf0)) );
          rt_sprintf(tx_buf0, "%c",high);
          rt_device_write(serial, 0, tx_buf0, (sizeof(tx_buf0)) );

          checksum+=low; checksum+=high;
          xorsum^=low; xorsum^= high;
        }

        rt_sprintf(tx_buf0, "%c",(unsigned char)(checksum & 0x00ff));
        rt_device_write(serial, 0, tx_buf0, (sizeof(tx_buf0)) );
        rt_sprintf(tx_buf0, "%c",xorsum);
        rt_device_write(serial, 0, tx_buf0, (sizeof(tx_buf0)) );
    }

  5. 車模平衡控制:簡(jiǎn)單的考慮是,不考慮舵機(jī)轉(zhuǎn)向和后輪電機(jī)速度對(duì)于單車平衡的影響,類比于兩輪平衡小車直立環(huán)、速度環(huán)和方向環(huán)的三環(huán)控制,單車采用角速度環(huán)和角度環(huán)串級(jí)作為直立環(huán),直立環(huán)以動(dòng)量輪為執(zhí)行器,由舵機(jī)控制轉(zhuǎn)向,后輪電機(jī)提供動(dòng)力。

    如果不考慮動(dòng)量輪的作用,單車的運(yùn)動(dòng)控制此時(shí)是一個(gè)欠驅(qū)動(dòng)系統(tǒng)。按照單車的運(yùn)動(dòng)模型,后輪電機(jī)速度對(duì)單車的直立環(huán)也會(huì)產(chǎn)生影響,速度越快,則向心力越大,所以不同速度下單車傾角所對(duì)應(yīng)的前輪舵機(jī)打角也不同。假設(shè)在勻速狀態(tài)下的參數(shù)正好適合,我們想到可以配合加減速來輔助直立環(huán),在單車過彎道時(shí)減速,過彎后及時(shí)加速使單車回正,這樣的策略可以讓單車在過彎時(shí)起到壓彎的效果。

    實(shí)際情況是舵機(jī)與兩個(gè)電機(jī)相互耦合作用,值得深入研究研究。

    通過動(dòng)量輪實(shí)現(xiàn)單車平衡控制算法:

        

        void balance_pid(float turn)
        {
             float idata  servo_bias,gyro_bias;
             static float idata last_output=0,last_g_output=0;
             static float  servo_bias_last,gyro_bias_last;
             static float  servo_integration;
             static float gyro_integration;
             float actual;
             //角度環(huán)
             servo_bias = Roll- pid.balance_init0-turn;
             servo_integration+=servo_bias;

             if(servo_integration>600)//外環(huán)積分限幅
               servo_integration=600;
             else if(servo_integration<-600)
               servo_integration=-600;

             pid.output= pid.balance_P * servo_bias + pid.balance_I * servo_integration  + pid.balance_D * ((float)gyro[0]/16.4);//+center.result;

             //角速度環(huán)
              gyro_bias = pid.output -  ((float)gyro[0]/16.4);

    
             gyro_integration+=gyro_bias;
             if(gyro_integration>1000)//內(nèi)環(huán)積分限幅
                  gyro_integration=1000;
             else if(gyro_integration<-1000)
                  gyro_integration=-1000;
             key.servo_pwm =pid.outside_P * gyro_bias +pid.outside_I*gyro_integration+ pid.outside_D * (gyro_bias - gyro_bias_last);
             gyro_bias_last = gyro_bias;
             servo_duty((unsigned short)((short)key.servo_pwm+970));//輸出到動(dòng)量輪電機(jī)

}



演示效果

車模姿態(tài)的獲取

附件

(11.06 MB)下載

評(píng)論區(qū)(0 )