标题:
四轴飞行器stc单片机程序
[打印本页]
作者:
陈好
时间:
2017-9-4 10:14
标题:
四轴飞行器stc单片机程序
stc也可以做四轴
0.png
(481.19 KB, 下载次数: 94)
下载附件
2017-9-4 19:17 上传
0.png
(52.25 KB, 下载次数: 92)
下载附件
2017-9-4 19:17 上传
单片机源程序如下:
//========================================================================
// 作者:xiaoliu
// 邮箱:1042763631
// 版本V1.0
//========================================================================
// 爱好者电子工作室
//特别声明:此程序
//
//
//
// MCU工作频率12MHz
//=========================================================================
//1、如果需要更改工作频率,请修改本工程中的config.h头文件中 MAIN_Fosc的宏定义,
// 延时函数都会保持一致,无需更改延迟的参数。
//2、波特率为2400,如果需要更改,必须和STC-ISP最低波特率保持一致才能实现自动下载
//3、IO口已被重新定义,IAP15W4K58S4最大封装为64脚,具有62个IO口,其中有8个模拟口,
// 当然模拟口也可用作数字口,数字用D表示,模拟用A来表示,此定义专门为STC15W4K系列
// 定义的IO,方便方便以后大家日后的使用,此定义方法类似arduino。
// 使用数字IO口时,定义如下:
// P3.0-P3.7--->D0-D7 也可以直接使用0-7
// P2.0-P2.7--->D8-D15 也可以直接使用8-15
// P4.0-P4.7--->D16-D23 也可以直接使用16-23
// P5.0-P5.7--->D24-D31 也可以直接使用24-31
// P6.0-P6.7--->D32-D39 也可以直接使用32-39
// P7.0-P7.7--->D40-D47 也可以直接使用40-47
// P0.0-P0.7--->D48-D55 也可以直接使用48-55
// P1.0-P1.7--->D56-D63 也可以直接使用56-63 也可以使用A0-A7
// 使用模拟IO口时,定义如下:
// P1.0-P1.7--->0-7
//4、pinMode、digitalWrite必须使用数字IO定义方法,analogRead必须使用模拟IO定义方法
//=============================================================================
#include "config.h"
#include "GPIO.h"
#include "usart.h"
#include "delay.h"
#include "epwm.h"
#include "eInterrupt.h"
#include "IMU.h"
#include "nrf24l01.h"
#include "MPU6050.h"
#include "eeprom.h"
#define Q15(X) \
((X < 0.0) ? (int)(32768*(X) - 0.5) : (int)(32767*(X) + 0.5))
#define EAXSFR() P_SW2 |= 0x80 /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
//PWM定义
#define PWM_L 11 //左边的电机
#define PWM_R 7 //右边的电机
#define PWM_F 10 //前面的电机
#define PWM_B 9 //后面的电机
//mpu6050定义
#define SDA 22 //定义mpu6050的SDA的数字io
#define SCL 48 //定义mpu6050的SCL的数字io
#define CE 23
#define CSN 57
#define SCK 56
#define MOSI 34
#define MISO 33
#define IRQ 32
#define LED_4 18
#define LED_2 55
#define LED_3 25
#define LED_1 28
u8 SW2_tmp;
bit B_8ms;
u8 count;
//******************************************************************************************************
u8 xdata TxBuf[20]={0};
u8 xdata RxBuf[20]={0};
u8 xdata RxBuf_temp[20]={0};
u8 xdata tp[16];
//******************************************************************************************************
u8 YM=0; //油门变化速度控制,不这样做的话快速变化油门时四轴会失速翻转
int data speed2=0,speed3=0,speed4=0,speed5=0; //电机速度参数
int data PWM2=0,PWM3=0,PWM4=0,PWM5=0; //加载至PWM模块的参数
int xdata g_x=0,g_y=0,g_z=0; //陀螺仪矫正参数
int xdata a_x,a_y; //角度矫正参数
long xdata g_x_aver=0;
long xdata g_y_aver=0;
long xdata g_z_aver=0;
int delta_rc_x=0;
int delta_rc_y=0;
int delta_rc_z=0;
u8 YM_last;
int delta_Ax;
int delta_Ay;
int delta_Az;
int Ax_real;
int Ay_real;
int Az_real;
int delta_Ax_last;
int delta_Ay_last;
int delta_Az_last;
//*****************角度参数*************************************************
int xdata Angle_ax=0,Angle_ay=0,Angle_az=0; //由加速度计算的加速度(弧度制)
int idata Angle_gy=0,Angle_gx=0,Angle_gz=0; //由角速度计算的角速率(角度制)
int data AngleX=0,AngleY=0,AngleZ=0; //四元数解算出的欧拉角
float xdata Anglezlate=0; //Z轴相关
float xdata IMU_gz;
int xdata Ax=0,Ay=0; //加入遥控器控制量后的角度
int xdata gx=0,gy=0; //加入遥控器控制量后的角?
u8 data lastR0=0,ZT=0; //上一次RxBuf[0]数据(RxBuf[0]数据在不断变动的) 状态标识
//****************姿态处理和PID*********************************************
int data PID_Output; //PID最终输出量
float xdata Last_Angle_gx=0; //外环PI输出量 上一次陀螺仪数据
long xdata ERRORX_Out=0; //外环P 外环I 外环误差积分
long xdata ERRORX_In=0; //内环P 内环I 内环D 内环误差积分
float xdata Last_Angle_gy=0;
long xdata ERRORY_Out=0;
long xdata ERRORY_In=0;
long xdata ERRORZ_Out=0;
int xdata Last_Ax=0;
int xdata Last_Ay=0;
unsigned int LED_num=0;
int xdata Last_gx=0;
int xdata Last_gy=0;
long idata PID_P;
long idata PID_I;
long idata PID_D;
#define Out_XP 18.0f //外环P
#define Out_XI Q15(0.024) //外环I Q15(0.024)
#define Out_XD 3.0f //外环D
#define In_XP Q15(0.3) //内环P 720 0.3 0.3 0.5
#define In_XI Q15(0.00)//内环I 0.024 0 0
#define In_XD 7.5f //内环D 720 5 7.5 8.0
#define In_YP In_XP
#define In_YI In_XI
#define In_YD In_XD
#define Out_YP Out_XP
#define Out_YI Out_XI
#define Out_YD Out_XD
#define ZP 5.0f // 5
#define ZD 8.0f //自旋控制的PID 8
#define ZI Q15(0.24) // 0.24
#define ERR_MAX 8000
#define KALMAN_Q Q15(0.20)
#define KALMAN_R Q15(0.80)
int KalmanFilter_ax( int ResrcData,int ProcessNiose_Q,int MeasureNoise_R);
int KalmanFilter_ay( int ResrcData,int ProcessNiose_Q,int MeasureNoise_R);
int KalmanFilter_az( int ResrcData,int ProcessNiose_Q,int MeasureNoise_R);
int KalmanFilter_gyrox( int ResrcData,int ProcessNiose_Q,int MeasureNoise_R);
int KalmanFilter_gyroy( int ResrcData,int ProcessNiose_Q,int MeasureNoise_R);
int KalmanFilter_gyroz( int ResrcData,int ProcessNiose_Q,int MeasureNoise_R);
void main()
{
int i=1;
u8 j;
Serialbegin(2400,1,COM1);//设置COM1的波特率为2400,将“最低波特率”的值设为2400即可实现自动下载
pinMode(SDA,pullup);//设置为内部上拉模式
pinMode(SCL,pullup);//设置为内部上拉模式
pinMode(PWM_L,OUTPP);//设置成推挽模式
pinMode(PWM_R,OUTPP);//设置成推挽模式
pinMode(PWM_F,OUTPP);//设置成推挽模式
pinMode(PWM_B,OUTPP);//设置成推挽模式
pinMode(LED_4,OUTPP);//设置成推挽模式
pinMode(LED_2,OUTPP);//设置成推挽模式
pinMode(LED_3,OUTPP);//设置成推挽模式
pinMode(LED_1,OUTPP);//设置成推挽模式
pinMode(CE,pullup);//设置为内部上拉模式
pinMode(CSN,pullup);//设置为内部上拉模式
pinMode(SCK,pullup);//设置为内部上拉模式
pinMode(MOSI,pullup);//设置为内部上拉模式
pinMode(MISO,pullup);//设置为内部上拉模式
pinMode(IRQ,pullup);//设置为内部上拉模式
//以下为PWM初始化
epwmnTcolck(12);//系统时钟,不分频
epwmTwide(20000);//设置PWM宽度为1001
epwmStartADC(0);//不触发AD
epwmFirstSignalLevel(PWM_L,0);//设置初始电平为低
epwmFirstSignalLevel(PWM_R,0);//设置初始电平为低
epwmFirstSignalLevel(PWM_F,0);//设置初始电平为低
epwmFirstSignalLevel(PWM_B,0);//设置初始电平为低
epwmSetValue(PWM_L,19300,20000);//设置翻转值,第1次翻转为1000,第2次翻转为1001
epwmSetValue(PWM_R,19300,20000);//设置翻转值,第1次翻转为1000,第2次翻转为1001
epwmSetValue(PWM_F,19300,20000);//设置翻转值,第1次翻转为1000,第2次翻转为1001
epwmSetValue(PWM_B,19300,20000);//设置翻转值,第1次翻转为1000,第2次翻转为1001
epwmCRbegin();//启动PWM计数器
init_NRF24L01();//初始化无线模块
RxBuf[1] = 128;
RxBuf[2] = 128;
RxBuf[3] = 128;
RxBuf[4] = 0;
IAPRead(); //读取陀螺仪静差
InitMPU6050(); //初始化MPU-6050
Timer0_attachInterrupt(10000);//定时器0以10ms定时中断
Timer3_attachInterrupt(4000);//
loop()
{
YM = RxBuf[4]; //油门
if((RxBuf[5] == 1)||(RxBuf[6] == 1)) //校准时,请按2次,第1次清除角速度,第2次清除角度
{
RxBuf[5] = 0;
RxBuf[6] = 0;
RxBuf_temp[5] = 0;
RxBuf_temp[6] = 0;
if(RxBuf[4] < 20)
{
EA = 0;
TR0=0;
g_x_aver=0;
g_y_aver=0;
g_z_aver=0;
for(j=0;j<64;j++)
{
Read_MPU6050(tp);
g_x_aver=g_x_aver+(((int *)&tp)[4]);
g_y_aver=g_y_aver+(((int *)&tp)[5]);
g_z_aver=g_z_aver+(((int *)&tp)[6]);
}
g_x_aver=g_x_aver>>6;
g_y_aver=g_y_aver>>6;
g_z_aver=g_z_aver>>6;
IAP_Gyro();
epwmSetValue(PWM_L,19300,20000);//设置翻转值,第1次翻转为960,第2次翻转为1001
epwmSetValue(PWM_R,19300,20000);//设置翻转值,第1次翻转为960,第2次翻转为1001
epwmSetValue(PWM_F,19300,20000);//设置翻转值,第1次翻转为960,第2次翻转为1001
epwmSetValue(PWM_B,19300,20000);//设置翻转值,第1次翻转为960,第2次翻转为1001
delay_ms(100); //校准完毕滴一声
epwmSetValue(PWM_L,19300,20000);//设置翻转值,第1次翻转为1000,第2次翻转为1001
epwmSetValue(PWM_R,19300,20000);//设置翻转值,第1次翻转为1000,第2次翻转为1001
epwmSetValue(PWM_F,19300,20000);//设置翻转值,第1次翻转为1000,第2次翻转为1001
epwmSetValue(PWM_B,19300,20000);//设置翻转值,第1次翻转为1000,第2次翻转为1001
TR0=1;
EA = 1;
}
}
}
}
void timer0_int (void) interrupt TIMER0_VECTOR
{
B_8ms = 1;
P52=1;
LED_num++;
if(LED_num>200)
{
LED_num=0;
// P51=1;
// P42=1;
// P07=1;
// P54=1;
}
if(LED_num==50)
{
// P51=0;
// P42=0;
// P07=0;
// P54=0;
}
if(RxBuf[0] == lastR0) //如果RxBuf[0]的数据没有收到 即失联
{
if(++ZT >= 128)
{
ZT = 120; //状态标识大于128即1秒没有收到数据,失控保护
RxBuf[1] = 128;
RxBuf_temp[1] = 128;
RxBuf[2] = 128; //触发失控保护 ,缓慢下降,俯仰横滚方向舵归中
RxBuf_temp[2]=128;
RxBuf[3] = 128;
RxBuf_temp[3]=128;
if(RxBuf[4] != 0)
{
RxBuf[4]--; //油门在原值逐渐减小
RxBuf_temp[4]=RxBuf[4];
}
}
}
else ZT = 0;
lastR0 = RxBuf[0];
Read_MPU6050(tp);
Angle_ax=KalmanFilter_ax( ((int *)&tp)[0],KALMAN_Q,KALMAN_R);
Angle_ay=KalmanFilter_ay( ((int *)&tp)[1],KALMAN_Q,KALMAN_R);
Angle_az=KalmanFilter_az( ((int *)&tp)[2],KALMAN_Q,KALMAN_R);
Angle_gx = ((float)(((int *)&tp)[4] - g_x)) / 65.5; //陀螺仪处理 结果单位是 +-度
Angle_gy = ((float)(((int *)&tp)[5] - g_y)) / 65.5; //陀螺仪量程 +-500度/S, 1度/秒 对应读数 65.536
Angle_gz=KalmanFilter_gyroz( ((int *)&tp)[6],Q15(0.2),Q15(0.8))- g_z;
IMU_gz=Angle_gz/65.5;
Last_Angle_gx = Angle_gx; //储存上一次角速度数据
Last_Angle_gy = Angle_gy;
//*********************************** 四元数解算 ***********************************
IMUupdate(Angle_gx*0.0174533f, Angle_gy*0.0174533f, IMU_gz*0.0174533f, Angle_ax,Angle_ay,Angle_az);//姿态解算,精度0.1度
//将四轴飞行器的所有数据发到遥控上
TxBuf[0]=AngleX-a_x;
TxBuf[1]=(AngleX-a_x)>>8;
TxBuf[2]=Angle_ax;
TxBuf[3]=Angle_ax>>8;
TxBuf[4]=((int *)&tp)[4]-g_x;
TxBuf[5]=(((int *)&tp)[4]-g_x)>>8;
TxBuf[6]=AngleY-a_y;
TxBuf[7]=(AngleY-a_y)>>8;
TxBuf[8]=Angle_ay;
TxBuf[9]=Angle_ay>>8;
TxBuf[10]=((int *)&tp)[5]-g_y;
TxBuf[11]=(((int *)&tp)[5]-g_y)>>8;
TxBuf[12]=AngleZ;//z轴角度始终为0,因为不能从IMU中获取
TxBuf[13]=(AngleZ)>>8;
TxBuf[14]=Angle_az;
TxBuf[15]=Angle_az>>8;
TxBuf[16]=Angle_gz;
TxBuf[17]=Angle_gz>>8;
//0.174533为PI/180 目的是将角度转弧度 四元数计算出 俯仰(X轴): AngleX, 横滚(Y轴): AngleY
//************** MPU6050 Y轴与水平倾角 ***********************************************************
if((RxBuf[2] > 113) && (RxBuf[2] < 143)) RxBuf[2] = 128; //113 143 128
delta_rc_y=128-RxBuf[2] ;
delta_rc_y=delta_rc_y*10/7;
// Ay为误差,delta_rc_y为遥控给的角度作为基准,RxBuf[8]为微调量,a_y为偏差角度,AngleY为采样的角度
//一般的,在不考虑微调、偏移量,误差=基准-测量值
Ay = delta_rc_y -(char)RxBuf[8]*2+a_y-AngleY;
if(YM > 20) ERRORY_Out += Ay; //外环积分(油门小于某个值时不积分)
else ERRORY_Out = 0; //油门小于定值时清除积分值
if(ERRORY_Out > ERR_MAX) ERRORY_Out = ERR_MAX;
else if(ERRORY_Out < -ERR_MAX) ERRORY_Out = -ERR_MAX; //积分限幅
PID_P=(long)Ay*Out_YP;
PID_I=((long)ERRORY_Out*Out_YI)>>15;
PID_D=((Angle_gx+Last_Angle_gx)/2)*Out_YD;
PID_Output = (PID_P +PID_I+PID_D+5)/10; //外环PID,“+5”为了四舍五入?
Last_Ay=Ay;
gy=PID_Output - Angle_gx;
if(YM > 20)ERRORY_In +=gy;//内环积分(油门小于某个值时不积分)
else ERRORY_In = 0; //油门小于定值时清除积分值
if(ERRORY_In > ERR_MAX) ERRORY_In = ERR_MAX;
else if(ERRORY_In < -ERR_MAX) ERRORY_In = -ERR_MAX; //积分限幅
PID_P=((long)gy*In_YP)>>15;
PID_I=((long)ERRORY_In*In_YI)>>15;
PID_D=((long)gy - Last_gy)*In_YD;
PID_Output =PID_P+PID_I+PID_D;
Last_gy=gy;
if(PID_Output > 19300) PID_Output = 19300; //输出量限幅
if(PID_Output < -19300) PID_Output = -19300;
speed5 = PID_Output, speed2 = -PID_Output;//加载到速度参数
//**************MPU6050 X轴与水平倾角**************************************************
if((RxBuf[1] > 113) && (RxBuf[1] < 143)) RxBuf[1] = 128;
delta_rc_x=RxBuf[1] - 128;
delta_rc_x=delta_rc_x*10/7;
// Ax为误差,delta_rc_x为遥控给的角度作为基准,RxBuf[7]为微调量,a_x为偏差角度,AngleX为采样的角度
//一般的,在不考虑微调、偏移量,误差=基准-测量值
Ax = delta_rc_x+(char)RxBuf[7]*2+a_x-AngleX;
if(YM > 20) ERRORX_Out += Ax; //外环积分(油门小于某个值时不积分)
else ERRORX_Out = 0; //油门小于定值时清除积分值
if(ERRORX_Out > ERR_MAX) ERRORX_Out = ERR_MAX; //积分限幅
else if(ERRORX_Out < -ERR_MAX) ERRORX_Out = -ERR_MAX; //积分限幅
PID_P=(long)Ax*Out_YP;
PID_I=((long)ERRORX_Out*Out_XI)>>15;
PID_D=((Angle_gy+Last_Angle_gy)/2)*Out_XD;
PID_Output = (PID_P+PID_I+PID_D+5)/10; //外环PID
Last_Ax=Ax;
gx=PID_Output - Angle_gy;
if(YM > 20) ERRORX_In += gx; //内环积分(油门小于某个值时不积分)
else ERRORX_In = 0; //油门小于定值时清除积分值
if(ERRORX_In > ERR_MAX) ERRORX_In = ERR_MAX;
else if(ERRORX_In < -ERR_MAX) ERRORX_In = -ERR_MAX; //积分限幅
PID_P=((long)gx*In_XP)>>15;
PID_I=((long)ERRORX_In*In_XI)>>15;
PID_D=((long)gx - Last_gx)*In_XD;
PID_Output =PID_P+PID_I+PID_D;
Last_gx=gx;
if(PID_Output > 19300) PID_Output = 19300; //输出量限幅
if(PID_Output < -19300) PID_Output = -19300;
speed4 = 0 - PID_Output;
speed3 = 0 + PID_Output;
//************** MPU6050 Z轴指向 *****************************
//只做速度环即可
if((RxBuf[3] > 113) && (RxBuf[3] < 143)) RxBuf[3] = 128;
delta_rc_z = (RxBuf[3] - 128)-Angle_gz; //操作量
delta_rc_z = ((int)RxBuf[3] - 128)*64-Angle_gz; //本来是乘与65.5的系数,乘与64也可以
if(YM > 20) ERRORZ_Out += delta_rc_z;
else ERRORZ_Out = 0;
if(ERRORZ_Out > 50000) ERRORZ_Out = 50000;
else if(ERRORZ_Out < -50000) ERRORZ_Out = -50000; //积分限幅
PID_P=((long)delta_rc_z)*ZP;
PID_I=((long)ERRORZ_Out * ZI)>>15;
PID_D=((long)delta_rc_z - Anglezlate) * ZD;
PID_Output =( PID_P + PID_I + PID_D)>>6;
Anglezlate = delta_rc_z;
if(PID_Output > 19300) PID_Output = 19300; //输出量限幅
if(PID_Output < -19300) PID_Output = -19300;
speed4 = speed4 + PID_Output;
speed5 = speed5 - PID_Output;speed2 = speed2 - PID_Output;
speed3 = speed3 + PID_Output;
//**************将速度参数加载至PWM模块*************************************************
if(YM < 20) PWM2 = 19300, PWM3 = 19300, PWM4 = 19300, PWM5 = 19300;
else
{
PWM2 = 19300 - (int)YM*4 - speed2;
if(PWM2 > 19300) PWM2 = 19300; //速度参数控制,防止超过PWM参数范围0-1000
else if(PWM2 < 0) PWM2 = 0;
PWM3 = 19300 - (int)YM*4 - speed3;
if(PWM3 > 19300) PWM3 = 19300;
else if(PWM3 < 0) PWM3 = 0;
PWM4 = 19300 - (int)YM*4 - speed4;
if(PWM4 > 19300) PWM4 = 19300;
else if(PWM4 < 0) PWM4 = 0;
PWM5 = 19300 - (int)YM*4 - speed5;
if(PWM5 > 19300) PWM5 = 19300;
else if(PWM5 < 0) PWM5 = 0;
}
epwmSetValue(PWM_L,PWM5,20000);//设置翻转值,第1次翻转为PWM5,第2次翻转为1001
epwmSetValue(PWM_R,PWM2,20000);//设置翻转值,第1次翻转为PWM2,第2次翻转为1001
epwmSetValue(PWM_F,PWM4,20000);//设置翻转值,第1次翻转为PWM4,第2次翻转为1001
epwmSetValue(PWM_B,PWM3,20000);//设置翻转值,第1次翻转为PWM3,第2次翻转为1001
P52=0;
}
void timer3_int (void) interrupt 19
{
count++;
if(count==1)
{
nRF24L01_TxPacket(TxBuf);//发射数据
}
else if(count==3)
{
SetRX_Mode();
}
else if(count==4)
{
nRF24L01_RxPacket(RxBuf_temp);//接收数据
if((RxBuf_temp[9]-RxBuf_temp[8]-RxBuf_temp[7]-RxBuf_temp[6]-RxBuf_temp[5]-RxBuf_temp[4]-RxBuf_temp[3]-RxBuf_temp[2]-RxBuf_temp[1]-RxBuf_temp[0])==0)
{
RxBuf[8]=RxBuf_temp[8];//左右微调
RxBuf[7]=RxBuf_temp[7];//前后微调
RxBuf[6]=RxBuf_temp[6];
RxBuf[5]=RxBuf_temp[5];
RxBuf[4]=RxBuf_temp[4];
RxBuf[3]=RxBuf_temp[3];
RxBuf[2]=RxBuf_temp[2];
RxBuf[1]=RxBuf_temp[1];
RxBuf[0]=RxBuf_temp[0];
}
count=0;
}
}
int KalmanFilter_ax( int ResrcData,int ProcessNiose_Q,int MeasureNoise_R)
{
int R = MeasureNoise_R;
int Q = ProcessNiose_Q;
static int ax_last;
int ax_mid = ax_last;
long ax_now;
static int ax_p_last;
long p_mid ;
long p_now;
int kg;
long temp;
ax_mid=ax_last;
p_mid=ax_p_last+Q;
temp=p_mid<<15;
kg=(temp/((long)p_mid+R));
ax_now= ax_mid+(((long)kg*(ResrcData-ax_mid))>>15);
p_now=((long)p_mid*(32768-kg))>>15;
ax_p_last = p_now;
ax_last = ax_now;
return ax_now;
}
int KalmanFilter_ay( int ResrcData,int ProcessNiose_Q,int MeasureNoise_R)
{
int R = MeasureNoise_R;
int Q = ProcessNiose_Q;
static int ay_last;
int ay_mid = ay_last;
long ay_now;
static int ay_p_last;
long p_mid ;
long p_now;
int kg;
long temp;
ay_mid=ay_last;
p_mid=ay_p_last+Q;
temp=p_mid<<15;
kg=(temp/((long)p_mid+R));
ay_now= ay_mid+(((long)kg*(ResrcData-ay_mid))>>15);
p_now=((long)p_mid*(32768-kg))>>15;
ay_p_last = p_now;
ay_last = ay_now;
return ay_now;
}
int KalmanFilter_az( int ResrcData,int ProcessNiose_Q,int MeasureNoise_R)
{
int R = MeasureNoise_R;
int Q = ProcessNiose_Q;
static int az_last;
int az_mid = az_last;
long az_now;
static int az_p_last;
long p_mid ;
long p_now;
int kg;
long temp;
az_mid=az_last;
p_mid=az_p_last+Q;
temp=p_mid<<15;
kg=(temp/((long)p_mid+R));
az_now= az_mid+(((long)kg*(ResrcData-az_mid))>>15);
p_now=((long)p_mid*(32768-kg))>>15;
az_p_last = p_now;
az_last = az_now;
return az_now;
}
int KalmanFilter_gyrox( int ResrcData,int ProcessNiose_Q,int MeasureNoise_R)
{
int R = MeasureNoise_R;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
黑色板子四轴程序.zip
(555.97 KB, 下载次数: 80)
2017-9-4 10:13 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
41886036
时间:
2017-9-15 15:30
谢谢谢谢楼主
作者:
41886036
时间:
2017-9-15 15:48
黑币不够下载了
作者:
41886036
时间:
2017-9-15 15:48
黑币不够下载了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1