之前参加某宝商家的免单活动(其实就是shua dan了,活动早就没了,别问了)免费得了个LED点阵胸牌。到手后发现他配套的上位机非常非常难用,10次连接,1次不到的概率能连接到胸牌下载程序,而且内容编辑功能也巨难用。然而,转念也想,貌似作为一个胸牌我也用不到,还不如跟风改造个音乐频谱,于是就有了今天的帖子。 胸牌原装的芯片是GD32f150c6t6,这个芯片时国内MCU企业兆易创新推出的超值型单片机。然而这个东西不像pos机上的gd32f103,和stm32f03基本上是完全兼容的。这货的引脚和stm32f103c8不兼容,但是和stm32f030c8引脚兼容(如图),然而GD32f150c6t6的内核是cortex m3,stm32f030c8内核是cortex m0,也就是说,这两个在内核上也是不兼容的。 ![]() 可以使用串口做isp下载,但是这样不能做调试还要每次下载拉boot0很不爽的。在观察电路的时候,我甚至发现,这个板子上的BOOT0引脚是直接接地的。也就是说,这真心断了我在原装芯片上折腾的兴趣。 正好GD32f150c6t6和stm32f030c8的引脚是兼容的,我手上也有几片stm32f030c8,于是就开始了本帖的魔改心路例程 首先先放上魔改总体设计图 ![]() 第一步当然是拆原装芯片 拆下来的gd32妥善保管,以防以后研究没有进展不想玩了的时候,还有后悔的机会,吧原来芯片换回去就满血复活了 ![]() 因为这个pcb是黑色的,所以在跑走线的时候,真心是一边骂娘一边在放大镜下看 顺便拍下了空焊盘下的走线,方便以后备查 ![]() 还有一张 同时经过测量,我也吧boot0接地的走线直接隔断了,也是为了方便以后操作 ![]() 换上stm32f030(这个芯片不带USB,这是和gd32的一个区别) ![]() 因为是黑油,很难完整的排查出走线,所以使用了观察走线(查出哪些走线和led有关)+程序点亮排查+万用表点亮(确定行列逻辑)的综合手段来排查 最后大概花了两天的时间吧走线跑通并实现点亮。 首先,这个led是44(列)*11(行)的点阵,使用了23个io来驱动 其次,每两列是共阳的 接着,每一行是有2-3个io来共阴驱动的,驱动的时候,一组负责奇数,一组负责偶数(大致是这样的,实际更复杂,但是也有规律) 最后,吧行列线直接直连。 第23根线的作用类似于用来解决对角线引脚重复问题(大致是这样的,实际更复杂,但是也有规律) 上面这段貌似说了一大堆也没说明白,其实这东西,语言不好讲明白,画电路图很复杂,只能意会不好言传,哈哈。暂且认为你们听懂了,实在不懂的,可能去看下程序怎么实现的,就懂了。 如图是吧所以列的共阳拉高,拉低点亮其中一行的情况,看到了吧,这规律还是有点风骚的 ![]() 行驱动在对角线位置会出行跳到下一行的动作,并且奇偶会发生变化。这样就是为毛我熬了两天才吧所有线序弄明白的原因。 设计者的这个设计真的太精妙也太复杂了 ![]() 最后的测序结果如图,很佩服用23个io点亮了484个led的人 ![]() 其实这个工程到这里就算是吧最难的坎过去了,后面要做啥都很简单了,只要扫描驱动就好 如图是我做的驱动和原装没改造过的显示亮度效果对比 为了追求亮度,貌似我设置的扫描速度要稍微慢了点,但是也只是局限于相机的效果,反正眼睛看,都一样,没区别 ![]() ![]() 后面点亮了整个led就是开始改造频谱了。 主要是加了在PA3输入音频信号,剪了一个报废的耳机线接上,又焊接了一个座子供声音输出监听用的。 板子左边吧供电和调试用的swd都引出来了。 至于外观,请勿吐槽,处于实验阶段都是随便乱接线的,图的是方便,要美观的话肯定是要等到设计定性以后才考虑的 ![]() 特写 ![]() 然后开始编程。主要就是吧快速傅里叶变换(FFT)的东西弄好了,就可以玩了 快速傅里叶变换(FFT)的这个东西,不接触的时候,看着就感觉都难,实际上,如果吧他当作一个黑箱来用的时候,其实就不怎么难了。 具体详细原理可以看这两个帖子: http://www.51hei.com/bbs/dpj-49593-1.html http://www.amobbs.com/forum.php?mod=viewthread&tid=5574941 (我大致说下怎么用,说的不好大神勿喷) 也就是说,这个东西的作用就是吧一段采集到的的信号进行分析,从而得到这段信号里面频率的分布和对应的强度,也就是说吧时域信号转为频域信号。 而如果我们吧他看作一个黑箱,给他输入的信号是adc采样得到的信号,中间进行了一些换算,换算的结果是以复数的形式表现的,最后进行取模运算,就是这个频率点对于的模长(可以理解成强度)。 我用到的是进行128点的转换。首先使用定时器进行定时(我设置了24khz采样,也就是说,最高能捕捉12khz的信号),设置每次定时器溢出的时候自动触发一次ADC转换。转换完成后的数据由DMA自动搬运到内存指定位置,这个采样过程无需cpu干预,完全自动,处理器该干嘛干嘛去。在完成128次定频率的转换后,会触发一个完成中断,在中断里面将处理完成标志置为1。 然后我们定义一个数组,里面使用结构体,实部加虚部,
复制代码
当满足上一次换算完成和adc采样完成的两个条件时,将所有采样adc得到的数据搬运到上面定义的数组里面的实部里面,然后将所以虚部赋值为0. 这个数组完成赋值后,就可以吧他丢给FFT函数进行换算了,具体的换算过程,我们不用管他,当做黑箱来用,感兴趣的可以看看书。 完成换算以后,换算的结果是以复数的形式表现的,比如某个频率的信息以a+bi的形式表示,这里a是实部,b是虚部,最后进行取模运算,也就是取a和b的平方根,就是这个频率点对于的模长(可以理解成强度)。 将这个模长进行长度拉申或压缩(为了适应屏幕的显示高度),然后就可以吧这些内容显示到屏幕上了。 核心代码展示 其实真的很简单,不难
复制代码
我现在做的转换所需耗时的参数和专业人士做的还是有很大的差距,不过也是在可视范围内完全完全够用了。 做128点FFT运算。处理器M0内核,速度48mhz。每次转换耗时约20ms的样子。也就是说每秒刷新50次已经完全超出视觉了,也是够用了。 而这次做下来,最花时间的首先是跑LED的走线和想办法驱动,第二花时间的是如何实现TIM+ADC+DMA的自动运行。因为我是第一次用STM32F030,之前用103的时候很多想法都有先人实践过,大部分抄过来改改就行了,然而030真心资料好少,调试这三样东西花了我好多的精力才调通。其中有两个坑要说的,默认的TIMER-TRGO事件是定时器复位而不是定时器updata溢出,也就是说,要配置成updata,才能在每次定时器溢出的时候触发adc 。第二出就是这个芯片的定时器15个人感觉有很大的问题。它定出来的时间是常规的128分频,然而我找了参考手册,没找到关于怎么调整这个分频为1分频的地方。参考时钟树,发觉同样是挂在APB2上的定时器16,确是一切正常,毫无半点问题,这也是百思不得其解。。。。之前我是用定时器15触发adc的,结果发觉频率老是不对,后来改到了定时器3触发,就一切正常了。 最后说一点,对于USB和电池电压检测,因为换了030,都是不支持的,所以这方面我就没研究了。 使用软件单一频率的扫频部分图 ![]() ![]() 最后是音乐播放的视频 其实如果这个点阵能宽度变成2倍的话,也就是44*22的话,那么显示效果真的能大大提升,现在这个矮矮的,频率条子太容易冲出去了。 里面有四首歌,(按顺序)分别是,这些歌里面除了第三首是看了坛友的视频跟风测试的以外,其他几首貌似都比较小众,个人感觉也很悦耳,算是安利一发吧,喜欢的可以下载听听 King of My Heart 歌手:Love & the Outcome Bonnie & Clyde 歌手:Sarah Connor/Henning Wehland My Soul(忧伤还是快乐) 歌手:昼夜 The Riot's Gone 歌手:Santigold 源代码在这里:链接:http://pan.baidu.com/s/1sk9jV1V 密码:tce9 或者可以下载附件 回帖都有m币哦
[ 此帖被2545889167在2016-11-12 12:16重新编辑 ]
(责任编辑:admin) |