基于AVR单片机: 两轮自平衡智能车
生活随笔
收集整理的這篇文章主要介紹了
基于AVR单片机: 两轮自平衡智能车
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
???
??????? 寒假無所事事,決定做一個兩輪平衡車來玩玩.個人覺得兩輪自平衡車是集合所有算法的精髓.它就像蛋炒飯,最簡單也是最困難.他可以用簡單的算法實現,當然也可以用最復雜的控制理論來實現. 本質上來說它就是個倒立擺.
個人原創,轉載請注明原文出處:
??????????http://www.embbnux.com/2014/02/21/avr_mcu_balance_car/
所需原件:
AVR單片機 : 采用之前的ATmega128開發板
傳感器: ENC03陀螺儀? mma8451加速度計
電機驅動: L298n
總體思路:
使用陀螺儀測角速度,使用加速度計測角度,使用測得的這兩個值進行傳感器融合,獲取準確的角度.由得到的角度來控制車子兩個輪子的轉向,轉速等參數.進而實現兩輪車的平衡. 傳感器融合使用卡爾曼濾波算法,不得不大贊一下卡爾曼同學,給了個這么perfect的算法,傳說當年挑戰者號就是用的這個算法.
角度的測量:
enc03陀螺儀: 采用的這個陀螺儀是模擬量的,輸出電壓需要用ATmega128進行adc轉換成數字量,測得電壓,再轉換成角速度:
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;//把adc采集的值轉化為電壓w_value = (float)(adc_value)*2540/1024; //mVw_value = w_value-adc_bias;//把電壓轉化為角速度w_value = -w_value;w_value = w_value/0.67;return w_value; }mma8451加速度計: mma8451使用的I2C接口,不過沒事,128上面就有一個了,這里我使用硬件I2C來實現,代碼較多這里給出關鍵代碼:
使用卡爾曼濾波融合兩個測量量:(參考自原來在阿莫論壇很流行的算法)
卡爾曼算法是要在定時器里面不斷的更新,才能發揮作用.dt就是定時器的時間,這里我采用10ms.
主要算法在定時器中斷里面實現:
定時器里面完成對角速度,角度的測量,卡爾曼更新,以及對電機的控制.
//定時器0 初始化 void timer0_init(void){//設置計數開始的初始值TCNT0 = 176 ; // 208>>6ms 176>>10ms//設置分頻TCCR0 = (1<<CS02)|(1<<CS00)|(1<<CS01); //1024分頻 47次6ms 62.5次8ms//設置中斷屏蔽寄存器TIMSK = (1<<TOIE0); //設置溢出使能中斷 } //定時器0溢出中斷 ISR(TIMER0_OVF_vect){//設置計數開始的初始值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);//控制車速 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); }}
對于車速的控制,這里只采用簡單的開環控制,之后會采用更復制的DIP控制或者模糊控制等算法,日后持續更新,敬請關注本博客,
總結
以上是生活随笔為你收集整理的基于AVR单片机: 两轮自平衡智能车的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 201933 plsql设置及使用技巧—
- 下一篇: STM32两轮自平衡小车物料采购清单