我的项目是一个音频频谱分析仪,但我一直在显示 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 转换中的样本数。