亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」

本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于ATmega1284p的XBee对讲机

发布时间:2022-11-08
分享到:

基于ATmega1284p的XBee对讲机

发布时间:2022-11-08
分享到:

简介

项目是AVR Arduino 平台上模拟信号(音频)的简单应用,演示了 Goldilocks Analogue(1284p UNO 兼容)。我正在构建一个基于 AVR ATmega1284p MCU 的高级 Arduino 克隆,它具有一些特殊功能,包括 12 位 DAC MCP4822、耳机放大器、2x SPI 存储器(SRAM、EEPROM)和 SD 卡。模拟输出有许多现实世界的应用,但由于 Arduino 平台没有集成 DAC 功能,因此发布的模拟信号应用非常少。对讲机是结合使用数字和模拟来制作一个简单但非常有用的项目的一个例子。

实际的对讲机功能实际上只有几行代码,但它建立在模拟输入(采样)、SPI 总线上到 MCP4822 DAC 的模拟输出、采样定时例程和 XBee 数字无线电平台的基础之上。让我们从顶部开始,然后逐层向下挖掘。

XBee电台
我正在使用 XBee Pro S2B 无线电,配置为点对点通信。对于 XBee Pro,需要将一个无线电配置为协调器,另一个配置为路由器。Internet上有配置指南。

我已将无线电配置为在发送数据包之前等待最大字符间时间,这意味着只有在满时(84 字节)才会设置数据包。这最大限度地提高了无线电吞吐量。原始吞吐量为 250 kbit/s,但实际用户数据速率限制在 32 kbit/s 左右。这会影响采样率,从而影响可传输的语音质量。

使用 8 位采样,我发现大约 3 kHz 采样产生的数据量与无需压缩即可传输的数据量差不多。我要为另一个项目留下压缩。

XBee 无线电配置为 AT 模式,充当两个端点之间的透明串行管道。这是通过数字无线电连接两个设备的最简单方法。它让我可以使用有线进行简单的测试,然后再担心无线电平台是否正常工作。

查看逻辑分析仪的跟踪,我们可以看到 XBee 数据包到达串行端口的(紫色)Rx 线上。接收到的数据包数据存储在环形缓冲区中,并以恒定速率播放。我在接收环缓冲区中允许最多 255 个字节,这已经足够了,因为 XBee 数据包大小为 84 个字节。

要传输到其他设备的样本在(蓝色)Tx 线上传输,或多或少在每个采样周期中传输,即使它们在传输前被缓冲。XBee 无线电将这些字节缓冲最多 0xFF 符号间周期(配置),并且仅当它有一个完整的数据包时才将数据包传输到另一个端点。

采样率
查看传输链路的比特预算,我们需要计算在不使 XBee 无线电平台过载并导致样本丢失的情况下可以传输多少数据。由于我们没有公开压缩语音样本,因此我们有 8 位样本乘以 3,000 Hz 采样或 24 kbit/s 来传输。这似乎工作得很好。我已经尝试过 4 kHz 采样,但这太接近理论最大值,并且不能太有效地工作。

查看逻辑分析器,我们可以看到从 0x7E 和 0x7C 开始的字节数据包到达 Rx 线上。麦克风放大器和 DAC 输出都偏置在 0x7F(FF) 左右,因此我们可以看出此处捕获和传输的信号电平非常低。显示的采样率为 3,000 Hz。

样本处理
我在一个输出上放置了一个“ping”,以便在处理采样中断时进行捕捉(黄色)。我们可以看到,相对于可用的总时间,该应用程序在中断处理上花费的时间非常少。可能可以实现某种数据压缩。

在采样中断期间,有两个主要活动,通过将样本放置到 DAC 上生成音频输出,然后读取 ADC 以捕获音频样本并将其传输到 USART 缓冲区。

这是由 audioCodec_dsp 函数完成的,该函数从定时器中断中的代码调用。

我正在使用 AVR 8 位 Timer0 通过触发中断来生成定期采样间隔。通过使用标准音频频率的二进制倍数的 MCU FCPU 频率,我们可以仅使用具有 64 时钟预分频器的 8 位定时器来生成准确的再现采样率。要生成奇数音频频率,如 44,100 Hz,16位 Timer1 可用于获得足够的精度,而无需时钟预分频器。

ATmega1284p ADC 设置为自由运行模式,并按比例缩小至 192 kHz。虽然这接近记录的 ATmega ADC 的最大采集速度,但仍然在 8 位样本的规范范围内。

这个中断需要 14 us 才能完成,相对于每个采样周期的 333 us 来说非常短。这让我们有足够的时间进行其他处理,例如运行用户界面或进一步的音频处理。

SPI
在最后的细节层面,我们可以看到将输入样本输出到 MCP4822 DAC 的实际 SPI 事务。

由于我在使用标准 SPI 总线的 Goldilocks Analogue Prototype 2 上构建了此应用程序,因此事务正常。我后来的原型在 ATmega1284p 的 USART 1 上使用主 SPI 模式,它通过双缓冲稍微加速 SPI 事务,并释放正常的 SPI 总线以同时读取或写入 SD 卡或 SPI 内存,用于音频流。在 Walkie Talkie 应用程序中,无需捕获音频,因此使用较旧的原型和普通 SPI 总线没有任何缺点。

组合起来
使用一些预先存在的工具和几行代码,可以快速构建一个数字加密并且能够传达语音的对讲机。

这是一项将基于 MAX9814 的麦克风输入添加到 Goldilocks Analogue 的测试。我将修改Prototype 3并将添加麦克风放大电路以支持需要音频输入的应用,例如这个对讲机示例、语音转换器或人声控制音乐合成器。

我还在以 24.576 MHz 的增加频率运行 ATmega1284p 设备,超过了 20 MHz 的标准速率。这个特定的频率可以非常精确地再现从 48 kHz 到 4 kHz(甚至低至 1,500 Hz)的音频样本。

如果您对此项目有任何想法、意见或问题,请在下方留言。

以上内容翻译自网络,原作者:Phillip Stevens,如涉及侵权,可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论