关于SAR ADC 16位输出数据处理代码中&0xFFFF与-0x7FFF位运算作用的技术咨询
拆解SAR ADC数据转换代码中的位运算与偏移处理
我来帮你一步步解析这段代码的逻辑,重点解答你疑惑的-0x7FFF部分:
1. 先看完整代码块
uint16_t adc_output; int32_t mVals = 0; mVals = ( ((int32_t)( adc_output )) & 0xFFFF ) - 0x7FFF;
2. 解析(int32_t)adc_output
adc_output是uint16_t类型(16位无符号整数),强制转换成int32_t(32位有符号整数)时,编译器会做零扩展:把16位原始数据放到32位整数的低16位,高16位全部补0。比如adc_output为0xFFFF时,转换后就是0x0000FFFF(32位),不会出现符号扩展的问题。
3. 解析&0xFFFF
这一步其实是冗余操作——零扩展后的int32_t值高16位本来就是0,和0xFFFF按位与后结果完全不变。代码作者可能是为了保险(比如防止特殊编译器的异常转换行为),或是出于编码习惯保留这一步,确保只保留低16位的ADC原始输出。
你之前误以为这一步是把负数转正数,其实不对:adc_output本身是无符号类型,不存在负数,这步只是确保高位清零,和负数转换无关。
4. 核心重点:- 0x7FFF的作用
这是整个转换的关键,得结合SAR ADC的输出格式理解:
大多数16位SAR ADC的输出采用**偏移二进制(Offset Binary)**格式,特点是:
- 输入为满量程负端(最低电压)时,输出
0x0000 - 输入为中间参考电压(比如0V或Vref/2)时,输出
0x7FFF(即2^15 - 1 = 32767) - 输入为满量程正端(最高电压)时,输出
0xFFFF(65535)
减去0x7FFF的操作,就是把偏移零点的无符号值,转换成以中间电压为零点的有符号整数:
- ADC输出
0x0000时,计算结果为-32767(对应满量程负端) - ADC输出
0x7FFF时,计算结果为0(对应中间零点) - ADC输出
0xFFFF时,计算结果为0x8000(即32768,对应满量程正端)
注:标准16位偏移二进制转补码通常是减0x8000,得到-32768 ~ +32767的范围,这段代码减0x7FFF可能是因为ADC有效位数为15位,或是硬件偏移设置特殊,但核心逻辑都是移除偏移,将无符号ADC输出转换为零点居中的有符号值。
内容的提问来源于stack exchange,提问作者luca audino
相关产品推荐
相关产品推荐

