基于AVR单片机: 两轮自平衡智能车
???
??????? 寒假無(wú)所事事,決定做一個(gè)兩輪平衡車(chē)來(lái)玩玩.個(gè)人覺(jué)得兩輪自平衡車(chē)是集合所有算法的精髓.它就像蛋炒飯,最簡(jiǎn)單也是最困難.他可以用簡(jiǎn)單的算法實(shí)現(xiàn),當(dāng)然也可以用最復(fù)雜的控制理論來(lái)實(shí)現(xiàn). 本質(zhì)上來(lái)說(shuō)它就是個(gè)倒立擺.
個(gè)人原創(chuàng),轉(zhuǎn)載請(qǐng)注明原文出處:
??????????http://www.embbnux.com/2014/02/21/avr_mcu_balance_car/
所需原件:
AVR單片機(jī) : 采用之前的ATmega128開(kāi)發(fā)板
傳感器: ENC03陀螺儀? mma8451加速度計(jì)
電機(jī)驅(qū)動(dòng): L298n
總體思路:
使用陀螺儀測(cè)角速度,使用加速度計(jì)測(cè)角度,使用測(cè)得的這兩個(gè)值進(jìn)行傳感器融合,獲取準(zhǔn)確的角度.由得到的角度來(lái)控制車(chē)子兩個(gè)輪子的轉(zhuǎn)向,轉(zhuǎn)速等參數(shù).進(jìn)而實(shí)現(xiàn)兩輪車(chē)的平衡. 傳感器融合使用卡爾曼濾波算法,不得不大贊一下卡爾曼同學(xué),給了個(gè)這么perfect的算法,傳說(shuō)當(dāng)年挑戰(zhàn)者號(hào)就是用的這個(gè)算法.
角度的測(cè)量:
enc03陀螺儀: 采用的這個(gè)陀螺儀是模擬量的,輸出電壓需要用ATmega128進(jìn)行adc轉(zhuǎn)換成數(shù)字量,測(cè)得電壓,再轉(zhuǎn)換成角速度:
ISR(ADC_vect){if(adc_done_flag==0){adc_read(adc_channel);if(adc_channel==1) {adc_channel=0;}else{adc_channel++;adc_mid_tmp0[cou]=adc_value[0]; //中值濾波cou++;if(cou==3){cou=0;if(adc_mid_tmp0[0]>adc_mid_tmp0[1]){mid_tmp = adc_mid_tmp0[0];adc_mid_tmp0[0] =adc_mid_tmp0[1];adc_mid_tmp0[1] =mid_tmp;}if(adc_mid_tmp0[2]>adc_mid_tmp0[1])adc_mid[0]=adc_mid_tmp0[1] ;else if (adc_mid_tmp0[2]>adc_mid_tmp0[0])adc_mid[0]=adc_mid_tmp0[2] ;elseadc_mid[0]=adc_mid_tmp0[0] ;}}adc_set_channel(adc_channel);adc_done_flag =1; } else adc_done_flag = 0; //ADCSRA|=(1<<ADSC);} float gyro_enc03_w(unsigned int adc_value,float adc_bias){float w_value;//把a(bǔ)dc采集的值轉(zhuǎn)化為電壓w_value = (float)(adc_value)*2540/1024; //mVw_value = w_value-adc_bias;//把電壓轉(zhuǎn)化為角速度w_value = -w_value;w_value = w_value/0.67;return w_value; }mma8451加速度計(jì): mma8451使用的I2C接口,不過(guò)沒(méi)事,128上面就有一個(gè)了,這里我使用硬件I2C來(lái)實(shí)現(xiàn),代碼較多這里給出關(guān)鍵代碼:
使用卡爾曼濾波融合兩個(gè)測(cè)量量:(參考自原來(lái)在阿莫論壇很流行的算法)
卡爾曼算法是要在定時(shí)器里面不斷的更新,才能發(fā)揮作用.dt就是定時(shí)器的時(shí)間,這里我采用10ms.
主要算法在定時(shí)器中斷里面實(shí)現(xiàn):
定時(shí)器里面完成對(duì)角速度,角度的測(cè)量,卡爾曼更新,以及對(duì)電機(jī)的控制.
//定時(shí)器0 初始化 void timer0_init(void){//設(shè)置計(jì)數(shù)開(kāi)始的初始值TCNT0 = 176 ; // 208>>6ms 176>>10ms//設(shè)置分頻TCCR0 = (1<<CS02)|(1<<CS00)|(1<<CS01); //1024分頻 47次6ms 62.5次8ms//設(shè)置中斷屏蔽寄存器TIMSK = (1<<TOIE0); //設(shè)置溢出使能中斷 } //定時(shí)器0溢出中斷 ISR(TIMER0_OVF_vect){//設(shè)置計(jì)數(shù)開(kāi)始的初始值TCNT0 = 176 ; //10msmma8451_data = get_mma8451_data(OUT_Z_MSB_REG);acc = mma8451_i2c_to_angel(mma8451_data);acc_tmp=acc;gyro = gyro_enc03_w(adc_mid[0],adc_bias);gyro_tmp = gyro;//卡爾曼Kalman_Filter(acc,gyro);//控制車(chē)速 if (angle>0) {car_back();if(angle>15)car_speed(0x2f,0x2f); elsecar_speed(0x4f,0x4f); } else if(angle<0){car_forward();if(angle<-15)car_speed(0x2f,0x2f);elsecar_speed(0x4f,0x4f); }}
對(duì)于車(chē)速的控制,這里只采用簡(jiǎn)單的開(kāi)環(huán)控制,之后會(huì)采用更復(fù)制的DIP控制或者模糊控制等算法,日后持續(xù)更新,敬請(qǐng)關(guān)注本博客,
總結(jié)
以上是生活随笔為你收集整理的基于AVR单片机: 两轮自平衡智能车的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 201933 plsql设置及使用技巧—
- 下一篇: STM32两轮自平衡小车物料采购清单