久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4884|回復: 3
打印 上一主題 下一主題
收起左側

stm32F1+mpu6050平衡車源代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:472829 發表于 2019-1-25 14:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
stm32F1 平衡車源代碼,采用亞博智能小車拓展板,采用MPU6050  INT腳中斷,本代碼只有直立環,后續代碼稍后上傳

單片機源程序如下:
  1. #include "mpu6050.h"
  2. #include "sys.h"
  3. #include "delay.h"
  4. #include "usart.h"   

  5. //初始化MPU6050
  6. //返回值:0,成功
  7. //    其他,錯誤代碼
  8. u8 MPU_Init(void)
  9. {
  10.         u8 res;
  11.   GPIO_InitTypeDef  GPIO_InitStructure;
  12.         
  13.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO時鐘
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//先使能外設IO PORTA時鐘
  15.         
  16.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;         // 端口配置
  17.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽輸出
  18.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度為50MHz
  19.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根據設定參數初始化GPIOA

  20.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁止JTAG,從而PA15可以做普通IO使用,否則PA15不能做普通IO!!!
  21.         
  22.         MPU_AD0_CTRL=0;                        //控制MPU6050的AD0腳為低電平,從機地址為:0X68
  23.         
  24.         MPU_IIC_Init(); //初始化IIC總線
  25.         MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);        //復位MPU6050
  26.   delay_ms(100);
  27.         MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);        //喚醒MPU6050
  28.         MPU_Set_Gyro_Fsr(3);                                        //陀螺儀傳感器,±2000dps
  29.         MPU_Set_Accel_Fsr(0);                                        //加速度傳感器,±2g
  30.         MPU_Set_Rate(200);                                                //設置采樣率50Hz
  31.         MPU_Write_Byte(MPU_INT_EN_REG,0X00);        //關閉所有中斷
  32.         MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);        //I2C主模式關閉
  33.         MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);        //關閉FIFO
  34.         MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);//INT引腳低電平有效
  35.         res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
  36.         if(res==MPU_ADDR)//器件ID正確
  37.         {
  38.                 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);        //設置CLKSEL,PLL X軸為參考
  39.                 MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);        //加速度與陀螺儀都工作
  40.                 MPU_Set_Rate(200);                                                //設置采樣率為50Hz
  41.          }else return 1;
  42.         return 0;
  43. }
  44. //設置MPU6050陀螺儀傳感器滿量程范圍
  45. //fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps
  46. //返回值:0,設置成功
  47. //    其他,設置失敗
  48. u8 MPU_Set_Gyro_Fsr(u8 fsr)
  49. {
  50.         return MPU_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//設置陀螺儀滿量程范圍  
  51. }
  52. //設置MPU6050加速度傳感器滿量程范圍
  53. //fsr:0,±2g;1,±4g;2,±8g;3,±16g
  54. //返回值:0,設置成功
  55. //    其他,設置失敗
  56. u8 MPU_Set_Accel_Fsr(u8 fsr)
  57. {
  58.         return MPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//設置加速度傳感器滿量程范圍  
  59. }
  60. //設置MPU6050的數字低通濾波器
  61. //lpf:數字低通濾波頻率(Hz)
  62. //返回值:0,設置成功
  63. //    其他,設置失敗
  64. u8 MPU_Set_LPF(u16 lpf)
  65. {
  66.         u8 data=0;
  67.         if(lpf>=188)data=1;
  68.         else if(lpf>=98)data=2;
  69.         else if(lpf>=42)data=3;
  70.         else if(lpf>=20)data=4;
  71.         else if(lpf>=10)data=5;
  72.         else data=6;
  73.         return MPU_Write_Byte(MPU_CFG_REG,data);//設置數字低通濾波器  
  74. }
  75. //設置MPU6050的采樣率(假定Fs=1KHz)
  76. //rate:4~1000(Hz)
  77. //返回值:0,設置成功
  78. //    其他,設置失敗
  79. u8 MPU_Set_Rate(u16 rate)
  80. {
  81.         u8 data;
  82.         if(rate>1000)rate=1000;
  83.         if(rate<4)rate=4;
  84.         data=1000/rate-1;
  85.         data=MPU_Write_Byte(MPU_SAMPLE_RATE_REG,data);        //設置數字低通濾波器
  86.          return MPU_Set_LPF(rate/2);        //自動設置LPF為采樣率的一半
  87. }

  88. //得到溫度值
  89. //返回值:溫度值(擴大了100倍)
  90. short MPU_Get_Temperature(void)
  91. {
  92.     u8 buf[2];
  93.     short raw;
  94.         float temp;
  95.         MPU_Read_Len(MPU_ADDR,MPU_TEMP_OUTH_REG,2,buf);
  96.     raw=((u16)buf[0]<<8)|buf[1];  
  97.     temp=36.53+((double)raw)/340;  
  98.     return temp*100;;
  99. }
  100. //得到陀螺儀值(原始值)
  101. //gx,gy,gz:陀螺儀x,y,z軸的原始讀數(帶符號)
  102. //返回值:0,成功
  103. //    其他,錯誤代碼
  104. u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz)
  105. {
  106.     u8 buf[6],res;  
  107.         res=MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf);
  108.         if(res==0)
  109.         {
  110.                 *gx=((u16)buf[0]<<8)|buf[1];  
  111.                 *gy=((u16)buf[2]<<8)|buf[3];  
  112.                 *gz=((u16)buf[4]<<8)|buf[5];
  113.         }         
  114.     return res;;
  115. }
  116. //得到加速度值(原始值)
  117. //gx,gy,gz:陀螺儀x,y,z軸的原始讀數(帶符號)
  118. //返回值:0,成功
  119. //    其他,錯誤代碼
  120. u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az)
  121. {
  122.     u8 buf[6],res;  
  123.         res=MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);
  124.         if(res==0)
  125.         {
  126.                 *ax=((u16)buf[0]<<8)|buf[1];  
  127.                 *ay=((u16)buf[2]<<8)|buf[3];  
  128.                 *az=((u16)buf[4]<<8)|buf[5];
  129.         }         
  130.     return res;;
  131. }
  132. //IIC連續寫
  133. //addr:器件地址
  134. //reg:寄存器地址
  135. //len:寫入長度
  136. //buf:數據區
  137. //返回值:0,正常
  138. //    其他,錯誤代碼
  139. u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
  140. {
  141.         u8 i;
  142.     MPU_IIC_Start();
  143.         MPU_IIC_Send_Byte((addr<<1)|0);//發送器件地址+寫命令        
  144.         if(MPU_IIC_Wait_Ack())        //等待應答
  145.         {
  146.                 MPU_IIC_Stop();                 
  147.                 return 1;               
  148.         }
  149.     MPU_IIC_Send_Byte(reg);        //寫寄存器地址
  150.     MPU_IIC_Wait_Ack();                //等待應答
  151.         for(i=0;i<len;i++)
  152.         {
  153.                 MPU_IIC_Send_Byte(buf[i]);        //發送數據
  154.                 if(MPU_IIC_Wait_Ack())                //等待ACK
  155.                 {
  156.                         MPU_IIC_Stop();         
  157.                         return 1;                 
  158.                 }               
  159.         }   
  160.     MPU_IIC_Stop();         
  161.         return 0;        
  162. }
  163. //IIC連續讀
  164. //addr:器件地址
  165. //reg:要讀取的寄存器地址
  166. //len:要讀取的長度
  167. //buf:讀取到的數據存儲區
  168. //返回值:0,正常
  169. //    其他,錯誤代碼
  170. u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
  171. {
  172.          MPU_IIC_Start();
  173.         MPU_IIC_Send_Byte((addr<<1)|0);//發送器件地址+寫命令        
  174.         if(MPU_IIC_Wait_Ack())        //等待應答
  175.         {
  176.                 MPU_IIC_Stop();                 
  177.                 return 1;               
  178.         }
  179.     MPU_IIC_Send_Byte(reg);        //寫寄存器地址
  180.     MPU_IIC_Wait_Ack();                //等待應答
  181.     MPU_IIC_Start();
  182.         MPU_IIC_Send_Byte((addr<<1)|1);//發送器件地址+讀命令        
  183.     MPU_IIC_Wait_Ack();                //等待應答
  184.         while(len)
  185.         {
  186.                 if(len==1)*buf=MPU_IIC_Read_Byte(0);//讀數據,發送nACK
  187.                 else *buf=MPU_IIC_Read_Byte(1);                //讀數據,發送ACK  
  188.                 len--;
  189.                 buf++;
  190.         }   
  191.     MPU_IIC_Stop();        //產生一個停止條件
  192.         return 0;        
  193. }
  194. //IIC寫一個字節
  195. //reg:寄存器地址
  196. //data:數據
  197. //返回值:0,正常
  198. //    其他,錯誤代碼
  199. u8 MPU_Write_Byte(u8 reg,u8 data)                                 
  200. {
  201.     MPU_IIC_Start();
  202.         MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//發送器件地址+寫命令        
  203.         if(MPU_IIC_Wait_Ack())        //等待應答
  204.         {
  205.                 MPU_IIC_Stop();                 
  206.                 return 1;               
  207.         }
  208.     MPU_IIC_Send_Byte(reg);        //寫寄存器地址
  209.     MPU_IIC_Wait_Ack();                //等待應答
  210.         MPU_IIC_Send_Byte(data);//發送數據
  211.         if(MPU_IIC_Wait_Ack())        //等待ACK
  212.         {
  213.                 MPU_IIC_Stop();         
  214.                 return 1;                 
  215.         }                 
  216.     MPU_IIC_Stop();         
  217.         return 0;
  218. }
  219. //IIC讀一個字節
  220. //reg:寄存器地址
  221. //返回值:讀到的數據
  222. u8 MPU_Read_Byte(u8 reg)
  223. {
  224.         u8 res;
  225.     MPU_IIC_Start();
  226.         MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//發送器件地址+寫命令        
  227.         MPU_IIC_Wait_Ack();                //等待應答
  228.     MPU_IIC_Send_Byte(reg);        //寫寄存器地址
  229.     MPU_IIC_Wait_Ack();                //等待應答
  230.     MPU_IIC_Start();
  231.         MPU_IIC_Send_Byte((MPU_ADDR<<1)|1);//發送器件地址+讀命令        
  232.     MPU_IIC_Wait_Ack();                //等待應答
  233.         res=MPU_IIC_Read_Byte(0);//讀取數據,發送nACK
  234.     MPU_IIC_Stop();                        //產生一個停止條件
  235.         return res;               
  236. }
復制代碼
  1. #include "sys.h"        
  2. #include "delay.h"        
  3. #include "led.h"
  4. #include "Motor.h"
  5. #include "usart.h"
  6. #include "timer.h"
  7. #include "pid.h"
  8. #include "oled.h"
  9. #include "mpu6050.h"
  10. #include "usmart.h"   
  11. #include "inv_mpu.h"
  12. #include "inv_mpu_dmp_motion_driver.h"

  13. //串口1發送1個字符
  14. //c:要發送的字符
  15. u8 a = 0;
  16. u16 Kms;

  17. float pitch;
  18. float roll,yaw;                 //歐拉角         
  19. short gyrox,gyroy,gyroz;        //陀螺儀原始數據
  20. short aacx,aacy,aacz;                //加速度傳感器原始數據

  21. void usart1_send_char(u8 c)
  22. {           
  23.         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //循環發送,直到發送完畢   
  24.         USART_SendData(USART1,c);  
  25. }
  26. //傳送數據給匿名四軸上位機軟件(V2.6版本)
  27. //fun:功能字. 0XA0~0XAF
  28. //data:數據緩存區,最多28字節!!
  29. //len:data區有效數據個數
  30. void usart1_niming_report(u8 fun,u8*data,u8 len)
  31. {
  32.         u8 send_buf[32];
  33.         u8 i;
  34.         if(len>28)return;        //最多28字節數據
  35.         send_buf[len+3]=0;        //校驗數置零
  36.         send_buf[0]=0X88;        //幀頭
  37.         send_buf[1]=fun;        //功能字
  38.         send_buf[2]=len;        //數據長度
  39.         for(i=0;i<len;i++)send_buf[3+i]=data[i];                        //復制數據
  40.         for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i];        //計算校驗和        
  41.         for(i=0;i<len+4;i++)usart1_send_char(send_buf[i]);        //發送數據到串口1
  42. }
  43. //發送加速度傳感器數據和陀螺儀數據
  44. //aacx,aacy,aacz:x,y,z三個方向上面的加速度值
  45. //gyrox,gyroy,gyroz:x,y,z三個方向上面的陀螺儀值
  46. void mpu6050_send_data(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz)
  47. {
  48.         u8 tbuf[12];
  49.         tbuf[0]=(aacx>>8)&0XFF;
  50.         tbuf[1]=aacx&0XFF;
  51.         tbuf[2]=(aacy>>8)&0XFF;
  52.         tbuf[3]=aacy&0XFF;
  53.         tbuf[4]=(aacz>>8)&0XFF;
  54.         tbuf[5]=aacz&0XFF;
  55.         tbuf[6]=(gyrox>>8)&0XFF;
  56.         tbuf[7]=gyrox&0XFF;
  57.         tbuf[8]=(gyroy>>8)&0XFF;
  58.         tbuf[9]=gyroy&0XFF;
  59.         tbuf[10]=(gyroz>>8)&0XFF;
  60.         tbuf[11]=gyroz&0XFF;
  61.         usart1_niming_report(0XA1,tbuf,12);//自定義幀,0XA1
  62. }        
  63. //通過串口1上報結算后的姿態數據給電腦
  64. //aacx,aacy,aacz:x,y,z三個方向上面的加速度值
  65. //gyrox,gyroy,gyroz:x,y,z三個方向上面的陀螺儀值
  66. //roll:橫滾角.單位0.01度。 -18000 -> 18000 對應 -180.00  ->  180.00度
  67. //pitch:俯仰角.單位 0.01度。-9000 - 9000 對應 -90.00 -> 90.00 度
  68. //yaw:航向角.單位為0.1度 0 -> 3600  對應 0 -> 360.0度
  69. void usart1_report_imu(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw)
  70. {
  71.         u8 tbuf[28];
  72.         u8 i;
  73.         for(i=0;i<28;i++)tbuf[i]=0;//清0
  74.         tbuf[0]=(aacx>>8)&0XFF;
  75.         tbuf[1]=aacx&0XFF;
  76.         tbuf[2]=(aacy>>8)&0XFF;
  77.         tbuf[3]=aacy&0XFF;
  78.         tbuf[4]=(aacz>>8)&0XFF;
  79.         tbuf[5]=aacz&0XFF;
  80.         tbuf[6]=(gyrox>>8)&0XFF;
  81.         tbuf[7]=gyrox&0XFF;
  82.         tbuf[8]=(gyroy>>8)&0XFF;
  83.         tbuf[9]=gyroy&0XFF;
  84.         tbuf[10]=(gyroz>>8)&0XFF;
  85.         tbuf[11]=gyroz&0XFF;        
  86.         tbuf[18]=(roll>>8)&0XFF;
  87.         tbuf[19]=roll&0XFF;
  88.         tbuf[20]=(pitch>>8)&0XFF;
  89.         tbuf[21]=pitch&0XFF;
  90.         tbuf[22]=(yaw>>8)&0XFF;
  91.         tbuf[23]=yaw&0XFF;
  92.         usart1_niming_report(0XAF,tbuf,28);//飛控顯示幀,0XAF
  93. }  


  94. int main(void)
  95. {        
  96.          
  97.         u8 i,report=1;
  98.   
  99.         
  100.         delay_init();                     //延時函數初始化        
  101.    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級                 
  102.         uart_init(115200);         //串口初始化為115200
  103.      delay_ms(100);
  104.           MPU_Init();                                        //初始化MPU6050
  105.         
  106.         
  107.             Motor_Init();        
  108.    
  109.            TIM2_PWM_Init(7199,0);         //不分頻。PWM頻率=72000000/900=80Khz
  110.       PID_Init();
  111.           LED_Init();//LED端口初始化
  112.          

  113.      mpu_dmp_init();
  114.                
  115.         MPU6050_EXTI_Init();//外部中斷初始化
  116.          
  117.         
  118.          
  119. while(1)
  120.         {
  121.                         
  122.                
  123.         }         
  124. }

復制代碼

所有資料51hei提供下載:
平衡版.7z (277.58 KB, 下載次數: 89)
BST STM32智能平衡小車.pdf (40 KB, 下載次數: 63)

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2019-1-25 15:23 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

板凳
ID:119642 發表于 2020-2-19 19:59 | 只看該作者
黑51這個網站是比較厲害了。這個資料都出來了。
回復

使用道具 舉報

地板
ID:730307 發表于 2020-4-16 09:39 | 只看該作者
不錯不錯
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久久久香蕉网 | h视频在线免费 | 精品二区| 国产成人网 | 99久久精品免费看国产四区 | 色屁屁在线观看 | 一区二区三区观看视频 | 精品1区2区 | 日韩高清三区 | 国产美女精品视频 | 天天射网站 | 欧美日韩精品久久久免费观看 | 一区观看| 欧美在线视频一区二区 | 亚洲av毛片 | 国产精品区二区三区日本 | 国产一区二区精品在线观看 | 欧美性a视频| 亚洲精品福利在线 | 欧美日韩亚洲在线 | 国产一区二区日韩 | 日韩在线一区二区三区 | 国产成人综合网 | 中文字幕欧美日韩 | 青草视频在线 | 久久国产婷婷国产香蕉 | 一区二区三区在线播放 | 成人一区二区三区 | 成人免费大片黄在线播放 | 国产精品一区在线 | 中文字幕日韩欧美 | 日韩中文字幕av | 成人免费在线视频 | 欧美成人一级视频 | 欧美一区二区三区的 | 午夜国产一级片 | 久久久久久久亚洲精品 | 国产欧美一区二区精品忘忧草 | 亚洲69p| 久久婷婷香蕉热狠狠综合 | 欧美综合一区二区三区 |