聚豐項(xiàng)目 > 基于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
團(tuán)隊(duì)成員
zhuyshuang 學(xué)生
電源模塊
電池:電池采用3300mah 2s航模電池,該類型電池具有高效的利用率和穩(wěn)定的性能,一直被作為各種航模、電動(dòng)車等的供電設(shè)備
穩(wěn)6V電源模塊:使用TI公司開關(guān)電源TPS5430降壓到6V供舵機(jī)使用。電路原理圖如圖所示。
穩(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)。
車模速度控制:車模速度采用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í)且平順。
車模姿態(tài)獲?。?/span>
參考WT931的操作手冊(cè)寫串口定長(zhǎng)數(shù)據(jù)接收處理即可,以下為與上位機(jī)通信代碼,用于實(shí)際調(diào)試。
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)) );
}
車模平衡控制:簡(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)下載