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

如何通过Microchip Studio C代码实现ATtiny212的ADC功能并解决读数异常?

ATTINY212 ADC读数异常,LED始终点亮的问题排查与修复

问题原因分析

你的代码存在两个关键问题导致ADC读数异常:

  • ADC仅执行单次读取:程序仅在上电初始化后读取一次ADC值,之后进入死循环不再更新读数。即使后续改变PA6引脚电平,LED状态也不会变化。
  • 内部参考电压未稳定就执行转换:启用内部参考电压后,需要等待其稳定才能进行准确的ADC转换,否则第一次读数会出现偏差。

另外,虽硬件运行其他代码正常,仍需确认SOIC转DIP适配器的PA6引脚是否与面包板电路正确连接,避免虚焊或引脚对应错误。

修正后的代码

/* ATMEL ATTINY212
   Pin 6 is /RESET
   
               +-\/-+
         Vcc  1|    |8  GND
DAC TXD  PA6  2|    |7  PA3 SCK
    RXD  PA7  3|    |6  PA0 UPDI RESET
SDA MOSI PA1  4|    |5  PA2 MISO SCL
               +----+

   PA3 is the LED output pin
   PA6 is the ADC pin AIN6
   
*/

#define F_CPU 3333333UL // Default Setting micro to 3.33MHz
// #define F_CPU 20000000UL // Setting micro to 20MHz

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h> // 添加延迟头文件

uint16_t adcVal;
void ADC0_init(void);
uint16_t ADC0_read(void);

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.CTRLC = ADC_PRESC_DIV4_gc /* CLK_PER divided by 4 */
    | ADC_REFSEL_INTREF_gc; /* Internal reference */
    ADC0.CTRLA = ADC_ENABLE_bm /* ADC Enable: enabled */
    | ADC_RESSEL_10BIT_gc; /* 10-bit mode */
    /* Select ADC channel */
    ADC0.MUXPOS = ADC_MUXPOS_AIN6_gc;
    
    // 等待内部参考电压稳定(至少1ms,根据 datasheet 要求)
    _delay_ms(1);
}

uint16_t ADC0_read(void)
{
    /* Start ADC conversion */
    ADC0.COMMAND = ADC_STCONV_bm;
    /* Wait until ADC conversion done */
    while ( !(ADC0.INTFLAGS & ADC_RESRDY_bm) )
    {
        ;
    }
    /* Clear the interrupt flag by writing 1: */
    ADC0.INTFLAGS = ADC_RESRDY_bm;
    return ADC0.RES;
}

int main(void)
{
    ADC0_init();
    // 先设置PA3为输出模式,避免初始状态不确定
    PORTA.DIR |= (1 << 3);
    
    while (1)
    {
        adcVal = ADC0_read(); // 循环中重复读取ADC值
        
        if(adcVal > 10) {
            // PA3 LED on
            PORTA.OUTSET = (1 << 3);
        } else {
            // PA3 LED off
            PORTA.OUTCLR = (1 << 3);
        }
        
        _delay_ms(100); // 添加小延迟,避免频繁转换
    }
}

关键修改说明

  • 添加util/delay.h头文件:用于实现参考电压稳定延迟和循环读取的间隔延迟。
  • 初始化后添加参考电压稳定延迟:在ADC0_init()末尾加入_delay_ms(1),确保内部参考电压稳定后再进行转换。
  • 将ADC读取和LED状态更新移至死循环内:程序会持续监测ADC引脚电平,实时更新LED状态。
  • 提前设置PA3为输出模式:避免LED初始状态不确定。

额外检查项

  • 确认PA6引脚与电位器/接地的连接是否牢固,SOIC转DIP适配器的引脚对应关系是否正确(参考你提供的引脚图,PA6是引脚2)。
  • 若使用外部电源,确保Vcc电压稳定在芯片允许范围内(ATTINY212的Vcc范围是1.8V-5.5V)。

内容的提问来源于stack exchange,提问作者Erik Vincent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:53:15