You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 15:52:47