51单片机播放音乐(三):PWM播放任意波形 |
您所在的位置:网站首页 › 歌曲代码怎么生成 › 51单片机播放音乐(三):PWM播放任意波形 |
51单片机播放音乐(三):PWM播放任意波形
原理
PWM
仿真电路图
音频文件转成PWM代码
单片机代码
仿真输出波形
本文完整源码 原理 PWM详细的参考这篇文章,这里简单说一下 脉冲宽度调制(PWM)的基本原理是冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。冲量指窄脉冲的面积。效果基本相同,是指环节的输出响应波形基本相同,低频段非常接近,仅在高频段略有差异。这样,输出频率相同占空比不同的方波,接上惯性环节,就能实现DA转换了 从滤波的角度看,就是用一个低通滤波器把PWM波的交流部分过滤掉,只留下直流部分。这个滤波器的参数有几点要考虑: 不同占空比的方波频域第一个峰都是载波频率,所以要把滤波器的截止频率设置在0Hz到PWM载波频率之间 截止频率低会导致建立时间长,波形跟不上;截止频率高会导致纹波大,表现为听到的声音一直有高频噪声 增加滤波器阶数可以加快高频部分的衰减,这样建立时间和滤波性能都有改善,但是增加阶数会导致成本变高(仿真中不用考虑) 增加PWM载波频率可以改善性能,但是由于单片机速度限制载波频率很低(大约5000~8000Hz) 仿真电路图单片机从P1.0口输出PWM波,经过6阶RC低通滤波器,隔直,放大20倍后接到扬声器。滤波器的幅频特性曲线如下图所示,3.89Hz已经达到-60dB,这样噪声放大后的幅度大约也就1% 这次要用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 = |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |