找回密码
 立即注册
查看: 4718|回复: 90

51 开源 180MHz-PWM-播放立体声音乐@STC32G12K128, USB-CDC实时传输音频

[复制链接]

该用户从未签到

46

主题

2935

回帖

6621

积分

超级版主

积分
6621
发表于 2023-11-19 23:46:24 | 显示全部楼层 |阅读模式
51 开源 180MHz-PWMA-播放立体声音乐@STC32G12K128, USB-CDC实时传输音频
WAV播放程序使用说明
1、简介
建议用户直接下载"Objects"里的"audio-play.hex"测试. 下载时选择主频30MHz
WAV播放器使用STC32G12K128运行,MCU内部HIRC工作于30MHzPLL180MHzPWM时钟,6分频30MHzCPU-系统时钟。
两路HS-PWM工作时钟为180MHzPWM周期为4097,输出PWM频率大约为44KHz(CD采样率44.1KHz相近),占空比为12位。
本播放程序支持以下WAV文件的播放,由【STC-ISP | 调试接口 |播放WAVE】界面通过 USB-CDC 虚拟串口/就是串口下传音频数据:
支持PCMADPCMA-Law
支持16位无压缩(CD音轨)WINDOWS PCM格式,单声道或双声道采样率最高支持44.1KHz
支持IMA-ADPCM格式,单通道或双通道采样率最高支持44.1KHz
支持A-law(A)格式,单通道或双通道采样率最高支持44.1KHz
语音解码算法可能看似跟网上的有差异,但算法实际是一样的,我只是将其简化操作而已。
各种算法可以网搜相关知识,但不在本文讨论之列。
2、输出滤波电路
输出PWM要经过低通滤波器获得光滑的模拟信号输出,请参考下图的电路:3阶巴特沃斯低通滤波器。
截图202311192339594436.jpg
PWMA1P--P1.0左声道,    PWMA3P--P1.4右声道。
左右声道完全一致,以左声道为例,PWM信号经过R1R2分压适当衰减后与C1组成第一阶RC低通滤波,将变化陡峭的PWM的高频谐波滤除,再送到运放组成的二阶低通滤波电路滤波输出,就得到模拟信号,经过C4隔直后得到交流信号,从3.5mm的立体声插座输出。用户可以用SPWM输出一个1000Hz正弦波来评估其性能。
上图参数为对应16KHz采样的输出,转折频率为不超过采样频率的一半即可。
要改成别的采样频率,则按比例改变电容即可,电阻不变。
注意:图中零件不是随便取的,是经过精心计算的,无源一阶低通、有源二阶低通的截止频率和Q值都不同,两者串联才能得到最终的输出响应。
模拟滤波器相关的知识不在本文讨论范畴,用户可以自行复习模拟电子技术基础的相关章节。

3、使用“屠龙刀三”核心板验证
本程序使用STC公司的“屠龙刀三”核心板验证,用户可以自行修改到自己的系统上。
与“屠龙刀三”核心板的连接:
将上述的P1.0P1.4VCCGND连接到核心板的对应焊盘即可,最好断开板上R107R108两个0欧姆电阻,避免其电路影响PWM信号。
板上的P3.2按键为播放键,P3.3按键为停止键。
P2.7为每个采样解码时间指示(高电平时间),用示波器观察。
P2.0为播放指示灯,正在播放时输出低驱动LED亮。
P2.1CDC接收数据包指示,每收到一包(64字节)就取反一次,下传数据一块为1024字节,分16个包传输。
P2.4MCU请求PC传输数据的提示,从请求开始P2.4输出高电平,之后收到第一包数据(64字节)输出低电平,用示波器观察。

4、下载程序
下载程序和CDC通信均使用板上TYPE-C接口实现。打开STC-ISP V6.92G或更高版本。
打开程序文件,即打开"Objects"里的"audio-play.hex"文件。

USB TYPE-C延长线将“屠龙刀三”核心板与PC连接,持续按下P3.2按键,短按OFF键释放,1秒后释放P3.2按键,STC ISP就能自动识别到设备:
截图202311192340344733.jpg
点击下载按钮,将程序下载到MCU中。

5、播放设置
此时STC ISP已能自动识别播放程序的CDC通信口,下图的“扫描”里显示的就是CDC串口。
截图202311192341084919.jpg
点击“STC调试接口”,选择“播放Wave(P)”,见下图:
截图202311192341391771.jpg
点击“打开Wave”,选择要播放的Wave文件。
Wave文件信息里会显示文件的重要信息:
    文件格式,目前只支持:1-PCM6-A law17-IMA ADPCM3种类型。
    通道数:1表示单声道,2表示立体声。
    采样率:不用解释。
    采样位数:就是一个采样点的位数,用户不用关心。
    数据大小:即声音的字节数。
设置数据发送模式里的“每个数据包的大小(字节)”为1024
勾选“第一包数据发送WAVE文件信息”
选择“应答式发送”。
点击“发送Wave数据”。

之后,按一下板上的P3.2键开始播放,MCU请求的第一个数据包为14字节的上述文件信息,大端模式。
   Byte0Byte1WAV类型,0x0001-->PCM0x0006-->A Law0x0011-->IMA ADPCM
   Byte2:声道数,1(单声道)或2(立体声)。
   Byte3:采样位数,用户不用理会。
   Byte4~Byte7:采样率,Hz
   Byte8~Byte11:数据长度(字节数)。
   Byte12~Byte13BLOCK长度(ADPCM使用)
后面请求发送的都是音频数据包,程序根据文件格式进行处理后送去PWM播放出声音。
输出的声音要接功放和音箱才能听到传真度不错的音乐,使用32KHz44.1KHz的采样格式,普通音响将难以分辨其与320Kbps码率的MP3的音质有啥差别。

6、通信查询速度适配
文件格式不同,采样率不同,就有不同的数据率,数据率越高,对通信的速度要求就越高。但是通信速度高,PCCPU占用率就高,这必须要平衡一下。

点击串口助手“更多设设置”,在“响应接收时间(查询周期)”的输入框中,根据数据率输入合适的值,时间短通信速度快,但电脑PC占用率会加大。
截图202311192342095401.jpg
下面为参考的时间设置:
PCM  采样率    响应接收时间     数据率
    44.1KHz       0ms        176.4KB/S
     32KHz     1ms2ms     128KB/S
     16KHz     4ms5ms      64KB/S

ADPCM 采样率    响应接收时间     数据率
    44.1KHz       5ms           44.1KB/S
      32KHz      10ms            32KB/S
     16KHz       10ms            16KB/S

A law 采样率    响应接收时间     数据率
    44.1KHz    2ms3ms        88.2KB/S
     32KHz     4ms5ms         64KB/S
     16KHz       10ms            32KB/S

最后,将HIFI功放打开,8寸迷宫式二单元书架箱安排上,将重低音开最大,听着圆润的歌声和直拍心口的重低音鼓,等待隔壁邻居来敲门!
截图202311192343034441.jpg
截图202311200757241679.jpg

51 开源 180MHz-PWMA-播放立体声音乐@STC32G12K128, USB-CDC实时传输音频

7
、演示视频

8、展示图片
截图202311201753008922.jpg
截图202311201753231011.jpg
30A-HSPWMA-播放立体声音乐-CDC实时传输音频流-180MHz.rar (663.52 KB, 下载次数: 149)
孟庭苇_冬季到台北来看雨-ADPCM-32K-立体声.wav (9.39 MB, 下载次数: 99)
孟庭苇_没有情人的情人节-Alaw-32K-立体声.wav (15.44 MB, 下载次数: 69)
孟庭苇_没有情人的情人节-PCM-32K-立体声.wav (30.89 MB, 下载次数: 92)

回复 送花

使用道具 举报

该用户从未签到

550

主题

9328

回帖

1万

积分

管理员

积分
13928
发表于 2023-11-23 07:49:16 | 显示全部楼层
STC32位8051,180MHz-16位PWM-DIY-音频
USB喀秋莎高速火力传输重音炮来袭
截图202311230749133010.jpg

截图202311230751287911.jpg
截图202311230750174098.jpg



C8952_数模转换芯片DAC_CS4344-CZZR_规格书_CIRRUS LOGIC(凌云)数模转换芯片DAC规格书.PDF

903.2 KB, 下载次数: 47

C1509050_数模转换芯片DAC_MS4344_规格书_杭州瑞盟数模转换芯片DAC规格书.PDF

493.35 KB, 下载次数: 49

C16197182_数模转换芯片DAC_GC4344_规格书_WJ455792.PDF

617.69 KB, 下载次数: 41

回复 支持 1 反对 0 送花

使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:35
  • 签到天数: 143 天

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2120

    积分

    荣誉版主

    积分
    2120
    发表于 2023-11-20 08:06:12 | 显示全部楼层
    牛,我自己写的CDC音频流版本,听着声音速度特别慢,一直找不到卡顿原因。
    学习一下梁工的代码。






    点评

    代码很精简,你可以试试,44.1KHz都可以流畅播放,整首歌下来不会有任何卡顿(除非电脑卡了)。  详情 回复 发表于 2023-11-20 10:00
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 11:48
  • 签到天数: 160 天

    [LV.7]常住居民III

    17

    主题

    370

    回帖

    1313

    积分

    荣誉版主

    积分
    1313
    发表于 2023-11-20 09:01:36 | 显示全部楼层
    能用STC32G8K64吗?

    点评

    STC32G8K64没有USB接口,只能用串口,所以最好播放ADPCM,码率是PCM的1/4,44.1KHz采样的立体声ADPCM需要44.1KB/S,可以的。立体声PCM只能16K采样,码率为64KB/S。  详情 回复 发表于 2023-11-20 09:49
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9328

    回帖

    1万

    积分

    管理员

    积分
    13928
    发表于 2023-11-20 09:41:14 | 显示全部楼层
    可以,USB-CDC 改成 通过 STC的USB转双串口跟电脑通信
    截图202311200943556803.jpg
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2935

    回帖

    6621

    积分

    超级版主

    积分
    6621
     楼主| 发表于 2023-11-20 09:49:32 | 显示全部楼层
    本帖最后由 梁工 于 2023-11-20 10:20 编辑

    STC32G8K64没有USB接口,只能用串口,所以最好播放ADPCM,码率是PCM的1/4,32KHz采样的立体声ADPCM需要32KB/S,串口波特率用460800,可以的。
    用STC公司的“一箭双雕”USB转串口来传输,有空了我移植测试。

    点评

    STC的 USB-2UART 可以支持10Mbps/9Mbps/8Mbps/7.5Mbps, 几乎任意波特率 [attachimg]27382[/attachimg] [attachimg]27383[/attachimg]  详情 回复 发表于 2023-11-20 10:54
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2935

    回帖

    6621

    积分

    超级版主

    积分
    6621
     楼主| 发表于 2023-11-20 10:00:41 | 显示全部楼层
    gentleman 发表于 2023-11-20 08:06
    牛,我自己写的CDC音频流版本,听着声音速度特别慢,一直找不到卡顿原因。
    学习一下梁工的代码。

    代码很精简,你可以试试,44.1KHz都可以流畅播放,整首歌下来不会有任何卡顿(除非电脑卡了)。

    点评

    好的,谢谢梁工。  详情 回复 发表于 2023-11-20 10:34
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:35
  • 签到天数: 143 天

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2120

    积分

    荣誉版主

    积分
    2120
    发表于 2023-11-20 10:34:45 | 显示全部楼层
    梁工 发表于 2023-11-20 10:00
    代码很精简,你可以试试,44.1KHz都可以流畅播放,整首歌下来不会有任何卡顿(除非电脑卡了)。 ...

    好的,谢谢梁工
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9328

    回帖

    1万

    积分

    管理员

    积分
    13928
    发表于 2023-11-20 10:54:45 | 显示全部楼层
    梁工 发表于 2023-11-20 09:49
    STC32G8K64没有USB接口,只能用串口,所以最好播放ADPCM,码率是PCM的1/4,32KHz采样的立体声ADPCM需要32K ...

    STC的 USB-2UART 可以支持10Mbps/9Mbps/8Mbps/7.5Mbps, 几乎任意波特率

    截图202311201053428898.jpg

    截图202311201054424424.jpg

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:35
  • 签到天数: 143 天

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2120

    积分

    荣誉版主

    积分
    2120
    发表于 2023-11-20 11:26:09 | 显示全部楼层
    发现对应的 V6.92G STC-ISP 好像还没发布
    V6.92F 是不是不能正常使用


    截图202311201118335117.jpg



    顺便反馈一下 V6.92F STC-ISP 打开16bit 44.1khz wave文件失败

    截图202311201123555318.jpg

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9328

    回帖

    1万

    积分

    管理员

    积分
    13928
    发表于 2023-11-20 11:31:15 | 显示全部楼层

    点评

    6.92G 同样遇到 接受几个数据包 就卡死的现象了 使用屠龙刀测试 卡死时 P2.1 P2.0 LED 亮 按下P3.2 按键 P3.2LED灯亮 pc端无反应 看来我要怀疑我电脑的问题了 [attachimg]27394[/attachimg]  详情 回复 发表于 2023-11-20 12:31
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-6 01:49 , Processed in 0.079366 second(s), 75 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表