浅墨飞鱼 发表于 2014-4-14 16:13:14

It's_me 发表于 2014-3-31 20:22 static/image/common/back.gif
你具体说说,看我能帮你什么忙

请问怎样区别mpu6050是否已卡尔曼滤波?我的mpu6050和楼主你发的以一个图片类似。

RedFISH 发表于 2014-4-14 19:16:08

对于MPU6050很迷茫。

浅墨飞鱼 发表于 2014-4-14 20:47:03

It's_me 发表于 2014-3-31 20:22 static/image/common/back.gif
你具体说说,看我能帮你什么忙

我的车电子扭力不够,所以可调角度很小,最近一直在弄卡尔曼滤波,希望能把波形弄平滑些。

It's_me 发表于 2014-4-15 11:08:56

浅墨飞鱼 发表于 2014-4-14 20:47 static/image/common/back.gif
我的车电子扭力不够,所以可调角度很小,最近一直在弄卡尔曼滤波,希望能把波形弄平滑些。

你只用了角度环吗,只用一个角度环是不行的

It's_me 发表于 2014-4-15 11:10:07

RedFISH 发表于 2014-4-14 19:16 static/image/common/back.gif
对于MPU6050很迷茫。

MPU6050很简单啊,你只需要得到很好的数据就行,其他的你不需要管的

It's_me 发表于 2014-4-15 11:19:03

蓝调葬礼 发表于 2014-4-6 09:05 static/image/common/back.gif
楼主用arduinoUNO 的话    I/O脚够用吗    谢谢

uno怕是不行,中断就不够,串口也不够

It's_me 发表于 2014-4-15 11:21:38

iohongwal 发表于 2014-4-13 21:16 static/image/common/back.gif
我自己了一個平衡車 我是用芯片厰家提拱的代碼來做的 車子可以根劇angle來向前走和向後走 但是不平衡 可以幫 ...

看一下你的电机是怎么安装的,还有你的算法是怎么写的

iohongwal 发表于 2014-4-15 11:30:45

It's_me 发表于 2014-4-15 11:21 static/image/common/back.gif
看一下你的电机是怎么安装的,还有你的算法是怎么写的

是要我拍照給你看?

iohongwal 发表于 2014-4-15 12:45:36

電機安裝


厰家給的代碼

unsigned char Re_buf,counter=0;
unsigned char sign=0;
int M11=5;
int M12=6;
int M21=9;
int M22=10;

float a,w,Angle,T;
short sAccelerat,sAngleVelocity,sAngle,sT;
void setup() {
// initialize serial:
Serial.begin(115200);
pinMode(M11,OUTPUT);analogWrite(M11,0);
pinMode(M12,OUTPUT);analogWrite(M12,0);
pinMode(M21,OUTPUT);analogWrite(M21,0);
pinMode(M22,OUTPUT);analogWrite(M22,0);
}
void SetMotor(float v1,float v2)
{
if (v1>255){v1=255;analogWrite(M11,0);analogWrite(M12,v1);}
else if (v1>0) {analogWrite(M11,0);analogWrite(M12,v1);}
else if (v1>-255) {analogWrite(M12,0);analogWrite(M11,-v1);}
else{v1=-255;analogWrite(M12,0);analogWrite(M11,-v1);}

if (v2>255){v2=255;analogWrite(M21,0);analogWrite(M22,v2);}
else if (v2>0) {analogWrite(M21,0);analogWrite(M22,v2);}
else if (v2>-255) {analogWrite(M22,0);analogWrite(M21,-v2);}
else {v2=-255;analogWrite(M22,0);analogWrite(M21,-v2);}
}

float PID1(float e,float kp,float ki,float kd)
{
static float es=0,sum=0;
float r;
sum+=e;
r = kp*e+ki*sum+kd*(e-es);
es=e;
return r;
}
float PID2(float e,float kp,float ki,float kd)
{
static float es=0,sum=0;
float r;
sum+=e;
r = kp*e+ki*sum+kd*(e-es);
es=e;
return r;
}
void loop() {
float kp=30,ki=0.0,kd=10,r1,r2;
if (sign==0) return;//sign为数据更新标志,每隔10ms更新一次,也就是说以下代码每隔10ms控制一次。
sign=0;
kd = (float)analogRead(0)/1024*200;
r1=PID1(Angle,kp,ki,kd);//PID1、PID2函数就是第四节的PID函数,为了区分左右轮,所以分成两个。
r2=PID2(Angle,kp,ki,kd);
SetMotor(r1,r2);//设置电机转速。
Serial.print("angle:");
Serial.print(Angle);Serial.print(" ");
Serial.print(r1);Serial.print(" ");
Serial.println(kd);Serial.print(" ");
}

void serialEvent() {
while (Serial.available()) {
   
    //char inChar = (char)Serial.read(); Serial.print(inChar); //Output Original Data, use this code

    Re_buf=(unsigned char)Serial.read();
    if(counter==0&&Re_buf!=0x55) return;      //第0号数据不是帧头            
    counter++;      
    if(counter==11)             //接收到11个数据
    {   
       counter=0;               //重新赋值,准备下一帧数据的接收
       switch(Re_buf )
        {
        case 0x51:
                a = float(short(Re_buf <<8| Re_buf ))/32768*16;
                a =float(short(Re_buf <<8| Re_buf ))/32768*16;
                a =float(short(Re_buf <<8| Re_buf ))/32768*16;               
                break;
        case 0x52:
                w =float(short(Re_buf <<8| Re_buf ))/32768*250;
                w =float(short(Re_buf <<8| Re_buf ))/32768*250;
                w =float(short(Re_buf <<8| Re_buf ))/32768*250;
                break;
        case 0x53:
              Angle =float(short(Re_buf <<8| Re_buf ))/32768*180;
                Angle =float(short(Re_buf <<8| Re_buf ))/32768*180;
                Angle =float(short(Re_buf <<8| Re_buf ))/32768*180;
                T =float(short(Re_buf <<8| Re_buf ));///340.0+36.25   
                sign=1;
                break;
        }
    }      
}
}


以下是我自己用PID library 寫出來的

#include <PID_v1.h>

//Define Variables we'll be connecting to
double Setpoint, Input, Output;

//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);
unsigned char Re_buf,counter=0;
unsigned char sign=0;
int M11=5;
int M12=6;
int M21=9;
int M22=10;

float a,w,Angle,T;
short sAccelerat,sAngleVelocity,sAngle,sT;
void setup() {
// initialize serial:
Serial.begin(115200);
pinMode(M11,OUTPUT);
pinMode(M12,OUTPUT);
pinMode(M21,OUTPUT);
pinMode(M22,OUTPUT);
   Input = Angle;
Setpoint = 0;
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits(-255,255);


}
void loop(){
Input = Angle;
myPID.Compute();
if(Angle>0){analogWrite(M11,Output);analogWrite(M12,0);analogWrite(M21,Output);analogWrite(M22,0);}
else if(Angle<0){analogWrite(M11,0);analogWrite(M12,-Output);analogWrite(M21,0);analogWrite(M22,-Output);}



Serial.print("angle:");
Serial.print(Angle);Serial.print(" "); Serial.print(Output);Serial.println(" ");
}
void serialEvent() {
while (Serial.available()) {
   
    //char inChar = (char)Serial.read(); Serial.print(inChar); //Output Original Data, use this code

    Re_buf=(unsigned char)Serial.read();
    if(counter==0&&Re_buf!=0x55) return;      //第0号数据不是帧头            
    counter++;      
    if(counter==11)             //接收到11个数据
    {   
       counter=0;               //重新赋值,准备下一帧数据的接收
       switch(Re_buf )
        {
        case 0x51:
                a = float(short(Re_buf <<8| Re_buf ))/32768*16;
                a =float(short(Re_buf <<8| Re_buf ))/32768*16;
                a =float(short(Re_buf <<8| Re_buf ))/32768*16;               
                break;
        case 0x52:
                w =float(short(Re_buf <<8| Re_buf ))/32768*250;
                w =float(short(Re_buf <<8| Re_buf ))/32768*250;
                w =float(short(Re_buf <<8| Re_buf ))/32768*250;
                break;
        case 0x53:
              Angle =float(short(Re_buf <<8| Re_buf ))/32768*180;
                Angle =float(short(Re_buf <<8| Re_buf ))/32768*180;
                Angle =float(short(Re_buf <<8| Re_buf ))/32768*180;
                T =float(short(Re_buf <<8| Re_buf ));///340.0+36.25   
                sign=1;
                break;
        }
    }      
}
}



浅墨飞鱼 发表于 2014-4-15 15:11:23

It's_me 发表于 2014-4-15 11:08 static/image/common/back.gif
你只用了角度环吗,只用一个角度环是不行的

要加入速度环对吧?类似于这个网页说的http://www.geology.smu.edu/~dpa-www/robo/nbot/bal2.txt 但是具体比例大小还不晓得如何下手。

浅墨飞鱼 发表于 2014-4-15 16:34:42

positions表示位置,是速度对时间的积分。这句话在程序中体现不出来啊

It's_me 发表于 2014-4-15 21:50:59

iohongwal 发表于 2014-4-15 12:45 static/image/common/back.gif
電機安裝




pid还是自己写吧,pid库看不大懂,我不建议你用,pid一定要双闭环,一个角度环不可能调好的。你的电机减速比是多少,扭矩够吗?

It's_me 发表于 2014-4-15 21:54:23

浅墨飞鱼 发表于 2014-4-15 16:34 static/image/common/back.gif
positions表示位置,是速度对时间的积分。这句话在程序中体现不出来啊

怎么体现不出来啊,很明显是速度滤波后,积分就可以得到位置的啊,这个就是我现在用的pid程序,你可以借鉴一下。

iohongwal 发表于 2014-4-15 23:27:38

本帖最后由 iohongwal 于 2014-4-15 23:52 编辑

It's_me 发表于 2014-4-15 21:50 static/image/common/back.gif
pid还是自己写吧,pid库看不大懂,我不建议你用,pid一定要双闭环,一个角度环不可能调好的。你的电机减速 ...

電機的問題我不太清楚(不過我覺得不夠) 但我不是會自己寫PID電機一定要有編碼器?

It's_me 发表于 2014-4-16 16:27:40

iohongwal 发表于 2014-4-15 23:27 static/image/common/back.gif
電機的問題我不太清楚(不過我覺得不夠) 但我不是會自己寫PID電機一定要有編碼器?

我发的这一段就是pid程序,你回去改改就行
页: 1 2 [3] 4 5 6 7 8 9 10 11 12
查看完整版本: 基于Arduino+MPU6050+Tp-link 703n平衡车完美站立(部分代码上传)