搜索
bottom↓
回复: 7

赐教:我的平衡车能站稳,但不能解决前进后退的问题

[复制链接]

出0入0汤圆

发表于 2013-4-23 21:43:07 | 显示全部楼层 |阅读模式
求教各位大侠。

附上源代码


#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"

MPU6050 accelgyro;
#define Gry_offset 674     
#define Gyr_Gain 65.5
#define pi 3.14159

int16_t ax, ay, az;
int16_t gx, gy, gz;

/*********** PID控制器参数 *********/
float Output;   
float kp, ki, kd,kpp;
float angleA,omega;
float P[2][2] = {{ 1, 0 },{ 0, 1 }};
float Pdot[4] ={ 0,0,0,0};
static const double Q_angle=0.01, Q_gyro=0.03, R_angle=0.5,dtt=0.005,C_0 = 1;
float q_bias, angle_err, PCt_0, PCt_1, E, K_0, K_1, t_0, t_1;
float angle, angle_dot,aaxdot,aax;
float position_dot,position_dot_filter,positiono;
//--------------------------------------

//-----------control arguments-----------
int oommm;
int ooommm;

int TN1=2;
int TN2=3;
int TN3=4;
int TN4=7;
int ENA=5;
int ENB=6;

int A=A2;
int C=A3;
int B=A0;
int D=A1;


float LOutput;
float ROutput;
float LLOutput;
float RROutput;



//-------------------------------------
void setup() {
Wire.begin();
delay(1000);

accelgyro.initialize();
   delay(100);
pinMode(2,OUTPUT);         
    pinMode(3,OUTPUT);
      pinMode(4,OUTPUT);
        pinMode(7,OUTPUT);
              pinMode(5,OUTPUT);
        pinMode(6,OUTPUT);
        
delay(1);
//Serial.begin(9600);
}

void loop() {
//---------control-----------  
  llD();
  
//------control----------
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  //-----------------------------------------------------------------------------------------------------------------

  angleA= atan2(ay , az) * 180 / pi;  
  omega=(gx +  Gry_offset)/Gyr_Gain;
  if (abs(angleA)<30) {
  Kalman_Filter(angleA,omega);
  PIDD();
  PWMB();
   }
    else {
analogWrite(ENA, 0); //PWM调速a==0-255
analogWrite(ENB, 0);
  }
     delay(20);
     Serial.print("\t");
    Serial.print(LOutput);
    Serial.print("\t");
    Serial.print(ROutput);
    Serial.print("\t");
}
//=---------------------------------------------------------------
void llD(){
  int up=digitalRead(A);
  int down=digitalRead(C);
  int leftB=digitalRead(B);
  int rightD=digitalRead(D);
  if(up==HIGH)
  {
    former();
   }
  if(down==HIGH)
  {
    back();
  }
  if(leftB==HIGH)
  {
   left();
  }
  if(rightD==HIGH)
  {
    right();
  }
}
void left(){
  LLOutput=430;
  RROutput=-430;
}
void right(){
  LLOutput=-80;
  RROutput=80;
}
void back(){
  LLOutput=40;
  RROutput=40;
}
void  former(){
   LLOutput=-40;
   RROutput=-40;
}

//-----------------------------

void Kalman_Filter(double angle_m,double gyro_m)
{
angle+=(gyro_m-q_bias) * dtt;
Pdot[0]=Q_angle - P[0][1] - P[1][0];
Pdot[1]=- P[1][1];
Pdot[2]=- P[1][1];
Pdot[3]=Q_gyro;
P[0][0] += Pdot[0] * dtt;
P[0][1] += Pdot[1] * dtt;
P[1][0] += Pdot[2] * dtt;
P[1][1] += Pdot[3] * dtt;
angle_err = angle_m - angle;
PCt_0 = C_0 * P[0][0];
PCt_1 = C_0 * P[1][0];
E = R_angle + C_0 * PCt_0;
K_0 = PCt_0 / E;
K_1 = PCt_1 / E;
t_0 = PCt_0;
t_1 = C_0 * P[0][1];
P[0][0] -= K_0 * t_0;
P[0][1] -= K_0 * t_1;
P[1][0] -= K_1 * t_0;
P[1][1] -= K_1 * t_1;
angle+= K_0 * angle_err;
q_bias += K_1 * angle_err;
angle_dot = gyro_m-q_bias;//也许应该用last_angle-angle
}

//-----------------------
void  PIDD(){
        kp=1;ki=1;kd=0.5;kpp=1;
        aaxdot=0.5*aaxdot+0.5*angle_dot;
        aax=0.5*aax+0.5*angle;
        position_dot=Output*0.04;                //利用PWM值代替轮速传感器的信号
        position_dot_filter*=0.9;                //车轮速度滤波
        position_dot_filter+=position_dot*0.1;        
        positiono+=position_dot_filter;              
  positiono=constrain(positiono,-500,500);
    Output= 80*aax *kp + 1*aaxdot *ki +0.1*positiono *kd + 1*position_dot_filter *kpp;
    //if(LLOutput==0)
    //{LOutput=Output-abs(Output);
    // ROutput=Output-abs(out;
// }else
    LOutput=Output+LLOutput;
    ROutput=Output-RROutput;
    //Output= K_angle*angle *kp + K_angle_dot*angle_dot *ki +K_position*positiono *kd + K_position_dot*position_dot_filter *kpp;
}
//-------------电机正反转 PWM输出-----------
void PWMB(){
  if(LOutput<0)
{
     digitalWrite(TN1, LOW);//left back
     digitalWrite(TN2, HIGH);//left former
     //digitalWrite(TN3, LOW);//right back
     //digitalWrite(TN4, HIGH); //right former
}
else if(LOutput>0)
{
     digitalWrite(TN1, HIGH);//left back
     digitalWrite(TN2, LOW);//left former
    // digitalWrite(TN3, HIGH);//right back
    // digitalWrite(TN4, HIGH); //right former
}
else
{
    digitalWrite(TN1, HIGH);//left back
     digitalWrite(TN2, HIGH);//left former
     //digitalWrite(TN3, HIGH);//right back
   // digitalWrite(TN4, HIGH); //right former
}
//-----------------------------------------
if(ROutput<0)
{
     digitalWrite(TN3, LOW);//right back
     digitalWrite(TN4, HIGH); //right former
}
else if(ROutput>0)
{
    digitalWrite(TN3, HIGH);//right back
    digitalWrite(TN4, LOW); //right former
}
else
{
   digitalWrite(TN3, HIGH);//right back
   digitalWrite(TN4, HIGH); //right former
}
    analogWrite(ENA,min(255,abs(LOutput)+35)); //PWM调速a==0-255
    analogWrite(ENB,min(255,abs(ROutput)+35));
}

出0入0汤圆

发表于 2013-10-21 19:54:55 | 显示全部楼层
楼主,想请教一下你那个Gry_offset和Gyr_Gain是怎么定的?

出0入0汤圆

发表于 2013-10-24 16:35:53 | 显示全部楼层
jacen梁 发表于 2013-10-21 19:54
楼主,想请教一下你那个Gry_offset和Gyr_Gain是怎么定的?

这个是偏置和增益吧、、、

出0入0汤圆

发表于 2013-10-24 19:36:25 | 显示全部楼层
#include "MPU6050.h"
请问楼主这个头文件怎么写,怎么找到呀??编译总是提示不能打开

出0入0汤圆

发表于 2013-10-25 13:35:51 | 显示全部楼层
li448475953 发表于 2013-10-24 16:35
这个是偏置和增益吧、、、

我是初学者,多问两句,那个偏置和增益是什么的偏置和增益啊?怎么去理解或者是怎么确定他们的参数呢?

出0入0汤圆

发表于 2013-10-26 20:05:28 | 显示全部楼层
现在是和你同样的进度。。。前进后退要把速度闭环进去吧

出0入0汤圆

发表于 2013-10-27 19:11:48 | 显示全部楼层
jacen梁 发表于 2013-10-25 13:35
我是初学者,多问两句,那个偏置和增益是什么的偏置和增益啊?怎么去理解或者是怎么确定他们的参数呢? ...

陀螺仪在静态时输出的直流偏置电压   增益这个参数是由积分的时间 和陀螺仪信号放大的倍数来确定、、

出0入0汤圆

发表于 2014-2-13 03:03:24 | 显示全部楼层
flyxiaopei 发表于 2013-10-26 20:05
现在是和你同样的进度。。。前进后退要把速度闭环进去吧

请教下,速度环和角度环,什么形式嵌套在一起比较合理。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 11:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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