電賽作品、stm32單片機主控的兩輪平衡小車全套設計資料分享給大家
Altium Designer畫的兩輪平衡小車電路原理圖和PCB圖如下:(51hei附件中可下載工程文件)
00 - 兩輪自平衡小車主控板(TWABV v1.1.0)_BOM_20140918.xls
CAD圖及3D加工圖:
底盤鈑金3D圖及加工要求
厚度 3mm
鋁板
表面噴砂氧化本色處理
折彎后要保證和3D模型相同
上層和中層亞克力3D圖及CAD圖
安卓藍牙遙控器APK及源碼
BtSpp安卓藍牙控制APP+源碼
運動控制MCU源代碼(STM32F103RCT6)+姿態解算MCU源代碼(STM32F103C8T6)
- /* main.c file
- 編譯環境:MDK-Lite Version: 4.23
- 測試: 本程序已在第七實驗室的mini IMU上完成測試
- 功能:
- 1.初始化各個傳感器,
- 2.運行姿態解算和高度測量
- 3.將解算的姿態和各個傳感器的輸出上傳到 MiniIMU AHRS 測試軟件
- 4.響應 PC發送的命令
- ------------------------------------*/
- /*----------------------------------------------------------------
- 1/去掉氣壓傳感器數據接口
- 2/保持幀格式
- 3/數據輸出頻率調整為20hz
- 4/調整機頭方向
- 5/保留陀螺儀標零偏
- 6/去掉UART1數據輸出
- 7/只輸出姿態數據結算幀
- 8/在數據融合時去掉磁力計的影響
- 9/上電數據即可用,不用等待
- ----------------------------------------------------------------*/
- #include "common.h" //包含所有的驅動 頭文件
- //上傳數據的狀態機
- #define REIMU 0x01 //上傳解算的姿態數據
- #define REMOV 0x02 //上傳傳感器的輸出
- #define REHMC 0x03 //上傳磁力計的標定值
- #define Upload_Speed 100 //數據上傳速度 單位 Hz
- #define upload_time (1000000/Upload_Speed) //計算上傳的時間。單位為us
- int16_t ax, ay, az;
- int16_t gx, gy, gz;
- int16_t hx, hy, hz;
- int32_t Temperature = 0, Pressure = 0, Altitude = 0;
- uint32_t system_micrsecond;
- int16_t hmcvalue[3];
- u8 state= REIMU; //發送特定幀 的狀態機
- /**************************實現函數********************************************
- *函數原型: int main(void)
- *功 能: 主程序
- *******************************************************************************/
- int main(void)
- {
- int16_t Math_hz=0;
- unsigned char PC_comm; //PC 命令關鍵字節
- float ypr[3]; // yaw pitch roll
- /* 配置系統時鐘為72M 使用外部8M晶體+PLL*/
- //SystemInit();
- delay_init(72); //延時初始化
- Initial_LED_GPIO(); //初始化STM32-SDK板子上的LED接口
- Initial_PWMLED();
- Initial_UART2(115200L);
- load_config(); //從flash中讀取配置信息 -->eeprom.c
- IIC_Init(); //初始化I2C接口
- delay_ms(300); //等待器件上電
- //UART1_Put_String("Initialize...\r\n");
- IMU_init(); //初始化IMU和傳感器
- system_micrsecond=micros();
- while(1){ //主循環
-
- //delay_ms(1); //延時,不要算那么快。
- IMU_getYawPitchRoll(ypr); //姿態更新
- Math_hz++; //解算次數 ++
- //-------------上位機------------------------------
- //是否到了更新 上位機的時間了?
- if((micros()-system_micrsecond)>upload_time){
- switch(state){
- case REIMU:
- UART2_ReportIMU((int16_t)(ypr[0]*10.0),(int16_t)(ypr[1]*10.0),
- (int16_t)(ypr[2]*10.0),Altitude/10,Temperature,Pressure/10,Math_hz*Upload_Speed);
- Math_hz=0;
- // state = REMOV; //更改狀態。
- break;
- case REMOV:
- MPU6050_getlastMotion6(&ax, &ay, &az, &gx, &gy, &gz);
- HMC58X3_getlastValues(&hx,&hy,&hz);
- UART2_ReportMotion(ax,ay,az,gx,gy,gz,hx,hy,hz);
- state = REIMU;
- if(HMC5883_calib)state = REHMC; //需要發送當前磁力計標定值
- break;
- default:
- UART2_ReportHMC(HMC5883_maxx,HMC5883_maxy,HMC5883_maxz,
- HMC5883_minx,HMC5883_miny,HMC5883_minz,0);//發送標定值
- state = REIMU;
- break;
- }//switch(state)
- system_micrsecond=micros(); //取系統時間 單位 us
- LED_Change(); //LED1改變亮度
- }
- //--------------------------------------------------
- //處理PC發送來的命令
- if((PC_comm=UART2_CommandRoute())!=0xff)
- {
- switch(PC_comm){ //檢查命令標識
- case Gyro_init: MPU6050_InitGyro_Offset(); break; //讀取陀螺儀零偏
- case High_init: break; //氣壓高度 清零
- case HMC_calib_begin: HMC5883L_Start_Calib(); break; //開始磁力計標定
- case HMC_calib: HMC5883L_Save_Calib(); break; //保存磁力計標定
- }
- }// 處理PC 發送的命令
- }//主循環 while(1) 結束
- } //main
- //------------------End of File----------------------------
復制代碼- /**---------------------------------------------------------------
- 項目:兩輪自平衡小車(Two-Wheels Auto-Balancing Vechile)
- 版本:v1.0.0
- 文件: MotorDriver.c
- 功能:電機驅動
- 作者:flotox@yeah.net
- 日期:2014.9.5
- 更新:2014.9.5
- ----------------------------------------------------------------*/
- #include "stm32f10x.h"
- #include "MotorDriver.h"
- #include "GlobalVars.h"
- #define MOTOR_L_IN1_LOW (GPIO_ResetBits(GPIOC, GPIO_Pin_6))
- #define MOTOR_L_IN1_HIGH (GPIO_SetBits(GPIOC, GPIO_Pin_6))
- #define MOTOR_L_IN2_LOW (GPIO_ResetBits(GPIOA, GPIO_Pin_7))
- #define MOTOR_L_IN2_HIGH (GPIO_SetBits(GPIOA, GPIO_Pin_7))
- #define MOTOR_R_IN1_LOW (GPIO_ResetBits(GPIOA, GPIO_Pin_8))
- #define MOTOR_R_IN1_HIGH (GPIO_SetBits(GPIOA, GPIO_Pin_8))
- #define MOTOR_R_IN2_LOW (GPIO_ResetBits(GPIOB, GPIO_Pin_13))
- #define MOTOR_R_IN2_HIGH (GPIO_SetBits(GPIOB, GPIO_Pin_13))
- /**
- * @brief 電機驅動左輪配置
- * @param none
- * @retval none
- */
- void MotorDriver_L_Config(void){
-
- GPIO_InitTypeDef GPIO_InitStructure ;
- TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
- /*使能GPIOA、GPIOC、AFIO、TIM8外設時鐘*/
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO | RCC_APB2Periph_TIM8, ENABLE);
-
- /*初始化PA.07端口為Out_PP模式*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- /*初始化PC.06端口為Out_PP模式*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- /*初始化PC.07端口(TIM8_CH2)為AF_PP模式*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- /*定時器基本配置*/
- TIM_BaseInitStructure.TIM_Prescaler = 3-1; //時鐘預分頻數3,TIM8的計數時鐘頻率為24MHz
- TIM_BaseInitStructure.TIM_Period = 1000-1; //自動重裝載寄存器數值,PWM2頻率為24MHz/1000=24KHz
- TIM_BaseInitStructure.TIM_ClockDivision = 0; //采樣分頻
- TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數
- TIM_BaseInitStructure.TIM_RepetitionCounter = 0; //重復寄存器
- TIM_TimeBaseInit(TIM8, &TIM_BaseInitStructure);
- TIM_OCStructInit(&TIM_OCInitStructure);
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1輸出模式
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能該通道輸出
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性
- TIM_OC2Init(TIM8, &TIM_OCInitStructure); //按指定參數初始化
- TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable); //使能TIM8在CCR2上的預裝載寄存器
- TIM_ARRPreloadConfig(TIM8, ENABLE); //使能TIM8在ARR上的預裝載寄存器
-
- TIM_Cmd(TIM8, ENABLE); //打開TIM8
- TIM_CtrlPWMOutputs(TIM8, ENABLE); //PWM輸出使能
- }
- /**
- * @brief 電機驅動右輪配置
- * @param none
- * @retval none
- */
- void MotorDriver_R_Config(void){
- GPIO_InitTypeDef GPIO_InitStructure ;
- TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
- /*使能GPIOA、GPIOB、AFIO、TIM1外設時鐘*/
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_TIM1, ENABLE);
- /*初始化PA.08端口為Out_PP模式*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- /*初始化PB.13端口為Out_PP模式*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- /*初始化PA.09端口(TIM1_CH2)為AF_PP模式*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- /*定時器基本配置*/
- TIM_BaseInitStructure.TIM_Prescaler = 3-1; //時鐘預分頻數3,TIM1的計數時鐘頻率為24MHz
- TIM_BaseInitStructure.TIM_Period = 1000-1; //自動重裝載寄存器數值,PWM2頻率為24MHz/1000=24KHz
- TIM_BaseInitStructure.TIM_ClockDivision = 0; //采樣分頻
- TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數
- TIM_BaseInitStructure.TIM_RepetitionCounter = 0; //重復寄存器
- TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);
- TIM_OCStructInit(&TIM_OCInitStructure);
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1輸出模式
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能該通道輸出
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性
- TIM_OC2Init(TIM1, &TIM_OCInitStructure); //按指定參數初始化
- TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM1在CCR2上的預裝載寄存器
- TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIM1在ARR上的預裝載寄存器
- TIM_Cmd(TIM1, ENABLE); //打開TIM1
- TIM_CtrlPWMOutputs(TIM1, ENABLE); //PWM輸出使能
- }
- /**
- * @brief 左輪電機正轉
- * @param none
- * @retval none
- */
- void MotorDriver_L_Turn_Forward(void){
-
- MOTOR_L_IN1_LOW;
- MOTOR_L_IN2_HIGH;
- }
- /**
- * @brief 左輪電機反轉
- * @param none
- * @retval none
- */
- void MotorDriver_L_Turn_Reverse(void){
-
- MOTOR_L_IN1_HIGH;
- MOTOR_L_IN2_LOW;
- }
- /**
- * @brief 右輪電機正轉
- * @param none
- * @retval none
- */
- void MotorDriver_R_Turn_Forward(void){
-
- MOTOR_R_IN1_HIGH;
- MOTOR_R_IN2_LOW;
- }
- /**
- * @brief 右輪電機反轉
- * @param none
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
全部資料51hei下載地址:
【電賽作品、全套資料】基于STM32的兩輪平衡小車資料(硬件、MCU源碼、藍牙遙控器APK.zip
(16.04 MB, 下載次數: 459)
2018-10-24 13:10 上傳
點擊文件名下載附件
平衡車
|