下图是Sensor 的datasheet. 按我的理解这是 24位ADC (bit0 - bit23) 其中 bit21,22,23 是符号位,bit0 到 bit20是数据位。
stm32F4 板子
官网给的sample code 里面,在表示负数的adc值 没看明白,
bit21-23 符号位有4种情况 ,
(000) 正数 并没有超出正的最大值
(111) 负数 并没有超出负数的最小值
(001)正数但超出了正的最大值
(110)负数但超出了负数的最小值
故用一个int32的变量 adc_data 来表示 adc 的值
int32_t adc_data = 0;
adc_data = (int32_t)(((SensorData[0] << 16) | (SensorData[1] << 8) | (SensorData[2] << 0))&0xFFFFFF);
uint8_t sign = 0;
sign =(uin8_t) ((adc_data & 0xE00000) >> 21); //1110 0000, 0000 0000, 0000 0000
adc_data = (adc_data & 0x1FFFFF); //0001 1111, 1111 1111, 1111 1111
switch (sign)
{
case 0: // Positive and lower than positive full-scale (within full-scale range)
{
adc_data = (adc_data & 0x1FFFFF); //0001 1111, 1111 1111, 1111 1111
break;
}
case 7: // Negative and higher than negative full-scale (within full-scale range)
{
adc_data = (adc_data & 0x1FFFFF) * (-1);// 我认为应该这样
adc_data = (adc_data | 0xFFE00000); //官网给的代码 不理解
break;
}
case 1: //Out of Positive Full scale
{
adc_data = 0x1FFFFF; //0001 1111, 1111 1111, 1111 1111
break;
}
case 6: // Out of Negative Full scale
{
adc_data = 0x1FFFFF * (-1); // 我认为应该这样
adc_data = 0xFFE00000; // 官网给的代码 不理解而且0xFFE00000 = 4,292,870,144 已经超出 int32 表示范围
break;
}
default:
{
break;
}
}// END switch
)