⺣ - רҵ·ĵϷƽ̨

ǰλãҳ > 基于STM32F4的姿态解算系?- 百度文库

基于STM32F4的姿态解算系?- 百度文库

  • 62 Ķ
  • 3
  • 2025/5/2 10:54:15

//num:ֵ(0~999999999); //len:(Ҫʾλ) //size:С //mode:

//[7]:0,;1,0. //[6:1]:

//[0]:0,ǵʾ;1,ʾ.

void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode); //ʾַ //x,y:

//width,height:С //size:С //*p:ַʼַ

void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p);

//ʾһַ,12/16

//ʾ

MPU6050еļmpu6050.cmpu6050.hʵmpu6050ֻҪmpu6050һЩúͳʼԼݵĶȡ

u8 MPU_Init(void) { u8 res;

IIC_Init();//ʼIIC

MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); delay_ms(100);

MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); MPU_Set_Gyro_Fsr(3); MPU_Set_Accel_Fsr(0); MPU_Set_Rate(50);

//MPU6050 //Ǵ,2000dps //ٶȴ,2g //ò50Hz //رж

//I2Cģʽر //INTŵ͵ƽЧ //λMPU6050

MPU_Write_Byte(MPU_INT_EN_REG,0X00);

MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); res=MPU_Read_Byte(MPU_DEVICE_ID_REG); if(res==MPU_ADDR)//IDȷ { }

//õ¶ֵ

//ֵ:¶ֵ(100) short MPU_Get_Temperature(void)

//õֵ(ԭʼֵ)16λADɼֵ //gx,gy,gz:x,y,zԭʼ()

MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //رFIFO

MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);//CLKSEL,PLL XΪο MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); MPU_Set_Rate(50); }else return 1;

//ٶǶ //òΪ50Hz

return 0;

//ֵ:0,ɹ/,

u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz) //õٶֵ(ԭʼֵ)

//gx,gy,gz:x,y,zԭʼ()16λADɼֵ //ֵ:0,ɹ,

u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az) //Ԫ

u8 MPU_Get_Quaternion(float *quat)

//õdmp(ע,ҪȽ϶ջ,ֲе) //pitch: :0.1 Χ:-90.0 <---> +90.0 //roll: :0.1 Χ:-180.0<---> +180.0 //yaw: :0.1 Χ:-180.0<---> +180.0 //ֵ:0, ,ʧ

u8 mpu_dmp_get_data(float *pitch,float *roll,float *yaw)

3.2.2 UCOSIIIϵͳ

UCOSIIIϵͳʵ֣һʱ񡣶ʱʵԪظµ㷨̬㣬ȼΪ2ջСΪ256ʼ𴴽ʱĸȼΪ3ջСΪ128һʵֿضϴƣȼΪ4ջСΪ256ʵϴMPU6050ݺԼ̬λȼΪ5ջСΪ256ʵMPU6050ԪضȡʾLCDϣȼΪ6ջСΪ128ĸLCDݺַʾȼΪ7ջСΪ128

MainҪdzʼӲԴUCOSIIIϵͳԼʼͿʼUCOSIIIϵͳ

int main(void) {

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ϵͳжȼ2 delay_init(168); //ʼʱ uart_init(500000); LED_Init(); KEY_Init(); LCD_Init(); MPU_Init();

OSInit(&err); //ʼ

OSTaskCreate((OS_TCB * )&StartTaskTCB,

//ƿ // //

//ݸIJ

(CPU_CHAR * )\

* )0,

//ʼUCOSIII

OS_CRITICAL_ENTER(); //ٽ

//ʼڲΪ500000

//ʼLED //ʼ //LCDʼ //ʼMPU6050

OS_ERR err; CPU_SR_ALLOC();

Show_Main_UI(); //LCDʽ

(OS_TASK_PTR )start_task, (void

(OS_PRIO )START_TASK_PRIO, //ȼ (CPU_STK * )&START_TASK_STK[0], (CPU_STK_SIZE)START_STK_SIZE, (OS_MSG_QTY )0, ֹϢ

(OS_TICK )0, (void

* )0,

//ʹʱƬתʱʱƬȣΪ0ʱΪĬϳȣ //ûĴ洢 //Ÿúʱķֵ

//ջַ //ջС

//ڲϢܹյϢĿ,Ϊ0ʱ

(CPU_STK_SIZE)START_STK_SIZE/10,//ջλ

(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //ѡ (OS_ERR * )&err); }

OS_CRITICAL_EXIT();

//˳ٽ

OSStart(&err); //UCOSIII

ʼstart_task( ),ڴһʱӺĸԼɾ

һȫֵıreportʾϴڿص״̬report=1ʱʾϴreport=0DZʾֹͣϴʼĬǿϴģreport=1KEY0ʱתreportֵɴﵽ͹رϴڵĿġ

if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//Զ֡ͼٶȺԭʼ if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));

һĺÿ100msɨһΡ

void task1_task(void *p_arg) {

OS_ERR err; u8 key; LED1=0; while(1) {

key=KEY_Scan(0);

if(key==KEY0_PRES) { }

report=!report; if(report) {

LCD_ShowString(30,170,200,16,16,\LED1=0; } else { }

LCD_ShowString(30,170,200,16,16,\LED1=1;

OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_HMSM_STRICT,&err); //ʱ100ms

} }

LCD̬ǵʾֻȷСһλȶһ͵tempҪʾ̬ǸֵȻ10ΪֺСֱַʾķ¡

void task2_task(void *p_arg) {

OS_ERR err; float pitch,roll,yaw; short aacx,aacy,aacz; short gyrox,gyroy,gyroz; short temp; u8 t=0; while(1) {

if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0) {

temp=MPU_Get_Temperature(); //õ¶ֵ MPU_Get_Accelerometer(&aacx,&aacy,&aacz); MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);

//õٶȴ //õ

//ŷ

//ٶȴԭʼ //ԭʼ

//¶

if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//Զ֡ͼٶȺԭʼ if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10)); if((t)==0) {

if(temp<0) {

LCD_ShowChar(30+48,200,'-',16,0); temp=-temp;

//תΪ

//ȥ

//ʾ //ʾС

//ʾ

}else LCD_ShowChar(30+48,200,' ',16,0);

LCD_ShowNum(30+48+8,200,temp/100,3,16); LCD_ShowNum(30+48+40,200,temp,1,16); temp=pitch*10; if(temp<0) {

LCD_ShowChar(30+48,220,'-',16,0); temp=-temp;

//תΪ

//ʾ //ȥ //ʾ

//ʾС

}else LCD_ShowChar(30+48,220,' ',16,0);

LCD_ShowNum(30+48+8,220,temp/10,3,16); LCD_ShowNum(30+48+40,220,temp,1,16); temp=roll*10; if(temp<0) {

LCD_ShowChar(30+48,240,'-',16,0); temp=-temp;

//תΪ

//ʾ //ȥ

}else LCD_ShowChar(30+48,240,' ',16,0);

  • ղ
  • Υٱ
  • Ȩ
ĵ10.00 Ԫ VIP
ߣ...

92ƪĵ

ĵ飺

//num:ֵ(0~999999999); //len:(Ҫʾλ) //size:С //mode: //[7]:0,;1,0. //[6:1]: //[0]:0,ǵʾ;1,ʾ. void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode); //ʾַ //x,y: //width,height:С //size:С //*p:ַʼַ void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p); //ʾһַ,12/16 //ʾ

οͿͨغɸƺŰ棩
ƪ
ʱؼۣ10 Ԫ/ ԭ:20Ԫ
VIP
ؼۣ29 Ԫ/ ԭ:99Ԫ
0.3 Ԫ/ ÿ150
ȫվɸ
VIP
ؼۣ29 Ԫ/ ԭ:99Ԫ
0.3 Ԫ/ ÿ150
ȫվɸ
עĵпܡֻĿ¼ݲȫ֮ǰעѸ޷ػ⣬ϵЭ㴦
΢ţfanwen365 QQ370150219
Copyright © ⺣ All Rights Reserved. ICP16052595-3 վͼ ͷQQ370150219 䣺370150219@qq.com