一、项目名称
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演示例程
LPC55S69boardslpcxpresso55s69multicore_exampleshello_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前,要先对其初始化:
1.PQ_Init(DEMO_POWERQUAD);
复制代码
1.void MPU6050_Get_Angle(MPU6050_Angle *data)
2.{ float temp=16384.0;
3. float input;
4. float result;
5. input=MPU6050_Get_Data(ACCEL_XOUT_H) + X_ACCEL_OFFSET;
6. PQ_DivF32(&input, &temp, &result);
7. X=result;
8. input=MPU6050_Get_Data(ACCEL_YOUT_H) + Y_ACCEL_OFFSET;
9. PQ_DivF32(&input, &temp, &result);
10. Y=result;
11. input=MPU6050_Get_Data(ACCEL_ZOUT_H) + Z_ACCEL_OFFSET;
12. PQ_DivF32(&input, &temp, &result);
13. Z=result;
14.input =(Y*Y+Z*Z);
15. PQ_SqrtF32(&input, &result);
16. temp=X/result;
17. data->X_Angle =atan(temp)* 57.29577;
18.input =(X*X+Z*Z);
19. PQ_SqrtF32(&input, &result);
20. temp=Y/result;
21. data->Y_Angle =atan(temp)* 57.29577;
22. input =(X*X+Y*Y);
23. PQ_SqrtF32(&input, &result);
24. temp=result/Z;
25. data->Z_Angle =atan(temp)* 57.29577;
26.}
27.
28.
复制代码
Core0的数据处理:
1.while (1)
2. {
3. do{;} while(Ack==0x01);
4. MPU6050_Get_Angle(&data);
5. fraction=modf(data.X_Angle,&integer)*100;
6. Disp_buf[0][0]=(int32_t)integer;
7. Disp_buf[0][1]=(uint8_t)fraction;
8. fraction=modf(data.Y_Angle,&integer)*100;
9. Disp_buf[1][0]=(int32_t)integer;
10. Disp_buf[1][1]=(uint8_t)fraction;
11. fraction=modf(data.Z_Angle,&integer)*100;
12. Disp_buf[2][0]=(int32_t)integer;
13. Disp_buf[2][1]=(uint8_t)fraction;
14. Ack=0x01;
15. }
16.
17.
复制代码
Core1的数据处理:
1.while (1)
2. {
3. do{;}while(Ack==0x00);
4. Ack=0x00;
5. DispAngle(48,8,(int32_t)Disp_buf[0][0],(uint8_t)Disp_buf[0][1]);
6. DispAngle(48,24,(int32_t)Disp_buf[1][0],(uint8_t)Disp_buf[1][1]);
7. DispAngle(48,40,(int32_t)Disp_buf[2][0],(uint8_t)Disp_buf[2][1]);
8. j++;
9. if(j==500)
10. {
11. LED_TOGGLE();
12. j=0;
13. }
14. }
15.
16.
复制代码
六、代码文件
hello_world.rar
七、视频
八、运行结果
在Core1中预先设定蓝色LED翻转来监视运行过程,LED大约每秒翻转一次,运行结果可知在LED翻转期间,Core0和Core1居然运行了500次数据采集、运算和显示。本项目非常直观的体现了LPC55S69双核M33的优异性能。