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

[复制链接]
 楼主| kangzj 发表于 2020-8-25 23:30 | 显示全部楼层 |阅读模式
利用pic18F2550 usb单片机 实现了一个数据采集固件。
我希望用pic18F2550 单片机 实现一个采集速度比较高的数据采集固件。按手册设定了最快的数据采集状态,大约15us 可得到一个采集数据。
外部晶振 20MHz,寄存器按手册设定了最快的数据采集状态,但实际结果 要 0.5ms 才能得到一个采集数据。
想得到更快的速度,请教大侠,该如何修改代码
gongche 发表于 2020-8-25 23:34 | 显示全部楼层

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因
 楼主| kangzj 发表于 2020-8-25 23:38 | 显示全部楼层

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;        
        }
}
tian111 发表于 2020-8-25 23:42 | 显示全部楼层

采用汇编实现,精简代码
chenho 发表于 2020-8-25 23:45 | 显示全部楼层
ADCON2 = 0b10100101;        // 对齐方式:右对齐, 采集时间:8个Tad,转换时钟:Fosc/16
你可以尝试调整这个时钟及TAD的时间....
juventus9554 发表于 2020-8-25 23:50 | 显示全部楼层
我很想知道这两个时间是怎么得来的
 楼主| kangzj 发表于 2020-8-25 23:53 | 显示全部楼层
采集时间,转换时间  两个时间 是 芯片手册 上给的。
xxrs 发表于 2020-8-25 23:57 | 显示全部楼层
为什么要要用for循环?
奔波儿熊 发表于 2020-8-26 10:20 | 显示全部楼层
0.5 ms怎么测的? 还有没看到你把数据发出去啊?
llia 发表于 2020-8-26 21:03 | 显示全部楼层
通常单通道采集转换时间大概20~30us
 楼主| kangzj 发表于 2020-8-26 21:07 | 显示全部楼层
用for 循环是为了 得到时间间隔最小的连续的 512个采集的数据,并赋值给数组
 楼主| kangzj 发表于 2020-8-26 21:11 | 显示全部楼层
有好友说:通常单通道采集转换时间大概20~30us。如果是这个时间也可接受啦,但目前是 500us
guoyt 发表于 2020-8-26 21:14 | 显示全部楼层
差了10倍不止
 楼主| kangzj 发表于 2020-8-26 21:18 | 显示全部楼层
对啊,做了尝试,没有进展
xxrs 发表于 2020-8-26 21:25 | 显示全部楼层
不可能,你选了INTOSC做SYSTEM CLOCK了吧
songqian17 发表于 2020-8-26 21:29 | 显示全部楼层

对于你的需求,你选的单片机估计满足不了。你看一下你选的单片机AD的采样时间和转换时间。这两个时间相加,就是最小时间和最高频率。
llljh 发表于 2020-8-26 21:33 | 显示全部楼层
再有,AD转化需要这样高的频率,MCU估计干不了别的了。
hanwe 发表于 2020-8-26 21:36 | 显示全部楼层
不要在主循环轮训,用中断。
chenjunt 发表于 2020-8-26 21:39 | 显示全部楼层
目测楼主的20MHz没有振起来,然后回落到内部振荡器,默认1MHz。
zyf部长 发表于 2020-8-26 21:52 | 显示全部楼层
然后一个while应该差不多就500us了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

672

主题

7007

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部