找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2620|回复: 2
打印 上一主题 下一主题
收起左侧

四旋翼源码第7版软启动+蓝牙源码(串级PID控制)

[复制链接]
跳转到指定楼层
楼主
这是我们调小四轴的源码。主要用的串级PID控制。


STM32-DMP移植单片机源程序如下:
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"
  4. #include "anbt_dmp_fun.h"
  5. #include "anbt_i2c.h"
  6. #include "anbt_dmp_mpu6050.h"
  7. #include "anbt_dmp_driver.h"
  8. #include "debug.h"
  9. #include "PWM.h"
  10. #define BYTE0(dwTemp)       (*(char *)(&dwTemp))
  11. #define BYTE1(dwTemp)       (*((char *)(&dwTemp) + 1))
  12. #define BYTE2(dwTemp)       (*((char *)(&dwTemp) + 2))
  13. #define BYTE3(dwTemp)       (*((char *)(&dwTemp) + 3))

  14. #define q30  1073741824.0f

  15. void Data_Send_Status(float Pitch,float Roll,float Yaw,int16_t *gyro,int16_t *accel);
  16. void Send_Data(int16_t *Gyro,int16_t *Accel);


  17. static void DMP_Delay ( __IO uint32_t nCount )
  18. {
  19.   for ( ; nCount != 0; nCount -- );
  20.        
  21. }


  22. int main(void)
  23. {               


  24. int a = 0;
  25.   float error_pitch=0.0;
  26.         static float Pitch_I_out=0.0;
  27.         float  error_pitch_old=0.0;
  28.         static float Pitch_I_shell_out=0.0;
  29.   float error_pitch_shell=0.0;
  30.         float pitch_shell_out=0.0;
  31.         float pitch_out=0.0;
  32.        
  33.   float error_roll=0.0;
  34.         static float roll_I_out=0.0;
  35.         float  error_roll_old=0.0;
  36.         static float roll_I_shell_out=0.0;
  37.   float error_roll_shell=0.0;
  38.         float roll_shell_out=0.0;
  39.         float roll_out=0.0;
  40.        
  41.         static float yaw_I_out=0.0;
  42.         float error_yaw=0.0;
  43.         float error_yaw_old=0.0;
  44.         float yaw_out=0.0;
  45.         int i=1000000;
  46.         float  m1=0,m2=0,m3=0,m4=0,m5=0.0;
  47.         unsigned long sensor_timestamp;
  48.         short gyro[3], accel[3], sensors;//陀螺仪存放数组,加速度存放数组,返回状态量
  49.         unsigned char more;
  50.         long quat[4];//四元数存放数组
  51.         float Yaw=0.00,Roll,Pitch;//欧拉角
  52.         float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;//计算姿态过程用到的变量

  53.    
  54. ////       
  55.     pitch_SET = 7;
  56.           P_pitch_shell =-25;//-55
  57.           P_pitch = -0.72;        //-1.2
  58.     I_pitch= -0.015;//        -0.032
  59.                 D_pitch=-0.85;//-1.2       
  60.           I_pitch_shell =-0.00012;//-0.0002
  61.                
  62.                
  63.                 roll_SET = 9;
  64.                 P_roll_shell= -25;//-55
  65.                 P_roll = 0.72;//1.2
  66.                 I_roll= 0.015;//0.032
  67.                 D_roll= 0.85;//1.2
  68.                 I_roll_shell = 0.00012;//0.0002
  69.        
  70.         NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  71.         uart_init(115200);         //串口初始化为115200
  72.         //引用圆点博士的I2C程序,这里跟我们平常没有什么区别
  73.   PWM_Init();

  74.        
  75.         ANBT_I2C_Configuration();                //IIC初始化
  76. //        delay_ms(30);
  77.         DMP_Delay (300);//
  78.         AnBT_DMP_MPU6050_Init();                        //6050DMP初始化
  79.        
  80. //TIM2_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
  81. DMP_Delay (300);

  82. while(i--)
  83. {
  84.                 TIM_SetCompare3(TIM3,200);
  85.                 TIM_SetCompare4(TIM3,200);
  86.                 TIM_SetCompare3(TIM4,200);
  87.                 TIM_SetCompare4(TIM4,200);       
  88. }
  89. //a = ReceiveOneByte[0];

  90.         while(1)
  91.         {

  92.                 error_pitch_old = error_pitch;
  93.                 error_roll_old = error_roll;
  94.                 error_yaw_old = error_yaw;
  95.                  dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more);       

  96.                  if ( sensors & INV_WXYZ_QUAT )
  97.                  {
  98.                          q0=quat[0] / q30;
  99.                          q1=quat[1] / q30;
  100.                          q2=quat[2] / q30;
  101.                          q3=quat[3] / q30;
  102.                          Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch
  103.                          Roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll
  104.                          Yaw =         atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;                //感觉没有价值,注掉
  105.                          
  106.                          

  107. //                         if(Pitch>15||Pitch<-15||Roll>15||Roll<-15)//stop
  108. //                         {
  109. //                                 TIM_SetCompare3(TIM3,0);
  110. //               TIM_SetCompare4(TIM3,0);
  111. //                TIM_SetCompare3(TIM4,0);
  112. //                TIM_SetCompare4(TIM4,0);
  113. //                                 while(1);
  114. //                         }
  115.                          //////////////////Pitch外环(PI)/////////////       
  116.                         error_pitch_shell = Pitch-pitch_SET;
  117.                         Pitch_I_shell_out+=error_pitch_shell;
  118.                          if(Pitch_I_shell_out>500)
  119.                          {
  120.                                  Pitch_I_shell_out = 500;
  121.                          }
  122.                          if(Pitch_I_shell_out<-500)
  123.                          {
  124.                                  Pitch_I_shell_out = -500;
  125.                          }
  126.                          pitch_shell_out = P_pitch_shell*error_pitch_shell+I_pitch_shell*Pitch_I_shell_out;
  127.                          //------------Pitch内环PID gyro[1]---------------//
  128.                          error_pitch = gyro[1]-pitch_shell_out;
  129.                          Pitch_I_out+=error_pitch;
  130.                          if(Pitch_I_out>500)
  131.                          {
  132.                                  Pitch_I_out = 500;
  133.                          }
  134.                           if(Pitch_I_out<-500)
  135.                          {
  136.                                  Pitch_I_out = -500;
  137.                          }
  138.              pitch_out = P_pitch*error_pitch+I_pitch*Pitch_I_out+D_pitch*(error_pitch-error_pitch_old);
  139.                          m1=pitch_out;
  140.                        
  141.                          
  142.                          //////////////////roll外环(PI)gyro[0]/////////////       
  143.                    error_roll_shell = Roll - roll_SET;
  144.                          roll_I_shell_out+=error_roll_shell;
  145.                          if(roll_I_shell_out>1000)
  146.                          {
  147.                                  roll_I_shell_out = 1000;
  148.                          }
  149.               if(roll_I_shell_out<-1000)
  150.                          {
  151.                                  roll_I_shell_out = -1000;
  152.                          }
  153.                    roll_shell_out = P_roll_shell*error_roll_shell+I_roll_shell*roll_I_shell_out;
  154.                           //////////////////roll内环PID/////////
  155.                          error_roll = gyro[0]-roll_shell_out;
  156.                          roll_I_out+=error_roll;
  157.                          if(roll_I_out>1000)
  158.                          {
  159.                                  roll_I_out = 1000;
  160.                          }
  161.                          if(roll_I_out<-1000)
  162.                          {
  163.                                  roll_I_out = -1000;
  164.                          }
  165.                          roll_out = P_roll*error_roll+I_roll*roll_I_out+D_roll*(error_roll-error_roll_old);
  166.                          m2 = roll_out;
  167.                          ////////////////gyro[2]  PD//////////
  168.                          error_yaw = gyro[2];
  169.                          yaw_out = 1.8*error_yaw+2.5*(error_yaw_old-error_yaw);
  170.                          
  171.                    m3 = yaw_out;
  172.                          /////////////////////yaw///////////
  173. //                                  error_yaw = Yaw;
  174. //                         yaw_I_out+=error_yaw;
  175. //                         if(yaw_I_out>200)
  176. //                         {
  177. //                                 yaw_I_out = 200;
  178. //                         }
  179. //                         if(yaw_I_out<-200)
  180. //                         {
  181. //                                 yaw_I_out = -200;
  182. //                         }
  183. //                        m4 = 0.0000025*error_yaw+0.000000025*yaw_I_out;
  184.                
  185.                
  186.                                     TIM_SetCompare3(TIM3,2500+m1+m2+m3+m4+m5);
  187.                TIM_SetCompare4(TIM3,2500+m1-m2-m3-m4+m5);
  188.                                  
  189.                TIM_SetCompare3(TIM4,2500-m1-m2+m3+m4+m5);
  190.                TIM_SetCompare4(TIM4,2500-m1+m2-m3-m4+m5);                  
  191.                        
  192.       Push(1,(int)pitch_out);
  193.                         Push(2,(int)Pitch);
  194.                          
  195.                         Push(3,(int)gyro[0]);
  196.                   Push(4,(int)gyro[1]);
  197.                   Push(5,(int)gyro[2]);
  198.                                 Push(6,(int)Yaw);
  199.        
  200.                        
  201.                        
  202.                        
  203.        SendDataToScope();       
  204.                        
  205.                  }          
  206.                
  207.         }
  208. }


  209. /*函数功能:根据匿名最新上位机协议写的显示姿态的程序
  210. *具体原理看匿名的讲解视频


  211. 发送基本信息(姿态、锁定状态)


  212. */

  213. void Data_Send_Status(float Pitch,float Roll,float Yaw,int16_t *gyro,int16_t *accel)
  214. {
  215.         unsigned char i=0;
  216.         unsigned char _cnt=0,sum = 0;
  217.         unsigned int _temp;
  218.         u8 data_to_send[50];

  219.         data_to_send[_cnt++]=0xAA;
  220.         data_to_send[_cnt++]=0xAA;
  221.         data_to_send[_cnt++]=0x01;
  222.         data_to_send[_cnt++]=0;
  223.        
  224.         _temp = (int)(Roll*100);
  225.         data_to_send[_cnt++]=BYTE1(_temp);
  226.         data_to_send[_cnt++]=BYTE0(_temp);
  227.         _temp = 0-(int)(Pitch*100);
  228.         data_to_send[_cnt++]=BYTE1(_temp);
  229.         data_to_send[_cnt++]=BYTE0(_temp);
  230.         _temp = (int)(Yaw*100);
  231.         data_to_send[_cnt++]=BYTE1(_temp);
  232.         data_to_send[_cnt++]=BYTE0(_temp);
  233.        
  234.         data_to_send[3] = _cnt-4;
  235.         //和校验
  236.         for(i=0;i<_cnt;i++)
  237.                 sum+= data_to_send[i];
  238.         data_to_send[_cnt++]=sum;
  239.        
  240.         //串口发送数据
  241.         for(i=0;i<_cnt;i++)
  242.                 AnBT_Uart1_Send_Char(data_to_send[i]);
  243. }




  244. //发送传感器数据
  245. void Send_Data(int16_t *Gyro,int16_t *Accel)
  246. {
  247.         unsigned char i=0;
  248.         unsigned char _cnt=0,sum = 0;
  249. //        unsigned int _temp;
  250.         u8 data_to_send[50];

  251. ……………………

  252. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


全部资料51hei下载地址:
第7版软启动+蓝牙.rar (396.1 KB, 下载次数: 58)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:405372 发表于 2018-11-30 17:22 | 只看该作者
下载试试看,最近在学
回复

使用道具 举报

板凳
ID:70035 发表于 2019-8-29 12:57 | 只看该作者
最近在玩软启动,了解一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表