c - 如何使用 Arduino - atmega 2560 微 Controller 实现 8 位 DAC(数模转换)?

标签 c arduino embedded atmega atmel

我正在从事录音机和播放器项目。我想实现 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/

相关文章:

c++ - 需要有关编程方法的建议

在 C 语言中转换为字节

c - ctypes.struct(打包)中的 sizeof 与 C 中的打包结构不匹配

c - 当 scanf 输入是字符但转换说明符和变量是整数时,打印整数变量将返回 "weird"数字。为什么?

c - 使用 C 在 ARM Cortex M 系列上获取程序计数器值

automation - 使用 Arduino 进行照明控制

java - 没有 OpenGL、DirectX、XNA 等的 3D 图形理论和代码

c - Arduino 汇编程序编程 : Nothing happens

ios - iPhone串口编程

python - pySerial 中的 readline() 有时会捕获从 Arduino 串行端口流式传输的不完整值