如何通过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
相关产品推荐
相关产品推荐

