做一辆超mini平衡自行车,全开源!
大家好,我是張巧龍,今天給大家帶來一個平衡自行車,我實驗室一個19級的本科生做的,他今年也獲得了全國電賽二等獎(F題)的成績。
人嘛,非常帥的一個小伙子。B站ID:_旺仔小菠蘿,歡迎大家圍觀!
好了,廢話不多說,直接開整!先看展示視頻,相關方案在后文。
文末開源所有文件(已經獲得本人授權),程序、電路、3D打印文件。
01?
硬件篇
1.1??STM32F103C8T6最小系統(小藍板)
1.2 MPU6050姿態傳感器(3.3V供電)
1.3 0.96寸OLED顯示屏(四針、IIC通信、3.3V供電)
1.4 HC-05藍牙模塊(串口通信、用于接收小車運動指令)
使用教程鏈接:https://blog.csdn.net/weixin_44325419/article/details/110727911
1.5? 無刷電機動量輪
1.6 N20電機及驅動(電機選型:DC 12V A12型)
1.7 無刷電機動量輪模組
該電機自帶驅動和光電編碼器。
該自平衡自行車中我們使用萬寶至無刷伺服電機,內置驅動,支持正反轉,PWM調速,并且帶有100線編碼器AB相雙通道信號輸出。
該電機接線圖如上圖所示,實際小車中的線的顏色可能與上圖有所不符,大家要按照位置來判斷而不是線的顏色。
1.信號A相和信號B相為編碼器脈沖輸出端;
2.正反轉切換的線我們直接用單片機的引腳3.3V電平控制,是完全沒有問題的;
3.編碼器供電接3.3V;
4.PWM接單片機的PWM輸出,啟動運行我們接單片機IO口,在電機初始化時置為高電平;
5.電源負極接GND,電源正極接12V。
1.8? 舵機
項目中所使用,有點小貴,可以買便宜的。
1.9? 3S航模電池(注意電池尺寸)
1.10 穩壓模塊及開關
將航模電池電壓降至5V給單片機、舵機、藍牙、超聲波、電機編碼器供電。
1.11? 輪子及軸承
由于小車后輪是通過皮帶傳動,為減小摩擦,使后輪轉動更加順滑,需在后輪安裝微型軸承。(軸承根據車軸尺寸購買)
1.12? 車架及轉向結構(3D打印)
13. 電路PCB
將上述功能模塊集成在一塊PCB電路板上(6.5x7.8cm),為方便焊接,電容電阻及三極管均為直插式元件。
02?
軟件篇
2.1??main.c
#include?"sys.h"? float?AdcValue;???????????????????????//電池電壓數字量 float?Pitch,Roll,Yaw;?????????????????//角度 short aacx,aacy,aacz; //加速度傳感器原始數據 short?gyrox,gyroy,gyroz;??????????????//陀螺儀原始數據 int PWM1; int PWM_MAX=6500,PWM_MIN=-6500; //PWM限幅變量 int?Encoder_Motor;??//編碼器數據(速度)? int main(void) { NVIC_Config();delay_init();Led_Init();Beep_Init();Wave_SRD_Init();uart3_init(9600);OLED_Init(); //初始化OLED OLED_Clear();adc_Init();MOTOR_1_Init();MOTOR_2_Init();PWM_Init_TIM3(7199,0);//定時器3初始化PWM 10KHZ,用于驅動動量輪電機 PWM_Init_TIM2(9999, 143);//定時器2初始化PWM 50HZ,用于驅動舵機TIM_SetCompare1(TIM2, 790);//舵機復位Init_TIM1(9998,7199);Encoder_Init_TIM4(65535,0);OLED_ShowString(25,4,"MPU6050...",16);MPU_Init(); //MPU6050初始化 while(mpu_dmp_init()){OLED_ShowString(25,4,"MPU6050 Error",16);} OLED_ShowString(25,4,"MPU6050 OK!",16); Beep=1;delay_ms(400);Beep=0;MPU6050_EXTI_Init();OLED_Clear();OLED_ShowString(0,0,"Roll : C",16);OLED_ShowString(0,3,"Speed: R ",16);OLED_ShowString(0,6,"Power: V ",16); while(1){ Wave_SRD_Strat(); AdcValue=11.09*(3.3*Get_adc_Average(ADC_Channel_4,10)/0x0fff); //ADC值范圍為從0-2^12=4095(111111111111)一般情況下對應電壓為0-3.3VOLED_Showdecimal(55,0,Roll,9,16); OLED_Showdecimal(55,3,Encoder_Motor*0.25,9,16); OLED_Showdecimal(50,6,AdcValue,9,16); } }2.2??PID控制算法
學習視頻:
該小車實現直立平衡需要用到兩個閉環控制,即直立環(PD控制、負反饋),速度環(PI控制、正反饋),代碼原理及調試過程與兩輪平衡小車調試過程基本一致。
關于PID控制算法的學習,內容較多,不好詳細展開,網上資源豐富,大家可自行學習。
這里推薦一篇知乎文章:https://zhuanlan.zhihu.com/p/39573490
2.3?代碼閱讀注意點
所有頭文件都包含在sys.h中,每個.h文件都包含sys.h,方便函數調用。
#ifndef __SYS_H #define __SYS_H #include "stm32f10x.h" #include "adc.h" #include "oled.h" #include "led.h" #include "beep.h" #include "wave.h" #include "control.h" #include "exti.h" #include "mpu6050.h" #include "inv_mpu.h" #include "inv_mpu_dmp_motion_driver.h" #include "motor.h" #include "pwm.h" #include "encoder.h" #include "usart.h" #include "delay.h" #include <math.h> #include <stdlib.h>STM32F10x系列的MCU復位后,PA13/14/15 & PB3/4默認配置為JTAG功能。有時我們為了充分利用MCU I/O口的資源,會把這些端口設置為普通I/O口。
使用JLINK向STM32燒錄程序時,需要使用6個芯片的引腳(以STM32F103C8T6為例),分別是PB4 / JNTRST,PB3 / JTDO,PA13 / JTMS,PA14 / JTCK,PA15 / JTDI,NRST。
當芯片IO口資源比較緊張時,可選擇SW模式燒錄程序。
SWD只需用到PA13 / JTMS,PA14 / JTCK兩根線,NREST可以接可不接,剩下的PB4 / JNTRST,PB3 / JTDO和PA15 / JTDI就可以當然普通IO使用,但是這三個口當然普通IO使用時需要先進行如下配置。(這里MPU6050模塊用到PB3和PB4引腳)
03
最后
3.1 作品照片
3.2 獲取方式
加入星球的同學,可以直接到星球內下載。
未加入星球的的同學,可以添加微信:great_xiaolong,加好友記得備注:自行車。
對了,借此推薦下知識星球,星球現在已有120+人加入,有興趣加入的朋友可以添加上方微信咨詢,現在加入有一定優惠。
-END-
一個億的融資在一家芯片初創公司可以燒多久?
STM32為何在諸多的單片機中脫穎而出?
搞硬件,別吹牛了,好好做個規劃!
一名教電子的大學老師,歡迎關注!
總結
以上是生活随笔為你收集整理的做一辆超mini平衡自行车,全开源!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奥克斯空调e4故障代码解说
- 下一篇: 天启之门手游关服原因是什么(天启是什么意