0

我的项目是一个音频频谱分析仪,但我一直在显示 ADC 结果,无论是在我的 LCD 上还是在 CodevisionAVR 的终端上。

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

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

为了测试,我将 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 转换中的样本数。

4

1 回答 1

0

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

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

于 2014-05-31T22:01:36.653 回答