我的项目是一个音频频谱分析仪,但我卡在显示模数转换的结果,无论是在我的液晶显示器或在终端的CodevisionAVR。
该项目使用具有7.37 MHz外部振荡器的ATmega16A。对于集成开发环境,我使用的是CodevisionAVR。
音频频谱分析仪通过一根3.5 mm的插孔音频电缆输入,该信号经过放大和滤波以选择0到4 KHz之间的频率,该电路的输出连接到PA0,这是微控制器的模数转换器的0通道。
为了进行测试,我将ADC设置为工作在8位(读取最高有效的8位),使用内部2.56V作为基准电压。我已经使用一个10nF的电容器解耦了AREF引脚(为了更好地降低噪声,我会将其改为100nF )。ADC也处于自由运行模式。
我卡在显示模数转换器的结果,要么在我的液晶屏上,要么在CodevisionAVR的终端上(通过串口-使用向导配置)。
这是我在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转换中的样本数。
发布于 2014-06-01 06:01:37
我看到的第一个错误是使用putchar()将一个数字写入LCD。
read_adc()的结果是一个数字,而不是一个ascii字符串。您需要使用sprintf将ADC结果作为字符串写入缓冲区,然后使用lcd_putsf()将缓冲区发送到LCD。
https://stackoverflow.com/questions/23968514
复制相似问题