找回密码
 立即注册
查看: 4152|回复: 11

需要准确的固定间隔时间进行ADC采样转换

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-01-31 01:04:04

5

主题

27

回帖

491

积分

中级会员

积分
491
发表于 2023-4-16 11:50:03 | 显示全部楼层 |阅读模式
需要准确的固定间隔时间进行ADC采样转换

adc-dma 技术咨询

单片机:stc8h8k64u-tssop20


问题:采样频率10Khz,adc采样128个数据后结束dma-adc,继续下一次循环,每次采样100us。请问,如何保证这两次循环中间的间隔时间准确间隔100us?因为dma只是把128个数据保存在扩展ram里,我还要通过代码把这128次采样256个数据保存到外部flash里,我的是音频采样。目前情况是,两个循环间隔之间的程序执行时间好像超过了100us,导致声音怪怪的。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-4-17 16:13:50 | 显示全部楼层
如果需要准确的固定间隔时间进行ADC采样转换的话,
建议使用PWM定时器周期性自动触发ADC采样转换,
====通过调整PWM周期就可以在固定的时间间隔进行ADC采样。

需要注意的是ADC采样时间+采样结果处理时间不要超过采样周期。
使用ADC DMA功能虽然能通过设置ADC采样速度,固定时间采样一次,
但是采样结果处理也需要时间,总时间就不好控制。

附件是使用PWM周期性定时触发ADC采样转换程序,请参考。
1.png
2.png


高级PWM触发ADC-连续触发.zip

8.03 KB, 下载次数: 264

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-01-31 01:04:04

5

主题

27

回帖

491

积分

中级会员

积分
491
发表于 2023-5-5 03:04:12 | 显示全部楼层
我是先用adc-dma采样保存到 单片机扩展 ram,然后代码上spi-dma写入到外部flash里,然后再进行adc-dma。目前100us 根本无法保证采样结果的处理时间。我想到的是晶振频率从11.0592兆增大到24M,提高程序处理速度。但是每次adc-dma循环的这个间隔时间还是无法精准控制。

pwm触发adc采样,采样128次以后把结果存到外部flash里,flash保存数据的时间100us根本不够用。所以,只能通过spi-dma保存到外部flash里。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-5-5 07:35:28 | 显示全部楼层
你描述下你对A/D后的数据是如何处理的,为何时间不够,STC8H8K64U 你可以先跑40MHz
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-01-31 01:04:04

5

主题

27

回帖

491

积分

中级会员

积分
491
发表于 2023-5-5 15:05:47 | 显示全部楼层
本帖最后由 dhvliyike 于 2023-5-5 15:08 编辑

提高晶振频率,即使代码处理时间低于100us,如何保证每一个adc-dma的循环间隔时间刚刚好是 采样频率的时间间隔100us ,这才是难点。难道要加一个定时器?2楼说用pwm,pwm 触发adc采样的结果怎么保存?

stc 单片机进行音频采样一般是怎么实现的,我想知道整个完整的技术细节和原理。

目前我用的方案可以录制比较清晰的声音,只是,实际声音频率跟程序设定的频率貌似不一致,导致录制的声音 和 实际的声音 比较,声音加快或者减慢,跟原始声音速度不一致。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-5-5 15:58:18 | 显示全部楼层
这个录音是梁工的强项,我把你这连接发梁工
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2023-5-5 17:48:13 | 显示全部楼层
本帖最后由 梁工 于 2023-5-5 18:08 编辑

楼主是做数字录音,并保存于外部FLASH,如果不压缩,10KHz采样跑12MHz都足够了。哪怕使用定时器触发ADC,跑24MHz,时间分析如下:
1、2us。定时器中断触发ADC,处理时间大约2us。
2、2us。ADC中断,读出ADC保存于FIFO队列,处理时间大约2us。
则采样时间不超过4us一个点,100us间隔,还有96%的时间。
当数据到了一定长度时,比如1024字节,则从FIFO保存到FLASH,FLASH使用页写,DMA SPI传输基本不耗CPU时间,而1024点采样对应音频是51.2ms(不压缩一点是2字节),总共处理时间占比大约5%。如果声音用ADPCM压缩一下,则1024字节就是2048个采样,对应204.8ms,CPU占比也不会明显增加,估计会是10%。
如果使用PWM触发,则可以减少2us一个点,即减少2%的占比。

建议的方案:
用高级PWM触发ADC,ADC中断读取放FIFO,主程序根据FIFO的长度启动DMA SPI写入FLASH。

音质:
STC8系列、STC32G系列的12bit ADC的噪音小,线性高,做数字录音是非常好的,使用OPA2604(TP2604)做音频放大最好,差点也用LMV358B来放大,MCU使用TL431做基准,如此得到的音质会非常好,动态可达到 20*lg(2048)=66dB,信噪比SR也可以达到60dB。
播放时要求不高甚至可以用PWM直接做D类放大输出,而使用STC32G8K64接I2S的DAC播放则是终极方案。

码率:
不压缩就是2fs字节/秒,10KHz采样就是20KB/S。
可以使用压缩,比较省时间的压缩是mu-LAW、A-LAW、DPCM、ADPCM,CVSD等等。
mu-LAW、A-LAW码率均为fs字节/秒,10KHz采样就是10KB/S,这个压缩对于12bit的ADC非常的合适。
也可以使用ADPCM压缩,码率为fs/2字节/S,10KHz采样就是5KB/S。DPCM不建议,比ADPCM差。
如果使用CVSD调制(米帝鍕用通讯就是),则可以使用16kbps(2KB/S)的码率就可以获得过得去的音质,误码达到10%还能听懂,别的任何编码都不能比的。

回复 支持 4 反对 0

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-01-31 01:04:04

5

主题

27

回帖

491

积分

中级会员

积分
491
发表于 2023-5-7 17:32:18 | 显示全部楼层
感谢。
整套原理和技术实现方案很清晰的说明。
回复 支持 反对

使用道具 举报 送花

1

主题

1

回帖

37

积分

新手上路

积分
37
发表于 2023-7-10 10:31:39 | 显示全部楼层
PWM定时,时间如何计算
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-4-2 15:41:36 | 显示全部楼层
利用16位PWM的触发控制器启动采集,或者用定时器中断周期性启动采集
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 06:52 , Processed in 0.122835 second(s), 105 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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