ǰλãҳ > 基于STM32F4的姿态解算系?- 百度文库
//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);
92ƪĵ