本帖最后由 wenyangzeng 于 2019-12-10 20:25 编辑
基于LPC55S69-PowerQuad在陀螺仪上的应用
一、项目名称
基于LPC55S69-PowerQuad 在陀螺仪上的应用
二、项目概述
LPC55S69是集成了PowerQuad数学运算加速处理器的双核ARM-M33处理器,本项目在LPC55S69驱动MPU6050陀螺仪的应用中实现以下功能: 1、LPC55S69-Core0对MPU6050陀螺仪的驱动, 2、LPC55S69-Core0 -PowerQuad浮点小数的除法和开方运算; 3、LPC55S69-Core1对OLED的驱动,显示陀螺仪输出的数字信号量; 4、双核数据共享管理机制,共享变量ACK作为握手信号对Core0和Core1进行任务调度。
三、作品实物图
图1
四、双核任务管理 图2 五、项目的实施
1、硬件: 外部扩展的硬件连接见图3 图3 2、软件: 编译环境:IAR8.32.1。
工程模块直接利用双核Hello_world演示例程 LPC55S69\boards\lpcxpresso55s69\multicore_examples\hello_world 修改而成。
Core0模块需要添加PowerQuad和MPU6050的驱动,
图4
Core1需要添加OLED的驱动;
图5
3、双核调试: 1、在Core0中调试完成OLED驱动,并移植到Core1。然后从Core0调用Core1时OLED应能正常显示。 2、调试MPU6050驱动; 3、调试PowerQuad。 4、调试Core1显示Core0传送的坐标数据。
Get_Angle()函数演示了PowerQuad浮点小数除法和开方的使用方法:
在使用PowerQuad前,要先对其初始化:
- void MPU6050_Get_Angle(MPU6050_Angle *data)
- { float temp=16384.0;
- float input;
- float result;
- input=MPU6050_Get_Data(ACCEL_XOUT_H) + X_ACCEL_OFFSET;
- PQ_DivF32(&input, &temp, &result);
- X=result;
- input=MPU6050_Get_Data(ACCEL_YOUT_H) + Y_ACCEL_OFFSET;
- PQ_DivF32(&input, &temp, &result);
- Y=result;
- input=MPU6050_Get_Data(ACCEL_ZOUT_H) + Z_ACCEL_OFFSET;
- PQ_DivF32(&input, &temp, &result);
- Z=result;
- input =(Y*Y+Z*Z);
- PQ_SqrtF32(&input, &result);
- temp=X/result;
- data->X_Angle =atan(temp)* 57.29577;
- input =(X*X+Z*Z);
- PQ_SqrtF32(&input, &result);
- temp=Y/result;
- data->Y_Angle =atan(temp)* 57.29577;
- input =(X*X+Y*Y);
- PQ_SqrtF32(&input, &result);
- temp=result/Z;
- data->Z_Angle =atan(temp)* 57.29577;
- }
复制代码Core0的数据处理: - while (1)
- {
- do{;} while(Ack==0x01);
- MPU6050_Get_Angle(&data);
- fraction=modf(data.X_Angle,&integer)*100;
- Disp_buf[0][0]=(int32_t)integer;
- Disp_buf[0][1]=(uint8_t)fraction;
- fraction=modf(data.Y_Angle,&integer)*100;
- Disp_buf[1][0]=(int32_t)integer;
- Disp_buf[1][1]=(uint8_t)fraction;
- fraction=modf(data.Z_Angle,&integer)*100;
- Disp_buf[2][0]=(int32_t)integer;
- Disp_buf[2][1]=(uint8_t)fraction;
- Ack=0x01;
- }
复制代码Core1的数据处理: - while (1)
- {
- do{;}while(Ack==0x00);
- Ack=0x00;
- DispAngle(48,8,(int32_t)Disp_buf[0][0],(uint8_t)Disp_buf[0][1]);
- DispAngle(48,24,(int32_t)Disp_buf[1][0],(uint8_t)Disp_buf[1][1]);
- DispAngle(48,40,(int32_t)Disp_buf[2][0],(uint8_t)Disp_buf[2][1]);
- j++;
- if(j==500)
- {
- LED_TOGGLE();
- j=0;
- }
- }
复制代码
六、代码文件 |