51单片机播放音乐(三):PWM播放任意波形

本文介绍了51单片机利用PWM播放音乐的原理和实现过程,包括PWM的基本概念,仿真电路图的设计,音频文件转化为PWM代码的方法,以及单片机代码的编写。通过6阶RC低通滤波器对PWM波形进行滤波,实现音乐播放。虽然存在高频噪声,但能清晰听到低频音符,适用于低频信号播放。
摘要由CSDN通过智能技术生成

51单片机播放音乐(三):PWM播放任意波形

本文完整源码

原理

PWM

详细的参考这篇文章,这里简单说一下

脉冲宽度调制(PWM)的基本原理是冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。冲量指窄脉冲的面积。效果基本相同,是指环节的输出响应波形基本相同,低频段非常接近,仅在高频段略有差异。这样,输出频率相同占空比不同的方波,接上惯性环节,就能实现DA转换了

PWM

从滤波的角度看,就是用一个低通滤波器把PWM波的交流部分过滤掉,只留下直流部分。这个滤波器的参数有几点要考虑:

  1. 不同占空比的方波频域第一个峰都是载波频率,所以要把滤波器的截止频率设置在0Hz到PWM载波频率之间
  2. 截止频率低会导致建立时间长,波形跟不上;截止频率高会导致纹波大,表现为听到的声音一直有高频噪声
  3. 增加滤波器阶数可以加快高频部分的衰减,这样建立时间和滤波性能都有改善,但是增加阶数会导致成本变高(仿真中不用考虑)
  4. 增加PWM载波频率可以改善性能,但是由于单片机速度限制载波频率很低(大约5000~8000Hz)

仿真电路图

电路图

单片机从P1.0口输出PWM波,经过6阶RC低通滤波器,隔直,放大20倍后接到扬声器。滤波器的幅频特性曲线如下图所示,3.89Hz已经达到-60dB,这样噪声放大后的幅度大约也就1%

幅频特性

音频文件转成PWM代码

这次要用2个定时器,定时器0负责输出高电平,频率等于PWM载波频率,定时器1负责输出低电平,它的定时时间等于本周期内高电平持续时间,根据占空比决定。因为单片机速度太慢,计算要尽量在电脑上完成,电脑上要计算好定时器1的初始计数。为了节省空间和使用8位自动重载定时器来提高精度,我限制了PWM频率不能太低,这样每个周期只需要1个字节编码

import wave

import numpy as np

# 晶振频率(Hz)
CRYSTAL_FREQUENCY = 11059200
# 计数周期(s)
COUNT_PERIOD = 1 / (CRYSTAL_FREQUENCY / 12)


def wav_to_pwm(wav_path, output_path):
    with wave.open(wav_path, 'rb') as f:
        n_channels, sample_width, frame_rate, n_frames, _, _ = f.getparams()
        assert sample_width in (1, 2), '只支持8位或16位采样'
        frame_period = 
  • 17
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值