【发布时间】:2016-12-06 15:11:27
【问题描述】:
我正在通过串行接收来自 24 位 ADC 的 EEG 数据。 ADC 数据以 3 个字节从 MSB 传输到 LSB。完整的数据包是 21 个字节:
第一个字节是起始字节 - 0xFF(十进制的 255) 然后是包号字节。 然后接下来的 3 个字节是 24 位 ADC 值分解为 MSB LSB2 LSB1 我可以很好地解析数据,但重新构造一个 2 的补码有符号 int32 数会导致问题。我得到的值当然不能反映 ADC 应该给出的值。
下面是读取和解析 504 个样本的行(这给了我 24 个 ADC 值(504 个样本/21 个字节 = 24 个值))。我尝试了 uint8 而不是 uchar ,结果相似(当我尝试 int8 时,我得到一个无效的指定精度错误)。
comEEGSMT = serial(com,'BaudRate',3000000);
fopen(comEEGSMT);
rawData(1:504) = fread(comEEGSMT, 504, 'uchar');
fclose(comEEGSMT);
startPackets = find(rawData == 255);
bytes = rawData([startpackets+2 startpackets+3 startpackets+4]);
我尝试了以下方法来重构该值:
ADC_value = bytes(:,1)*256^2 + bytes(:,2)*256 + bytes(:,3);
下面一行是将上述数字转换为伏特的公式:
ADC_value_volts = ADC_value*(5/3)*(1/(2^32));
值在 4000 - 8000 微伏的范围内,具有较大的值跳跃。值应在 200 - 600 微伏范围内,变化很小。
我发现了与类似问题相关的其他问题,但尝试以下链接中的建议解决方案没有成功:
非常感谢任何帮助,因为我已经坚持了很长时间。
谢谢马克
【问题讨论】:
标签: matlab casting serial-port bit-shift adc