聚豐項目 > 基于AB32VG1的自平衡自行車
基于AB32VG1開發板設計的自平衡自行車機器人,具有一定的觀賞性。車體姿態通過串口陀螺儀WT931獲取,由S3010舵機控制前輪轉向,使用RS-385電機和絕對值編碼器實現后輪速度閉環控制,使用直流減速電機驅動動量輪。硬件部分測試穩定,利用STM32裸機平臺完成了整機控制。現階段軟件控制部分利用RTT Studio完成了串口陀螺儀角度數據獲取,單極性電機驅動控制。對于RTT了解還不夠深入,有待后續積累經驗。
zhuyshuang
分享zhuyshuang
團隊成員
zhuyshuang 學生
電源模塊
電池:電池采用3300mah 2s航模電池,該類型電池具有高效的利用率和穩定的性能,一直被作為各種航模、電動車等的供電設備
穩6V電源模塊:使用TI公司開關電源TPS5430降壓到6V供舵機使用。電路原理圖如圖所示。
穩5V電源模塊:TPS7350是TI公司生產的高性能線性穩壓芯片,其使用方便,電路的設計原理如圖所示。
2.電機驅動模塊:本設計的驅動電路由4片mos管構成H橋。通過控制4個MOS管的導通和關斷來實現正反轉,并通過控制輸入的PWM波的占空比來調節電機兩端的平均電壓,達到控制電機的轉速的目的,具體電路圖如圖所示
3.陀螺儀:陀螺儀使用維特智能的WT931串口陀螺儀模塊,模塊集成高精度的陀螺儀、加速度計、地磁場傳感器,采用高性能的微處理器和先進 的動力學解算與卡爾曼動態濾波算法,能夠快速求解出模塊當前的實時運動姿態。
車模速度控制:車模速度采用PID控制,P為比例參數,I為積分參數,D為微分參數,P項使輸出隨誤差大小變化,I項消除由于摩擦力等因素導致的速度的穩態誤差,使得實際速度始終跟隨目標速度,提高車模運行速度的穩定性,D項提高速度的動態響應能力及降低超調,使速度響應及時且平順。
車模姿態獲?。?/span>
參考WT931的操作手冊寫串口定長數據接收處理即可,以下為與上位機通信代碼,用于實際調試。
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)) );
}
車模平衡控制:簡單的考慮是,不考慮舵機轉向和后輪電機速度對于單車平衡的影響,類比于兩輪平衡小車直立環、速度環和方向環的三環控制,單車采用角速度環和角度環串級作為直立環,直立環以動量輪為執行器,由舵機控制轉向,后輪電機提供動力。
如果不考慮動量輪的作用,單車的運動控制此時是一個欠驅動系統。按照單車的運動模型,后輪電機速度對單車的直立環也會產生影響,速度越快,則向心力越大,所以不同速度下單車傾角所對應的前輪舵機打角也不同。假設在勻速狀態下的參數正好適合,我們想到可以配合加減速來輔助直立環,在單車過彎道時減速,過彎后及時加速使單車回正,這樣的策略可以讓單車在過彎時起到壓彎的效果。
實際情況是舵機與兩個電機相互耦合作用,值得深入研究研究。
通過動量輪實現單車平衡控制算法:
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;
//角度環
servo_bias = Roll- pid.balance_init0-turn;
servo_integration+=servo_bias;
if(servo_integration>600)//外環積分限幅
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;
//角速度環
gyro_bias = pid.output - ((float)gyro[0]/16.4);
gyro_integration+=gyro_bias;
if(gyro_integration>1000)//內環積分限幅
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));//輸出到動量輪電機
}
車模姿態的獲取
(11.06 MB)下載