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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

IAR for STM32平衡車源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:362707 發表于 2018-7-1 21:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
IARfor STM32平衡車源程序
  1. /****************************************************************************/
  2. //車輪直徑 6.7cm   周長21cm  電機轉一圈接收到1496個脈沖
  3. //則一個脈沖對應0.14mm
  4. /****************************************************************************/
  5. #include "bsp.h"



  6. extern uint16_t Speed_Left,Speed_Right;
  7. uint16_t a;
  8. uint16_t b=0;

  9. float situ_pitch;
  10. int16_t situ_gyroy;//全局變量以便直立PID使用


  11. //串口1發送1個字符
  12. //c:要發送的字符
  13. void usart1_send_char(u8 c)
  14. {           
  15.         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //循環發送,直到發送完畢   
  16.         USART_SendData(USART1,c);  
  17. }
  18. //傳送數據給匿名四軸上位機軟件(V2.6版本)
  19. //fun:功能字. 0XA0~0XAF
  20. //data:數據緩存區,最多28字節!!
  21. //len:data區有效數據個數
  22. void usart1_niming_report(u8 fun,u8*data,u8 len)
  23. {
  24.         u8 send_buf[32];
  25.         u8 i;
  26.         if(len>28)return;        //最多28字節數據
  27.         send_buf[len+3]=0;        //校驗數置零
  28.         send_buf[0]=0X88;        //幀頭
  29.         send_buf[1]=fun;        //功能字
  30.         send_buf[2]=len;        //數據長度
  31.         for(i=0;i<len;i++)send_buf[3+i]=data[i];                        //復制數據
  32.         for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i];        //計算校驗和        
  33.         for(i=0;i<len+4;i++)usart1_send_char(send_buf[i]);        //發送數據到串口1
  34. }
  35. //發送加速度傳感器數據和陀螺儀數據
  36. //aacx,aacy,aacz:x,y,z三個方向上面的加速度值
  37. //gyrox,gyroy,gyroz:x,y,z三個方向上面的陀螺儀值
  38. void mpu6050_send_data(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw,uint16_t Left,uint16_t Right)
  39. {
  40.         u8 tbuf[22];
  41.         tbuf[0]=(aacx>>8)&0XFF;
  42.         tbuf[1]=aacx&0XFF;
  43.         tbuf[2]=(aacy>>8)&0XFF;
  44.         tbuf[3]=aacy&0XFF;
  45.         tbuf[4]=(aacz>>8)&0XFF;
  46.         tbuf[5]=aacz&0XFF;
  47.         tbuf[6]=(gyrox>>8)&0XFF;
  48.         tbuf[7]=gyrox&0XFF;
  49.         tbuf[8]=(gyroy>>8)&0XFF;
  50.         tbuf[9]=gyroy&0XFF;
  51.         tbuf[10]=(gyroz>>8)&0XFF;
  52.         tbuf[11]=gyroz&0XFF;
  53.         
  54.         tbuf[12]=(roll>>8)&0XFF;
  55.         tbuf[13]=roll&0XFF;
  56.         tbuf[14]=(pitch>>8)&0XFF;
  57.         tbuf[15]=pitch&0XFF;
  58.         tbuf[16]=(yaw>>8)&0XFF;
  59.         tbuf[17]=yaw&0XFF;
  60.         
  61.         tbuf[18]=(Left>>8)&0XFF;
  62.         tbuf[19]=Left&0XFF;
  63.         tbuf[20]=(Right>>8)&0XFF;
  64.         tbuf[21]=Right&0XFF;
  65.         
  66.         usart1_niming_report(0XA1,tbuf,22);//自定義幀,0XA1
  67. }        

  68. //發送左右電機速度
  69. //left right左右電機速度值
  70. void motor_send_speed(uint16_t left,uint16_t right)
  71. {
  72.         u8 tbuf[4];
  73.         tbuf[0]=(left>>8)&0XFF;
  74.         tbuf[1]=left&0XFF;
  75.         tbuf[2]=(right>>8)&0XFF;
  76.         tbuf[3]=right&0XFF;
  77.         usart1_niming_report(0XA1,tbuf,4);//自定義幀,0XA1
  78. }        
  79. //通過串口1上報結算后的姿態數據給電腦
  80. //aacx,aacy,aacz:x,y,z三個方向上面的加速度值
  81. //gyrox,gyroy,gyroz:x,y,z三個方向上面的陀螺儀值
  82. //roll:橫滾角.單位0.01度。 -18000 -> 18000 對應 -180.00  ->  180.00度
  83. //pitch:俯仰角.單位 0.01度。-9000 - 9000 對應 -90.00 -> 90.00 度
  84. //yaw:航向角.單位為0.1度 0 -> 3600  對應 0 -> 360.0度
  85. void usart1_report_imu(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw)
  86. {
  87.         u8 tbuf[28];
  88.         u8 i;
  89.         for(i=0;i<28;i++)tbuf[i]=0;//清0
  90.         tbuf[0]=(aacx>>8)&0XFF;
  91.         tbuf[1]=aacx&0XFF;
  92.         tbuf[2]=(aacy>>8)&0XFF;
  93.         tbuf[3]=aacy&0XFF;
  94.         tbuf[4]=(aacz>>8)&0XFF;
  95.         tbuf[5]=aacz&0XFF;
  96.         tbuf[6]=(gyrox>>8)&0XFF;
  97.         tbuf[7]=gyrox&0XFF;
  98.         tbuf[8]=(gyroy>>8)&0XFF;
  99.         tbuf[9]=gyroy&0XFF;
  100.         tbuf[10]=(gyroz>>8)&0XFF;
  101.         tbuf[11]=gyroz&0XFF;        
  102.         tbuf[18]=(roll>>8)&0XFF;
  103.         tbuf[19]=roll&0XFF;
  104.         tbuf[20]=(pitch>>8)&0XFF;
  105.         tbuf[21]=pitch&0XFF;
  106.         tbuf[22]=(yaw>>8)&0XFF;
  107.         tbuf[23]=yaw&0XFF;
  108.         
  109.         usart1_niming_report(0XAF,tbuf,28);//飛控顯示幀,0XAF
  110. }  




  111. /*********************************************************************************************************************/
  112.          
  113. int main(void)
  114. {        
  115. /******************************************************************************/
  116. //                              變量聲明
  117. /******************************************************************************/  
  118.           GPIO_InitTypeDef  GPIOB_InitStructure;
  119.         GPIO_InitTypeDef  GPIOC_InitStructure;
  120.         float pitch,roll,yaw;                 //歐拉角
  121.         short aacx,aacy,aacz;                //加速度傳感器原始數據
  122.         short gyrox,gyroy,gyroz;        //陀螺儀原始數據
  123. //        short temp;                                        //溫度        
  124.         
  125. /******************************************************************************/
  126. //                              模塊初始化
  127. /******************************************************************************/         
  128.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
  129.         uart_init(115200);         //串口初始化
  130.         delay_init();                //延時初始化
  131.         All_GPIO_Init();
  132.         OLED_Init();                //OLED初始化
  133.         OLED_Clear();                //OLED清屏
  134.         MPU_Init();                //初始化MPU6050
  135.         TIM3_Cap_Init();        //左編碼器初始化
  136.         TIM4_Cap_Init();        //右編碼器初始化
  137.         Motor_Left_Init(100);    //左電機初始化
  138.         Motor_Right_Init(100);        //右電機初始化
  139.         TIM1_Int_Init(10);      //定時器初始化 定時10ms
  140.         
  141.         
  142.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB  |
  143.                                 RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD  |
  144.                                 RCC_APB2Periph_GPIOE, ENABLE);                 //使能A,B,C,D,E端口時鐘

  145. /***************************************燈的IO口*****************************************/        
  146.         GPIOC_InitStructure.GPIO_Pin = GPIO_Pin_13;         
  147.          GPIOC_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  148.         GPIOC_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  149.          GPIO_Init(GPIOC, &GPIOC_InitStructure);          //初始化GPIOC13
  150.         
  151. /**************************************電機的IO口****************************************/        
  152.         GPIOB_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_8|GPIO_Pin_9;         
  153.          GPIOB_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  154.         GPIOB_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  155.          GPIO_Init(GPIOB, &GPIOB_InitStructure);          //初始化B0 B1 B8 B9        
  156.         
  157.         
  158.         PCout(13)=0;//亮燈        
  159.         PBout(0)=1;
  160.         PBout(1)=0;//A端 右輪        
  161.         PBout(8)=1;
  162.         PBout(9)=0;//B端 左輪
  163. /******************************************************************************/
  164. //                              主程序
  165. /******************************************************************************/
  166.         
  167.         while(mpu_dmp_init());
  168.         while(1)
  169.         {

  170.           if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
  171.           {
  172.         //      temp=MPU_Get_Temperature();        //得到溫度值
  173.         
  174.               MPU_Get_Accelerometer(&aacx,&aacy,&aacz);        //得到加速度傳感器數據

  175.               MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);        //得到陀螺儀數據
  176.               situ_pitch=pitch;
  177.               situ_gyroy=gyroy;
  178.              mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)((pitch+4)*100),(int)(yaw*10),Speed_Left*10,Speed_Right*10);//用自定義幀發送加速度和陀螺儀原始數據
  179.         //      usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
  180.          //     OLED_ShowNum(0,0,(int)(pitch*100),10,16);
  181.             
  182.             
  183.                 Motor_Right_Duty(PID_Stand(situ_pitch,situ_gyroy));
  184.                 Motor_Left_Duty(PID_Stand(situ_pitch,situ_gyroy));
  185.               
  186.           }
  187.         }

  188.         
  189.         
  190.         
  191.         
  192.         
  193.         
  194.         

  195. }




  196.                


  197.         
  198.         
  199. /******************************************************************************/
  200. //                              定時器2中斷服務程序
  201. /******************************************************************************/
  202. void TIM1_UP_IRQHandler(void)
  203. {
  204.         if(TIM_GetITStatus(TIM1,TIM_IT_Update)!=RESET)
  205.         {         
  206.                 TIM_ClearFlag(TIM1,TIM_IT_Update);//清中斷標志位
  207.                 Speed_Left = Read_TIM3_Encoder()*14;//單位:cm/s * 10
  208.                 Speed_Right = Read_TIM4_Encoder()*14;//單位:cm/s * 10
  209.                

  210.         //        Motor_Right_Duty(PID_RIGHT(50)/14);
  211.         //        Motor_Left_Duty(PID_LEFT(0)/14);
  212.         //        motor_send_speed(Speed_Left,Speed_Right);
  213.                 TIM4->CNT=0;
  214.                 TIM3->CNT=0;
  215.                
  216.                
  217.         }
  218. }        
復制代碼


IAR_STM32_平衡車.rar

9.83 MB, 下載次數: 38, 下載積分: 黑幣 -5

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:370117 發表于 2018-7-15 18:14 | 只看該作者
很好,很受用
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品一区二区第一页 | 亚洲在线一区二区三区 | 亚州精品天堂中文字幕 | 91看片免费 | 亚洲成av人片在线观看 | 午夜精品网站 | 免费黄色av网站 | 久久精品久久综合 | 中文字幕在线免费 | 精品日韩一区 | 欧美日本一区 | 国产精品夜夜夜一区二区三区尤 | 成人在线观看黄 | 中文字幕在线网 | 狠狠的操 | www.国产.com| 久久免费视频观看 | 免费黄色的视频 | 午夜免费视频 | 欧美激情综合 | 最新免费视频 | 九九热在线视频免费观看 | 久久久久久久久久一区 | 日韩欧美福利视频 | 日韩在线免费视频 | 欧美成人一区二区三区片免费 | 日韩亚洲欧美综合 | 欧美精品v国产精品v日韩精品 | 欧美日韩高清在线一区 | 伊人久操 | 免费国产黄 | 影视一区 | 久久久国产一区二区三区四区小说 | 天堂资源最新在线 | 日韩精品一区二区三区在线播放 | 国产成人精品999在线观看 | 91黄色免费看 | 日本久久精 | av日韩精品| 国产精品成人一区二区三区 | 亚洲一区二区视频在线播放 |