ATtiny402 ADC输出异常:为何需右移6位才能获取正确结果?
ATtiny402 ADC结果需右移6位的原因及修正方案
核心原因:开启了ADC累加采样功能
你在配置中设置了ADC0.CTRLB = ADC_SAMPNUM_ACC64_gc;,这会让ADC对采样结果进行64次累加后再存入ADC0.RES寄存器。
ATtiny402的ADC单次转换是10位精度(范围0x0~0x3FF),当选择64次累加时,最终结果是单次值的64倍(即左移6位)——因为64次10位值累加的总和会占据16位寄存器,高6位是累加带来的放大位,低10位是重复的原始值分量。因此必须右移6位(等价于除以64)才能还原出平均后的10位有效结果,这就是你当前需要右移的原因。
两种修正方案
方案1:关闭累加采样,直接获取单次10位结果
如果不需要通过累加来提升抗干扰能力或精度,可以将ADC0.CTRLB改为单次采样配置:
ADC0.CTRLB = ADC_SAMPNUM_NONE_gc; // 关闭累加采样,单次转换后直接返回10位结果
修改后,ADC0.RES将直接输出0x0~0x3FF范围内的10位转换值,无需右移操作。
方案2:保留累加采样,继续使用右移6位获取平均值
如果需要累加采样的优势,可保留当前ACC64配置,继续通过ADC0.RES >> 6来得到64次采样的平均结果,这是合理的用法。
额外问题:参考电压配置错误
你的代码注释标注使用VDD作为参考电压,但实际配置的是内部1.024V参考,这会导致转换结果的电压对应关系错误。正确的VDD参考配置应为:
// 先清除原有参考电压配置位,再设置为VDD参考 ADC0.CTRLC &= ~VREF_ADC0REFSEL_gm; ADC0.CTRLC |= VREF_ADC0REFSEL_0VDD_gc;
修正后,ADC的参考电压才会与你注释描述的VDD一致。
内容的提问来源于stack exchange,提问作者BeamString
相关产品推荐
相关产品推荐

