一. SPI 实验
SPI实验:学习如何使用 I.MX6U 的 SPI 接口来驱动 ICM-20608,读取 ICM-20608 的六轴数据。
ICM20608 传感器包括陀螺仪与加速度计,还有温度值。本篇文章来学习 通过ADC的值,来转换为实际的值。例如,通过陀螺仪的 X,Y,Z轴转化为角速度值。通过加速度计的 X,Y,Z值转换为 加速度计的加速度值。
二. 测试值计算与硬件浮点开启
1. 测试值计算
由于陀螺仪的角速度是浮点型数,所以,可能需要保存数据的小数点后一两位。所以,这里采取将数据扩大 100倍,取的小数点后的数据后,最后打印再缩小 100倍的方法。
新增或更新 bsp_icm20608.c文件的几个函数如下:
/*获取 ICM20608的内部数据*/
void icm20608_get_data(void)
{unsigned char buffer[15] = {0}; unsigned short accel_scale = 0;float gyro_scale = 0.0;accel_scale = icm20608_accel_scaleget();gyro_scale = icm20608_gyro_scaleget();icm20608_read_len(ICM20_ACCEL_XOUT_H, buffer, 14);//ADC传感器数据icm20608_dev.accel_x_adc = (signed short)((buffer[0] << 8) | buffer[1]);icm20608_dev.accel_y_adc = (signed short)((buffer[2] << 8) |buffer[3]);icm20608_dev.accel_z_adc = (signed short)((buffer[4] << 8) | buffer[5]);icm20608_dev.temp_adc = (signed short)((buffer[6] << 8) | buffer[7]);icm20608_dev.gyro_x_adc = (signed short)((buffer[8] << 8) | buffer[9]);icm20608_dev.gyro_y_adc = (signed short)((buffer[10] << 8) |buffer[11]);icm20608_dev.gyro_z_adc = (signed short)((buffer[12] << 8) | buffer[13]);//计算实际值,实际数据扩大100倍(0.01扩大100后,为 1)icm20608_dev.accel_x_act = ((float)(icm20608_dev.accel_x_adc) / accel_scale) * 100;icm20608_dev.accel_y_act = ((float)(icm20608_dev.accel_y_adc) / accel_scale) * 100;icm20608_dev.accel_z_act = ((float)(icm20608_dev.accel_z_adc) / accel_scale) * 100;icm20608_dev.gyro_x_act = ((float)(icm20608_dev.gyro_x_adc) / gyro_scale) * 100;icm20608_dev.gyro_y_act = ((float)(icm20608_dev.gyro_y_adc) / gyro_scale) * 100;icm20608_dev.gyro_z_act = ((float)(icm20608_dev.gyro_z_adc) / gyro_scale) * 100;icm20608_dev.temp_act = (((float)(icm20608_dev.temp_adc) - 25 ) / 326.8 + 25) * 100;
}/*获取陀螺仪的分辨率 */
float icm20608_gyro_scaleget(void)
{unsigned char data;float gyroscale;data = (icm20608_read_byte(ICM20_GYRO_CONFIG) >> 3) & 0X3;switch(data) {case 0: gyroscale = 131;break;case 1:gyroscale = 65.5;break;case 2:gyroscale = 32.8;break;case 3:gyroscale = 16.4;break;}return gyroscale;
}/*获取加速度计的分辨率 */
unsigned short icm20608_accel_scaleget(void)
{unsigned char data;unsigned short accelscale;data = (icm20608_read_byte(ICM20_ACCEL_CONFIG) >> 3) & 0X3;switch(data) {case 0: accelscale = 16384;break;case 1:accelscale = 8192;break;case 2:accelscale = 4096;break;case 3:accelscale = 2048;break;}return accelscale;
}
2. 硬件浮点开启
我们在使用浮点计算的时候程序卡死了。卡死的原因如下:
(1) IMX6ULL芯片没有开启硬件浮点运算。
(2) 在编译的时候没有使用浮点编译选项。
下面具体介绍 Cortex-A系列芯片硬件浮点的开启与编译时开启方法。
开启硬件浮点运算
"ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf "文档 与 " Cortex-A7 Technical ReferenceManua.pdf " 文档