|
static unsigned int Kangle=58000;
static unsigned int Kangledot=0;
static unsigned int PWM;
void PWM_calculate()
{
PWM=6500+(unsigned int)(Kangle*angle*3)+(int)(Kangledot*angle_dot);
if(angle_flag==0) //angle_flag为MMA7455.c里面的一全局变量 标志车是往前倒还是往后倒
{
Car_con(PWM,PWM,0101); //往后倒
}
if(angle_flag==1)
{
Car_con(PWM,PWM,0110);//往前倒
}
}
angle_flag是读取加速度传感器时判断符号的标记位。
********************************************************************/
static unsigned char angle_flag=1; //正角度负角度标志
float Get_Angle()
{
unsigned char Angle8;
reg_MMA(1,ZOUT8,0,&Angle8);
Angle8=Angle8-5;
angle_flag=1; //负角度
if(Angle8>127){angle_flag=0;Angle8=256- Angle8;} //负角度
return(float)(asin(Angle8*0.007874)); //(1/127=0.007874)
}
/***********************************************************
float Get_Gyro()
{
/*************************
读取 陀螺仪 Z轴
有符号整形
**************************/
uint gyro_L,gyro_H;
int gyro_temp;
gyro_H = Single_ReadL3G4200D(OUT_X_H);
gyro_L = Single_ReadL3G4200D(OUT_X_L); //从读Z轴的值改为读X轴的值
gyro_temp = (gyro_H<<8 | gyro_L);
return ((gyro_temp - 60)*0.000152); //去除偏移量 计算角速度 8.75mdps/lsb*3.14/180
}
控制器是MSP430f149,卡尔曼滤波是抄论坛上的。
小车现在平衡点立不住,而且发现当车体向后倾斜,车轮会过渡一段时间才向后加速,而向前倾斜则车轮立即响应,将陀螺仪的数据取反,现象也相反。猜想是不是陀螺仪数据正负输出数据不线性,但串口波形显示陀螺仪数据正常。
将卡尔曼滤波器输入的陀螺仪数据改为0.0,角度值和滤波前的角度值吻合。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|