STM32F401+nRF24L01无线传输音频(对讲机原型)
尝试结合STM32F401的ADC, PWM, SPI(NRF24L01)和TIM, 试验了一下音频的无线传输(对讲机原型)
工作机制
音频采样
因为硬件的限制, 包括STM32F401片内存储, 内存大小, PWM频率, 以及之前实际测试NRF24L01得到的经验数据, 采样使用了最基础的8bit分辨率, 采样频率为16KHz附近
- SYSCLK使用25MHz, APB2CLK使用一半频率, 即12.5MHz
- ADC在APB2CLK基础上8分频, 所以ADC时钟为12.5MHz/8
- ADC使用8bit分辨率, 对应11个ADC时钟, 采样周期设置为84, 所以每次采样为95个ADC周期, 这样实际采样频率为 12500000 / 8 / 95 = 16,447 Hz, 接近16KHz
- 使用ADC2DMA, DMA使用一个32byte大小的uint8_t数组
无线传输
- 使用fastwrite机制, 即一直保持在发状态, 只要FIFO TX队列未满就一直往里写, 如果满了就检查MAX_RT标志位, 如果置位则拉低再拉高CE重置发送状态
- 采样端使用DMA的传输完成中断, 对应32个byte的DMA内存, 每次采集满32个byte都会触发中断, 此时调用NRF24L01进行发送
- 接收端使用IRQ中断接收, 创建一个128Byte的接收数组, 循环写入. 每次接收中断就往里面写32个byte, 往后增长, 到右边界后再从0开始
音频输出
- 接收端也使用25MHz的SYSCLK
- 接收端启用PWM输出, 输出分辨率为8bit
- 接收端启用Prescaler=0, Period=1561的定时器TIM3, 这个配置对应的频率为 25000000 / (0 + 1)(1561 + 1) = 16,005 Hz, 接近16KHz. (注: 这里频率选择有些问题, 应该要比发送端频率略高, 这样才能保证在持续发送中, 播放不被接收打断)
- 每次定时器触发中断, 都会在128byte的接收数组中检查是否有新数据, 有则前进一格并以此值修改PWM占空比, 无则跳过. 如果已经到达数组右边界则返回到数组0下标.
电路
输入端电路
输入端使用一个驻极体二极管加S9014组成简单的放大电路. 电路图取自网图, 元件的取值说明
- R1 取值范围在1KR至3.3KR, 不要超过5KR, 否则声音太小
- C1 取值范围在0.1uF至1uF都可以, 不要太小
- R2 可以用1MR至1.5MR
- R3 取值10KR
- Q1 使用任意小功率NPN三极管均可, 实测过9013, 9014, 8050, 2N222, 基本没区别
- C2 10uF的独石电容或更大的47uF的电解电容都可以

输出端电路
输出端先经过以及RC低通滤波(R=20, C=10uF), 再使用PAM8403进行放大
项目代码
项目代码在Github: https://github.com/IOsetting/stm32f4-hal-projects/tree/main/Projects/WalkieTalkieDemo
可以使用Keil5 MDK打开和编译
测试记录
- 采样: 采样工作正常, 观察输出可以看到有动静时采样值的变化
- 传输: 仅在10米以内距离测试, 出现MAX_RT标志的比例很小, 至少从16KHz采样, 32byte一个package的发送速率看, 发送和接收都不是瓶颈. 当有墙体阻挡时错误率上升明显
- 播放: 背景噪音大, 在近距离时容易互相干扰产生啸叫. 播放效果较差, 沙沙声明显. 在加入低通滤波后能听清人声, 但是依然未能达到"能听"的水平.
电路部分原型

电路部分原型

发送端

下一步
因为传输不是瓶颈, 所以改进的方向主要是音质. 可能需要从几个方面进行排查:
- 播放方面. 这块是比较容易排查的, 比如使用单频音源输出, 使用预录的音源输出, 需要评估使用多高的PWM频率以及RC滤波参数能达到可接受的播放效果
- 采样方面. 如果有示波器会很方便, 没有示波器的话, 只能通过ADC采样的输出来判断, 需要写代码将数组输出到存储, 需要加一些片外存储
参考
- 驻极体话筒电路 http://mynixworld.info/2017/09/01/simple-electret-microphone-circuit/
- 如何用软件录制语音并转为代码数组 https://srituhobby.com/how-to-make-an-arduino-based-text-speech-project/
- 用STM32CubeMX配置DMA+PWM输出 https://blog.csdn.net/qq_30267617/article/details/109466698
- DMA+PWM输出的开始和停止 https://blog.csdn.net/Hot_Ant/article/details/107252154
STM32F401+nRF24L01无线传输音频(对讲机原型)的更多相关文章
- STC8H开发(八): NRF24L01无线传输音频(对讲机原型)
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- STC8H开发(九): STC8H8K64U模拟USB HID外设
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- STC8H开发(十): SPI驱动Nokia5110 LCD(PCD8544)
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- STC8H开发(十一): GPIO单线驱动多个DS18B20数字温度计
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- STC8H开发(十三): I2C驱动DS3231高精度实时时钟芯片
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- STC8H开发(十五): GPIO驱动Ci24R1无线模块
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- STC8H开发(十六): GPIO驱动XL2400无线模块
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- SDL开发笔记(二):音频基础介绍、使用SDL播放音频
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
随机推荐
- JavaScript - input 上传图片 并展示 (食用简单)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- [转帖]nginx中rewrite和if的用法及配置
nginx中rewrite和if的用法及配置 文章目录 nginx中rewrite和if的用法及配置 @[toc] 一.rewrite应用 1.rewrite跳转场景 2.rewrite实际场景 3. ...
- [转帖]使用 TiUP 升级 TiDB
本文档适用于以下升级路径: 使用 TiUP 从 TiDB 4.0 版本升级至 TiDB 7.1. 使用 TiUP 从 TiDB 5.0-5.4 版本升级至 TiDB 7.1. 使用 TiUP 从 Ti ...
- [转帖]CentOS7上systemctl的使用
https://www.cnblogs.com/yeyuzhuanjia/p/14676182.html CentOS 7.x开始,CentOS开始使用systemd服务来代替daemon,原来管理系 ...
- 【转帖】【漏洞提示】MySQL8.0.29因重大bug官网已下架
前阵子,MySQL官网已经将 MySQL 8.0.29版本下架.据悉下架原因是由于MySQL 8.0.29 存在关于InnoDB解释器的重大Bug.而最新版本 8.0.30及以上的版本已修复此漏洞.各 ...
- 【转帖】JAVA GC日志分析
https://zhuanlan.zhihu.com/p/613592552 目录 1. GC分类 针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Par ...
- [转帖]010 Linux 文本统计与去重 (wc 和 uniq)
https://my.oschina.net/u/3113381/blog/5427461 wc 命令一般是作为组合命令的一员与其他命令一同起到统计的作用.而一般情况下使用 wc -l 命令较多. u ...
- 【K哥爬虫普法】北京某公司惨遭黑客攻击13000000余次,连夜报警……
我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...
- 【K哥爬虫普法】淘宝一亿快递信息泄漏,有人正在盯着你的网购!
我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...
- 【2】Pycharm插件推荐,超级实用!每个小trick都可以快速提升变成效率!
相关文章: [1]Pycharm 主题设置推荐Material Theme UI以及编辑环境配置(字体大小和颜色) [2]Pycharm插件推荐,超级实用!每个小trick都可以快速提升变成效率! [ ...