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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:25:26