极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8695|回复: 0

代码求优化,第一次搞的单片机程序,Ctrl+C 百分之八十,自己弄了剩下的

[复制链接]
发表于 2012-12-28 20:28:06 | 显示全部楼层 |阅读模式
本帖最后由 弘毅 于 2012-12-28 20:58 编辑

代码求优化,第一次搞的单片机程序,Ctrl+C 百分之八十,自己弄了剩下的,分割线一下是自己弄的,现在舵机倒是可以按照陀螺仪的参数运行了,就是不怎么灵敏,而且到角度极限时居然会反转,晕。。。。。。。请前辈门指点指点,在下谢谢了,这个代码只要是想弄个自稳的云台的。


  1. #include <Servo.h>

  2. #include <I2Cdev.h>

  3. #include <MPU6050.h>

  4. #include "Wire.h"

  5. MPU6050 accelgyro;
  6. Servo Servol;
  7. Servo Servol2;
  8. int16_t ax, ay, az;
  9. int16_t gx, gy, gz;
  10. #define Gry_offset_X 45//陀螺仪X轴的静态飘移。
  11. #define Gry_offset_Y 271
  12. #define Gyr_Gain -0.00763//由陀螺仪X轴读数转换为角速度值,=1/131,向前方向与X轴为反方向,故乘以-112.
  13. #define ACC_Gain 0.000061//由读数转换为加速度值,=1/16384
  14. #define pi 3.1415926
  15. #define K_x 0.715//一阶互补滤波权重取值,不知由来,可更改。
  16. #define k_Y 1.3
  17. unsigned long preTime = 0;
  18. float angle_X = 0;
  19. float angle_Y = 0;
  20. float Temp=0,Temp_o=0;
  21. void setup()
  22. {
  23.   Wire.begin();
  24.   Serial.begin(38400);
  25.   accelgyro.initialize();
  26.   Servol.attach(2);
  27.   Servol.write(90);
  28.   Servol2.attach(3);
  29.   Servol2.write(90);

  30. }//MPU6050初始化。

  31. void loop() {
  32.   unsigned long now = millis();//当前时间(ms)
  33.   float dt = (now - preTime) / 500.0;//微分时间(s)
  34.   preTime = now;//上一次采样时间(ms)
  35.   accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);//读取六轴数值
  36.   float Y_Accelerometer = ay * ACC_Gain;//转换为向前的加速度(g),为负值
  37.   float Z_Accelerometer = az * ACC_Gain;//转换为向下的加速度(g)
  38.   float X_Accelerometer = ax * ACC_Gain;
  39.   float angleA_X= atan(Y_Accelerometer/ Z_Accelerometer)* (-180)/ pi;//加速度仪,反正切获得弧度值,乘以180度/pi43.
  40.   //获得角度值,乘以-1得正
  41.   float angleA_Y= atan(X_Accelerometer/Z_Accelerometer)*(-180)/pi;
  42.   float gx_revised = gx + Gry_offset_X;//陀螺仪x轴静态时修正后的角速度读数,向前为负值
  43.   float gy_revised = gy + Gry_offset_Y;
  44.   float omega_X= Gyr_Gain* gx_revised;//陀螺仪,转换为向前的角速度(o/s),Gyr_Gain取负,故负负得正
  45.   float omega_Y= Gyr_Gain* gy_revised;
  46.   float angle_dt_X = omega_X * dt;//角度的单次积分值
  47.   float angle_dt_Y = omega_Y * dt;
  48.   angle_X+= (Gyr_Gain * (gx + Gry_offset_X)) * dt;
  49.   angle_Y+= (Gyr_Gain * (gy + Gry_offset_Y)) * dt;
  50.   float A_X= K_x/ (K_x+ dt); //陀螺仪的权值
  51.   float A_Y= k_Y/(k_Y+dt);
  52.   angle_X= A_X* (angle_X+ omega_X* dt)+ (1-A_X)* angleA_X;//一阶互补滤波后的输出角度(o)
  53.   angle_Y= A_Y*(angle_Y+omega_Y*dt)+(1-A_Y)*angleA_Y;
  54.   //---------------------------------------------------------------------------------------------舵机开始
  55.   Temp=90;
  56.   if (angle_X>0){
  57.     if ((Temp+angle_X)<170){

  58.       Servol.write(angle_X+Temp) ;
  59.       delay(5);
  60.     }
  61.   }
  62.   else {
  63.     if ((angle_X+Temp)>1){

  64.       Servol.write(angle_X+Temp);
  65.       delay(5);

  66.     }
  67.   }
  68.   if (angle_Y>0){
  69.     if ((Temp+angle_Y)<170){

  70.       Servol2.write(angle_Y+Temp) ;
  71.       delay(5);
  72.     }
  73.   }
  74.   else {
  75.     if ((angle_Y+Temp)>1){

  76.       Servol2.write(angle_Y+Temp);
  77.       delay(5);

  78.     }
  79.   }
  80.   Serial.print(angle_X);
  81.   Serial.print(",");   
  82.   Serial.print(angle_Y);
  83.   Serial.print("\n");
  84. }
复制代码
回复

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-3 01:58 , Processed in 0.036661 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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