代码如下:
#include <Stepper.h>
#include "MsTimer2.h"
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
/********步进电机参数*********/
const int stepsPerRevolution =64; // 根据步进电机每转的步距角数来设定,如这个电机的步距角是5.625,那么一周就是64步
Stepper myStepper(stepsPerRevolution, 8,9,10,11);
/*********MPU6050**************/
MPU6050 accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;
float angleAx,gyroGy;
/**********二阶互补滤波**********/
float K2 =0.2; // 对加速度计取值的权重
float x1,x2,y1;
float dt=20*0.001;//注意:dt的取值为滤波器采样时间
float Angle;
float Angle_sum; //角度积分
/**********PID*************/
float Kp=2.5;
//float Ki=0.06;
float Kd=0.2;
float pwm;
int Step;
/*******二阶互补滤波*****/
void Erjielvbo() //采集后计算的角度和角加速度
{
x1=(angleAx-Angle)*(1-K2)*(1-K2);
y1=y1+x1*dt;
x2=y1+2*(1-K2)*(angleAx-Angle)+gyroGy;
Angle=Angle+ x2*dt;
Angle_sum+=Angle;
if(Angle_sum>360){Angle_sum=360;}
if(Angle_sum<-360){Angle_sum=-360;}
}
void PWM()
{
pwm=Kp*Angle+Kd*gyroGy;
if(pwm>2048) { pwm = 2048; } //防止PWM值超过255
if(pwm<-2048){pwm=-2048;}
}
void setup()
{
Wire.begin();
Serial.begin(115200);
accelgyro.initialize();
myStepper.setSpeed(200);
}
void loop()
{ accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
angleAx=atan2(ax,az)*180/PI;
gyroGy=-gy/131.00;
delay(2);
Erjielvbo();
PWM();
Step=(int)pwm;
Serial.print(pwm);
Serial.print("\t");
Serial.print(Angle);
Serial.print("\n");
myStepper.step(Step);
#include <Stepper.h>
#include "MsTimer2.h"
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
/********步进电机参数*********/
const int stepsPerRevolution =64; // 根据步进电机每转的步距角数来设定,如这个电机的步距角是5.625,那么一周就是64步
Stepper myStepper(stepsPerRevolution, 8,9,10,11);
/*********MPU6050**************/
MPU6050 accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;
float angleAx,gyroGy;
/**********二阶互补滤波**********/
float K2 =0.2; // 对加速度计取值的权重
float x1,x2,y1;
float dt=20*0.001;//注意:dt的取值为滤波器采样时间
float Angle;
float Angle_sum; //角度积分
/**********PID*************/
float Kp=2.5;
//float Ki=0.06;
float Kd=0.2;
float pwm;
int Step;
/*******二阶互补滤波*****/
void Erjielvbo() //采集后计算的角度和角加速度
{
x1=(angleAx-Angle)*(1-K2)*(1-K2);
y1=y1+x1*dt;
x2=y1+2*(1-K2)*(angleAx-Angle)+gyroGy;
Angle=Angle+ x2*dt;
Angle_sum+=Angle;
if(Angle_sum>360){Angle_sum=360;}
if(Angle_sum<-360){Angle_sum=-360;}
}
void PWM()
{
pwm=Kp*Angle+Kd*gyroGy;
if(pwm>2048) { pwm = 2048; } //防止PWM值超过255
if(pwm<-2048){pwm=-2048;}
}
void setup()
{
Wire.begin();
Serial.begin(115200);
accelgyro.initialize();
myStepper.setSpeed(200);
}
void loop()
{ accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
angleAx=atan2(ax,az)*180/PI;
gyroGy=-gy/131.00;
delay(2);
Erjielvbo();
PWM();
Step=(int)pwm;
Serial.print(pwm);
Serial.print("\t");
Serial.print(Angle);
Serial.print("\n");
myStepper.step(Step);