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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1979|回復: 0
收起左側

STM32+mpu6050的iar環境下的demo代碼

[復制鏈接]
ID:472635 發表于 2019-1-24 20:44 | 顯示全部樓層 |閱讀模式
mpu6050的iar環境下的demo

單片機源程序如下:
  1. #include "sys.h"

  2. int16_t pid_calc(PID *pid)  
  3. {  
  4.   float out;  
  5.   float ep, ei, ed;  
  6.   
  7.   pid->e_0 = pid->target - pid->feedback;  
  8.   ep = pid->e_0  - pid->e_1;  
  9.   ei = pid->e_0;  
  10.   ed = pid->e_0 - 2*pid->e_1 + pid->e_2;  
  11.   out = pid->Kp*ep + pid->Ki*ei + pid->Kd*ed;  
  12.   out = range(out, -pid->limit, pid->limit);  
  13.   pid->e_2 = pid->e_1;  
  14.   pid->e_1 = pid->e_0;  
  15.   return (int16_t)out;  
  16. }

  17. s16 PIDCalc(LocationPID *pp,float NextPoint)
  18. {
  19.   float dError,Error;
  20.   Error=pp->SetPoint-NextPoint;
  21.   pp->SumError+=Error;
  22.   dError=Error-pp->LastError;
  23.   pp->PreError=pp->LastError;
  24.   pp->LastError=Error;
  25.   return (s16)(pp->Kp*Error+pp->Ki*pp->SumError+pp->Kd*dError);
  26. }

  27. void pid_init(PID *pid)
  28. {
  29.   pid->limit=1000;
  30.   pid->target=0.0;
  31.   pid->feedback=0.0;
  32.   pid->Kp=6.0;
  33.   pid->Ki=0.0;
  34.   pid->Kd=0.0;
  35.   pid->e_0=0.0;
  36.   pid->e_1=0.0;
  37.   pid->e_2=0.0;
  38. }

  39. void Location_PID_init(LocationPID *pp)
  40. {
  41.   pp->Kp=6.0;
  42.   pp->Kd=0;
  43.   pp->Ki=0;
  44.   pp->SetPoint=0;
  45. }
  46. #if PID_Select
  47. void Motor_Control(PID *pid,s16 *motor1,s16 *motor2,uint16_t throttle,float roll)
  48. {
  49.   if(roll>60||roll<-60)
  50.   {
  51.     motorFlag=0;
  52.     throttle=1000;
  53.     TIM_SetCompare3(TIM4,throttle);
  54.     TIM_SetCompare4(TIM4,throttle);
  55.   }
  56.   else
  57.   {
  58.     s16 pid_put_value;
  59.     pid->feedback=roll;
  60.     pid_put_value=pid_calc(pid);
  61.     *motor1+=pid_put_value;
  62.     *motor2-=pid_put_value;
  63.     if(*motor1+throttle<1000)
  64.     {
  65.       *motor1=0;
  66.     }
  67.     if(*motor2+throttle<1000)
  68.     {
  69.       *motor2=0;
  70.     }
  71.     if(*motor1+throttle>2000)
  72.     {
  73.       *motor1=2000-throttle;
  74.     }
  75.     if(*motor2+throttle>2000)
  76.     {
  77.       *motor2=2000-throttle;
  78.     }
  79.     TIM_SetCompare3(TIM4,throttle+*motor1);
  80.     TIM_SetCompare4(TIM4,throttle+*motor2);
  81.   }
  82. }
  83. #else
  84. void Motor_Control(LocationPID *pid,s16 *motor1,s16 *motor2,uint16_t throttle,float roll)
  85. {
  86.   if(roll>60||roll<-60)
  87.   {
  88.     motorFlag=0;
  89.     throttle=1000;
  90.     TIM_SetCompare3(TIM4,throttle);
  91.     TIM_SetCompare4(TIM4,throttle);
  92.   }
  93.   else
  94.   {
  95.     s16 pid_put_value;
  96.     pid_put_value=PIDCalc(pid,roll);
  97.     *motor1=pid_put_value;
  98.     *motor2=-pid_put_value;
  99.     if(*motor1+throttle<1000)
  100.     {
  101.       *motor1=0;
  102.     }
  103.     if(*motor2+throttle<1000)
  104.     {
  105.       *motor2=0;
  106.     }
  107.     if(*motor1+throttle>2000)
  108.     {
  109.       *motor1=2000-throttle;
  110.     }
  111.     if(*motor2+throttle>2000)
  112.     {
  113.       *motor2=2000-throttle;
  114.     }
  115.     TIM_SetCompare3(TIM4,throttle+*motor1);
  116.     TIM_SetCompare4(TIM4,throttle+*motor2);
  117.   }
  118. }
  119. #endif

  120. void String_Process(StringStruct *str)
  121. {
  122.   printf("2_%s\r\n",str->buff);
  123.   if(str->buff[0] == '_')
  124.   {
  125.     for (int i = 0; i < str->length;i++ )
  126.     {
  127.       if (str->buff[i] == '_')
  128.       {
  129.         str->buff[i] = '\0';
  130.         strArr.buff[strArr.length] = ++i;
  131.         strArr.length++;
  132.       }
  133.     }
  134.     for (int i = 0; i < strArr.length; i++)
  135.     {
  136.       char *singleData;
  137.       singleData = str->buff + strArr.buff[i];
  138.       receivedPid[i]=atof(singleData);
  139.     }
  140.     pid_update_flag=1;
  141.   }
  142.   else if(str->buff[0] == 'w')
  143.   {
  144.     char *word;
  145.     word=str->buff+1;
  146.     switch(*word)
  147.     {
  148.     case 'f':motorFlag=1;break;
  149.     case 'w':throttle++;break;
  150.     case 's':throttle--;break;
  151.     case 'd':throttle+=10;break;
  152.     case 'a':throttle-=10;break;
  153.     case 'z':throttle+=100;break;
  154.     case 'c':throttle-=100;break;
  155.     case 'g':LED1(OFF);break;
  156.     case 'k':LED1(ON);break;
  157.     case 'v':motorFlag=0;throttle=1000;TIM_SetCompare3(TIM4,throttle);TIM_SetCompare4(TIM4,throttle);break;
  158.     }
  159.     printf("2_throttle:%d\r\n",throttle);
  160.   }
  161.   str->length=0;
  162. }

  163. void UART2_Send_Str(unsigned char *s)
  164. {
  165.   unsigned char i=0;  
  166.   
  167.   while(s[i]!='\0')  
  168.   {
  169.     USART_SendData(USART2,s[i]);        
  170.     while( USART_GetFlagStatus(USART2,USART_FLAG_TC)!= SET);  
  171.     i++;                 
  172.   }
  173.   
  174. }
復制代碼

所有資料51hei提供下載:
6050DEMO_DMA.7z (2.69 MB, 下載次數: 19)


評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 天天干狠狠干 | 久久成人免费视频 | 91精品91久久久 | 精品免费国产一区二区三区四区介绍 | 涩涩视频网站在线观看 | 国产免费一区二区三区 | 五月精品视频 | 天天爱天天操 | 国产精品入口 | 欧美美女爱爱视频 | av在线成人 | 欧美亚洲一级 | 成人性生交大片 | av大全在线| 精品国产女人 | 特黄毛片 | 成人一区二区三区视频 | 日韩免费中文字幕 | 天天干天天玩天天操 | 日韩av啪啪网站大全免费观看 | 国产精品一区二区视频 | 日韩激情视频一区 | 午夜精品久久 | 国产成人综合网 | 国产韩国精品一区二区三区 | 国产午夜精品久久 | 国产日韩精品一区 | 99精品99 | 91黄在线观看 | 精品一区二区三区在线视频 | 精品国产一区三区 | 91视频在线观看 | 国产免费一级片 | 91精品国产91久久久久久吃药 | 亚洲免费视频一区二区 | 亚洲国产一区在线 | 一区二区在线 | 久久青| 欧美福利视频 | 黑人巨大精品欧美一区二区免费 |