打印

如何实现单片机的ADC模块的数据快速采集?

[复制链接]
1516|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
21learner|  楼主 | 2019-4-17 12:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教 各路高手,我是新手,利用pic18F2550 usb单片机 实现了一个数据采集固件。
我希望用pic18F2550 单片机 实现一个采集速度比较高的数据采集固件。按手册设定了最快的数据采集状态,大约15us 可得到一个采集数据。
外部晶振 20MHz,寄存器按手册设定了最快的数据采集状态,但实际结果 要 0.5ms 才能得到一个采集数据。
想得到更快的速度,请教大侠,该如何修改代码。谢谢啦。

我的代码如下:请大侠指正。



char DataBuf[1024];
main()
    /*  首先是ADC 三个功能寄存器的设定。        */
        ADCON0 = Ob00000001;    // 选择AN0 通道,使能DAC模块
        ADCON1 = 0b00001101;    // 设定ADC 通道,只有 AN0,AN1 为模拟输入通道
        ADCON2 = 0b10100101;        // 对齐方式:右对齐, 采集时间:8个Tad,转换时钟:Fosc/16
       
        for(i=0;i<512;i++)   
             {
                ADCON0bits.GO=1;                            //启动A/D转换
                while(ADCON0bits.GO == 1) //等待转换结束,GO为0则AD转换结束,查询GO/DONE 位是否被清零,
                {
                    ;
                }
                    DataBuf[2*i]  =ADRESH;
                DataBuf[2*i+1]=ADRESL;       
        }
}

使用特权

评论回复
沙发
mzb2012| | 2019-4-17 13:21 | 只看该作者
采用汇编实现,精简代码

使用特权

评论回复
板凳
CoolSilicon| | 2019-4-17 13:33 | 只看该作者
   ADCON2 = 0b10100101;        // 对齐方式:右对齐, 采集时间:8个Tad,转换时钟:Fosc/16
你可以尝试调整这个时钟及TAD的时间....

使用特权

评论回复
地板
21learner|  楼主 | 2019-4-17 15:53 | 只看该作者
采集时间,转换时间  两个时间 是 芯片手册 上给的。

使用特权

评论回复
5
郑朝清| | 2019-4-17 22:38 | 只看该作者
为什么要要用for循环?

使用特权

评论回复
6
systemchip| | 2019-4-18 09:11 | 只看该作者
通常单通道采集转换时间大概20~30us

使用特权

评论回复
7
21learner|  楼主 | 2019-4-18 10:23 | 只看该作者
谢谢  各位关注。  1、用for 循环是为了 得到时间间隔最小的连续的 512个采集的数据,并赋值给数组。2、7楼的好友说:通常单通道采集转换时间大概20~30us。如果是这个时间也可接受啦,但目前是 500us,差了10倍不止。 做了尝试,没有进展。

使用特权

评论回复
8
systemchip| | 2019-4-18 11:08 | 只看该作者
不可能,你选了INTOSC做SYSTEM CLOCK了吧

使用特权

评论回复
9
Rock007| | 2019-4-18 17:26 | 只看该作者
对于你的需求,你选的单片机估计满足不了。你看一下你选的单片机AD的采样时间和转换时间。这两个时间相加,就是最小时间和最高频率。
再有,AD转化需要这样高的频率,MCU估计干不了别的了。
不要在主循环轮训,用中断。

使用特权

评论回复
10
21learner|  楼主 | 2019-4-19 11:07 | 只看该作者
谢谢,楼上各位老师的帮助,对各老师的帮助,我解释一下。
1、对于 9, 11 楼老师提及 关于20MHz 晶振是否起作用的问题,本diy 是带 usb 数据传输的。晶振一定是起作用了。  不过,我可以将晶振拔了,试试。

2、对于10楼老师的问题,我这个diy就是专用这个mcu 进行数据采集,其他事情由usb连的host去做。故mcu的 负担不会太重的。

3、对于12楼老师,说

                DataBuf[2*i]  =ADRESH;
                DataBuf[2*i+1]=ADRESL;        

这两个寻址操作在8位机上就是个不在乎时间的做法


意思说这两行代码很费时,也许可修改试一下。看看这两行代码到底能耗多少时钟周期。我是初学者,如何用汇编指令得到的数据变为数组,还要学习。请老师们 赐教一些相关的代码?   再一次谢谢老师们。

使用特权

评论回复
11
Rock007| | 2019-4-19 14:52 | 只看该作者
本帖最后由 Rock007 于 2019-4-19 14:56 编辑

采样时间的作用是让放大器稳定,电容充电,还考虑到温度的影响。
转化时间是指在输入稳定,电容充电完成后,开始转化到转化完成的时间。

假设你的外部晶振20M,没有倍频,那么Fosc = 20M, TAD = 1/(20M/16) = 0.8us .
采样保持时间如你配置的 8TAD = 6.4us;
转换时间 最小是11TAD = 8.8us;
6.4us+8.8us = 15.2us.

不应该差那么多的,检查一下你的时钟。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

57

帖子

1

粉丝