ATtiny402 ADC值异常:输入超2.5V后数值不再递增
ATtiny402 ADC输入超2.5V后数值不再递增的问题解决
问题原因
你的代码中配置了ADC使用内部2.5V参考电压:
VREF.CTRLA = VREF_ADC0REFSEL_1_bm;选择了2.5V内部基准ADC0.CTRLC |= ADC_REFSEL_INTREF_gc;指定ADC参考源为内部基准
ATtiny402的ADC输入电压不能超过当前设置的参考电压,当输入电压达到或超过参考电压时,ADC读数会被钳位在满量程值(10位模式下为1023),所以输入超过2.5V后数值不再变化。
解决方案
根据你的需求选择以下两种方案之一:
方案1:改用VDD作为参考电压(适用于输入电压≤VDD的场景)
如果你的芯片供电电压VDD高于需要测量的最大输入电压(比如VDD=5V,要测0-5V的输入),可以直接将ADC参考源切换为VDD:
修改ADC0_init函数中的参考电压配置:
void ADC0_init(void) { /* Disable digital input buffer */ PORTA.PIN6CTRL &= ~PORT_ISC_gm; PORTA.PIN6CTRL |= PORT_ISC_INPUT_DISABLE_gc; /* Disable pull-up resistor */ PORTA.PIN6CTRL &= ~PORT_PULLUPEN_bm; // 移除内部参考电压相关配置 // ADC0.CTRLB = VREF_ADC0REFEN_bm ; // VREF.CTRLA = VREF_ADC0REFSEL_1_bm; ADC0.CTRLC |= ADC_PRESC_DIV4_gc /* CLK_PER divided by 4 */ | ADC_REFSEL_VDD_gc; /* 切换为VDD作为参考电压 */ ADC0.CTRLA |= ADC_ENABLE_bm /* ADC Enable: enabled */ | ADC_RESSEL_10BIT_gc; /* 10-bit mode */ /* Select ADC channel */ ADC0.MUXPOS = ADC_MUXPOS_AIN6_gc; }
方案2:添加分压电路(适用于输入电压>VDD的场景)
如果需要测量的电压高于VDD,必须在ADC输入引脚前添加电阻分压网络,将输入电压降至参考电压范围内(比如2.5V)。例如:
- 用两个10kΩ电阻串联,输入电压接在两个电阻的上端,中间节点接ADC引脚,下端接地。这样输入5V时,ADC引脚得到2.5V,对应满量程读数。
- 代码中需要将ADC读数乘以分压倍数(此例为2)得到实际输入电压。
注意事项
ATtiny402的ADC输入绝对最大电压为VDD + 0.5V,无论采用哪种方案,输入电压都不能超过这个值,否则会损坏芯片。
内容的提问来源于stack exchange,提问作者user21170594
相关产品推荐
相关产品推荐

