前言
这次是第二次跟着张老师做乐器了,张老师对电子乐器DIY这块还是很有创意的,在这里还是很感谢张老师的教导。原以为此次时间安排应该是很充足的,但是成年的时间往往都不是自己能做主的,目前只完成了基础的功能,有很多想法想做但是没有更多的时候,只能后期慢慢补充了
硬件分析
立创开源链接:https://oshwhub.com/dr-zhang/eepw_drum
主控
主控采用STM32F103RET6,这个跟STM32F103C8T6是一个系列的,做电子的应该都比较熟悉了,这颗主控就是比C8T6多了一些资源,在这个设计中主要是要运用到DAC的功能是C8T6没有的
主控就是一些基础的,晶振,复位电路,各组电源供电,及boot引脚状态要注意,要不然芯片就无法正常运行了
供电电路
供电主要使用的是锂电池供电,USB提供5v供电给锂电池充电,有一个充电电路,电池输出电压通过稳压电路转成3.3v给整个系统供电
注:在供电这里遇到的小插曲,我没焊接电池直接用USB给系统供电,会导致供电不足,系统会重启,整个系统是电池供电的,USB供电只是给电池充电,这个可以优化一个电路将5v输出也接到3.3稳压输入端,在电池输出到稳压通路上加一个单项导通的二极管,这样能实现USB供电使用
彩灯电路
灯珠使用的是WS2812,这个3色灯也是DIY发烧友常用的显示器件了,使用的资源非常少,只要一个io即可控制,通过协议去切换自己想要的效果
触摸电路
这里使用的是TTP223-BA6触摸芯片,整体触摸反馈还是可以的,比我之前自己使用的那个好多了
三种音频输出硬件
第一种PWM
这个通过占空比的变化,通过阻容整型滤波可输出模拟信号
第二种 R/2R DAC
这种DAC输出方式是个人第一次遇到的,设计的很巧妙,也是最基础的电路知识,最早DIY都是用单片机,基本没有DAC的功能,看到这个电路后有种相见恨晚的感觉
第三种,芯片直接输出DAC
这边做了一个通道选择的拨码开关,让我们这些学习知识的同学们,可以验证多种方案的实现
功放电路
主控出来信号的最大值是有限的,如果直接输出到播放器件的话效果是比较差的,这里添加了一个功放电路,把原理的信号进行响应的放大,但是我们这边最大供电也只有电池的最大电压,所以放大音量也不是很大
软件分析
首先,感谢张老师提供的Demo,我的设计是基于张老师的Demo修改完成
代码目前主要就几个部分
WS2812的驱动
触摸按键的识别
音频的转换输出
WS2812
WS2812是一种单总线控制方式,通过一个io口根据WS2812的通讯协议转换电平,实现显示数据的发送,由于我们原理图中设计的一个普通IO控制,所以要自己编写对应的协议代码,使用普通IO口也是相对稳定的
我之前用过一个方案是相对简单,这种方案仅适合硬件资源相对宽裕的情况下,将协议输出引脚设计到SPI的数据输出功能引脚上,直接调用SPI写命令即可将数据传输出去,实现原理是一样,一种使用硬件SPI方式,一种使用io输出协议方式
触摸按键的识别
此次方案中的按键识别,使用的是触摸ic识别输出,这次使用的ic个人在使用上感觉还是不错的,按键的识别就是普通io的控制了,为了及时响应按键的触发动作,代码中采用了外部中断的功能,这样能快速触发按键响应
音频的转换输出
重点来了,音频的转换算是这个代码中最重要的部分,也是知识点最多的部分
音源的获取及转换参考张老师的帖子:http://forum.eepw.com.cn/thread/376874/1
音频转换主要是通过定时器定时往,对应的通道(DAC,PWM,R/2R)赋值,这里有个地方要注意的, 就是定时器的时间要和音源采样的频率一致,要不然声音会失真
DAC就是初始化对应DMA,定时器触发往DMA赋值即可
PWM是先定义好输出频率,我们这里修改的主要是PWM的占空比,通过外部硬件滤波显示数模信号的转换
R/2R 这个是直接对IO口赋值即可,R/2R的原理就是通过IO状态的不同电路自动转换DAC的输出电平
通过测试个人感觉几个通道效果 R/2R ≥ DAC > PWM
成品展示