mpu6050单轴转动控制步进电机转动相应角度
mpu6050单轴转动控制步进电机转动相应角度,程序可以运行,但是在转动MPU6050的过程中,电机转动相应角度后电机出现抖动的情况,不知道是Mpu6050灵敏度高的原因还是程序写得有问题。但是修改了MPU6050的量程并没有改善电机抖动的情况,贴上程序,求教大神,可能是什么问题?#include <REG52.H>
#include <math.h> //Keil library
#include <stdio.h> //Keil library
#include <INTRINS.H>
typedef unsigned charuchar;
typedef unsigned short ushort;
typedef unsigned int uint;
//******功能模块头文件*******
#include "DELAY.H" //延时头文件
#include "MPU6050.H" //MPU6050头文件
//******参数定义************
float Accel_ax;
float Accel_az; //X轴加速度值暂存
int Angle; //小车最终倾斜角度
uchar value; //角度正负极性标记
int Angle_pre1=0;
int Angle_now1=0;
int angle1=0;
signed long beats=0;
int Angle_Calcu(void);
void Calcu();
void StartMotor(signed long angle);
void Turnmotor();
void main()
{ InitMPU6050();
delaynms(150);
TMOD = 0x01;
TH0 = 0xf9; //1.5ms
TL0 = 0x45;
ET0 = 1;
TR0 =1;
Angle_pre1=Angle_Calcu();
StartMotor(Angle_pre1);
while(1)
{
Calcu();
}
}
//*********************************************************
// 倾角计算
//*********************************************************
int Angle_Calcu(void)
{
Accel_ax= GetData(ACCEL_XOUT_H); //读取X轴加速度
Accel_az= GetData(ACCEL_ZOUT_H); //读取X轴加速度
Angle = (int)(atan(Accel_ax/Accel_az)*180/3.14);
Angle=90-Angle;
if(Angle>170)
{Angle=0;}
else
{Angle=Angle;}
return Angle;
}
//*********************************************************
// 电机转动角度计算
//*********************************************************
void Calcu()
{
if(beats==0)
{ EA=0;
Angle_now1=Angle_Calcu();
angle1=Angle_now1-Angle_pre1;
StartMotor(angle1);
Angle_pre1=Angle_now1;
}
}
void StartMotor(signed long angle)
{
beats = (angle*298)/18;
EA =1;
}
void InterruptTimer0() interrupt 1
{
TH0 = 0xf9; //1.5ms
TL0 = 0x45;
Turnmotor();
}
void Turnmotor()
{ static signed char index = 0;
unsigned char code BeatCode ={0xf5,0xf6,0xfa,0xf9};
if(beats!=0)
{
if(beats > 0)
{
index++;
index = index & 0x03;
beats--;
}
else
{
index--;
index = index & 0x03;
beats++;
}
P1=BeatCode;
}
else
{
P1=0x00;
}
} 直接读出来的角度有波动,本身的波动就很大
页:
[1]