我正在从事录音机和播放器项目。我想实现 ADC(模拟到数字)和 DAC(数字到模拟)转换器。该代码应在 Arduino - Atmega 2560(Atmel 微 Controller )中实现。我试图实现 ADC,我发现了以下代码:
void setup()
{
Serial.begin (9600);
ADCSRA |= ((1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0));
ADMUX |=(1<<REFS0);
ADCSRA |= (1<<ADEN);
ADCSRA |= (1<<ADSC);
}
int read_adc( int channel )
{
ADMUX &=0xE0;
ADMUX |= channel & 0x07l;
ADCSRB = channel & (1<<ADSC);
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC))
{
return ADCW;
}
}
void loop()
{
int w = read_adc(0);
Serial.write(w);
}
这里我将数字化信号发送到串口。我有两个问题: 1- 如何修改此代码以用作 8 位 ADC? 2- 如何像以前一样实现 DAC?我的意思是如何从串口读取数字信号,然后像上面的算法一样将其转换为模拟信号?
感谢您的帮助。
最佳答案
ATMega2560 没有 DAC 外设,但是如果您的带宽要求相对较低,您可以使用带有合适外部模拟滤波的 PWM 输出来产生可变输出电压(与脉冲宽度成正比)。
PWM频率越高,带宽越高,但分辨率越低,所以有一个trade-off。一个简单的低通 RC 滤波器可能就足够了。在某些情况下 - 例如 LED 或直流电机驱动,您根本不需要任何滤波,而 PWM 在任何情况下都是驱动此类负载的更有效方法。然而,对于音频应用程序,您通常需要过滤,除非直接驱动 Class D ampifier。 .
要实现 8 位 DAC,您需要将 PWM 配置为每周期 256 次计数,然后只需将脉冲宽度设置为从零到 255 次计数。充分过滤后,这将产生模拟电压。为了使滤波尽可能简单,PWM 频率应尽可能高,滤波器截止频率至少设置为该频率的一半,最好小于 f/5 或更高。这将决定您的音频带宽。对于语音,3Khz 就足够了(电话质量); 4.5KHz 是 AM radio 质量,而 15KHz 是 FM radio /HiFi 质量。
有许多关于将 PWM 用作 DAC 和必要滤波的在线资源和论文;例如 http://ltwiki.org/images/8/82/PWM_Filters.pdf
关于c - 如何使用 Arduino - atmega 2560 微 Controller 实现 8 位 DAC(数模转换)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30263913/