使用CodevisionAVR在LCD或终端上显示ADC结果

时间:2014-05-31 09:40:05

标签: avr adc

我的项目是一个音频频谱分析仪,但我仍然在我的LCD或CodevisionAVR终端上显示ADC结果。

该项目使用ATmega16A,带有7.37 MHz外部振荡器。对于IDE,我使用的是CodevisionAVR。

音频频谱分析仪通过3.5毫米插孔音频线输入,此信号经过放大和滤波,以选择0到4 KHz之间的频率,此电路的输出连接到PA0,即微控制器ADC的通道0。

为了进行测试,我已将ADC设置为8位(读取最高有效8位),将内部2.56V作为电压参考。我使用10nF电容去耦AREF引脚(为了更好的降噪,我会将其改为100nF)。 ADC也处于自由运行模式。

我在显示ADC结果时,无论是在我的LCD上还是在CodevisionAVR的终端上(通过使用向导配置的UART)。

这是我用于ADC的功能:

    // Voltage Reference: Int., cap. on AREF 
#define ADC_VREF_TYPE ((1<<REFS1) | (1<<REFS0) | (1<<ADLAR)) 

// Read the 8 most significant bits 
// of the AD conversion result 
unsigned char read_adc(unsigned char adc_input) 
{ 
    ADMUX=adc_input | ADC_VREF_TYPE; 
    // Delay needed for the stabilization of the ADC input voltage 
    delay_us(10); 
    // Start the AD conversion 
    ADCSRA|=(1<<ADSC); 
    // Wait for the AD conversion to complete 
    while ((ADCSRA & (1<<ADIF))==0); 
    ADCSRA|=(1<<ADIF); 
    return ADCH; 
} 

代码的主要功能:

void main (void)
{  

Init_Controller();  // this must be the first "init" action/call!
#asm("sei")        // enable interrupts
lcd_init(16);
lcd_gotoxy(0,1);
lcd_putsf("AUDIO SPECTRUM");
delay_ms(3000);
lcd_clear();

    while(TRUE)
    {      
        wdogtrig();

        TCNT1 = 0; //usage of Timer1 with OCR1A 
        TIFR |= 1<<OCF1A;
        for(i=0;i<N;i++) {
            while((TIFR & (1<<OCF1A)) == 0)  
            putchar(read_adc());
            //adc_set[i] = adc_read(); //this is a second option
            TIFR |= 1<<OCF1A;
        } 
        //for(i=0; i<N; i++)
            //printf("adc values: %d \n",adc_set[i]);
} //end while loop
}

N定义为32 = 1次AD转换中的样本数。

1 个答案:

答案 0 :(得分:0)

我看到的第一个错误是使用putchar()将数字写入LCD。

read_adc()的结果是一个数字,而不是ascii字符串。您需要使用sprintf将ADC结果作为字符串写入缓冲区,然后使用lcd_putsf()将缓冲区发送到LCD。