找回密码
 立即注册
查看: 2223|回复: 10

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

[复制链接]

该用户从未签到

2

主题

3

回帖

64

积分

注册会员

积分
64
发表于 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,导致声音怪怪的。
回复 送花

使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 129 天

    [LV.7]常住居民III

    26

    主题

    1294

    回帖

    4019

    积分

    论坛元老

    积分
    4019
    发表于 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, 下载次数: 109

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    2

    主题

    3

    回帖

    64

    积分

    注册会员

    积分
    64
     楼主| 发表于 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里。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9255

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

    该用户从未签到

    2

    主题

    3

    回帖

    64

    积分

    注册会员

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

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

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

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

    使用道具 举报

    该用户从未签到

    551

    主题

    9255

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

    该用户从未签到

    46

    主题

    2929

    回帖

    6591

    积分

    超级版主

    积分
    6591
    发表于 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 送花

    使用道具 举报

    该用户从未签到

    2

    主题

    3

    回帖

    64

    积分

    注册会员

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

    使用道具 举报

    该用户从未签到

    1

    主题

    1

    回帖

    37

    积分

    新手上路

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

    使用道具 举报

  • TA的每日心情
    奋斗
    18 小时前
  • 签到天数: 84 天

    [LV.6]常住居民II

    13

    主题

    325

    回帖

    736

    积分

    荣誉版主

    热心市民

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-1 19:03 , Processed in 0.070335 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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