我的项目是一个音频频谱分析仪,但我仍然在我的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转换中的样本数。
答案 0 :(得分:0)
我看到的第一个错误是使用putchar()将数字写入LCD。
read_adc()的结果是一个数字,而不是ascii字符串。您需要使用sprintf将ADC结果作为字符串写入缓冲区,然后使用lcd_putsf()将缓冲区发送到LCD。