国学芯用 发表于 2023-5-12 17:11:23

八音盒例程分享——基于stc32g12k128的硬件spwm乐音产生应用实例

在调试装置时需要一个稳定的声音源,想到之前买的有不少stc的MCU芯片,可以用它来产生几个声音信号。于是写了这个程序。
八音盒能产生七个不同的乐音,而音乐就是由这些基本乐音组合构成(有点脸红)。所以本例程就是个基于MCU的乐音产生程序。
用MCU产生一个乐音本身很简单,比如要产生一个110HZ的乐音,只要用MCU生成一个频率为110HZ的PWM方波,然后输出电路上加个一阶低通滤波器,驱动喇叭就听到声音了。
   但当我们需要产生多个乐音时,就遇到一个问题,不同乐音的频率不同,需要的滤波器的参数就不一样,只用一个滤波器时,频率高的乐音会受到较大的衰减。结果低音很强,高音听不见了。
当然可以用七个不同的低通滤波器,应对七个频率,用一个cd4051进行选择,mcu输出不同频度时,控制cd4051接通不同的滤波器。不过这样硬件就多了几样。而且无法适应更多的频率。
常用解决办法是采用一个高频率的载波,然后把需要产生的声音频率信号调制到载波上。这样就节省了滤波器。这就是spwm波。它是一个脉冲宽度按正弦规律变化的PWM波。下面给出一个实现方法。
      stc32g12k128具有硬件pwm功能。只要做好设置,它能自动产生符合设置频率和脉宽的PWM波,不需要占用MCU时间。我们只要合理控制它的脉宽变化,就能得到需要的SPWM波了。所以程序简单稳定。精度也很高。
我选择系统主频用24MHZ,载波频率为55*512=28160HZ。55为参考频率,512为对应该频率时正弦波表的点数。因为人耳可闻声频率上限20KHZ,所以这个频率不会对乐音产生干扰,同时它又能保证每个周期对应一个波点数据。最大限度的保证产生的声音的精度。对其它频率的乐音,载波频率不变,只改变正弦波表的点数。始终保证系统在最大精度上运行。该载波频率对应的周期设置值为:24000000/28161=852=0x0354
         STC官方技术手册上有现成的产生spwm波的例程。就直接套用了,包括pwm设置和pwm中断服务。本例程主要是解决正统波表的生成,管理,使用。乐谱表的建立和使用。乐曲的播放管理。

原链接:https://www.stcaimcu.com/forum.php?mod=viewthread&tid=2213
页: [1]
查看完整版本: 八音盒例程分享——基于stc32g12k128的硬件spwm乐音产生应用实例