打印

如何 让a/d采集的最快?

[复制链接]
3681|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大杂烩|  楼主 | 2010-9-15 12:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在 感觉采集的不是很快  
ADCON1 = 0b00001110;
ADCON0 = 0x00;
ADCON2 = 0b10001000
ADCON0bits.ADON = 0x01
这是我寄存器的设置
请问 我只采一路最快能达到多少频率?
20M的晶振
p18f4550
沙发
alamo2009| | 2010-9-15 13:19 | 只看该作者
看看datasheet上AD的转换时间

使用特权

评论回复
板凳
XIEYUANBIN| | 2010-9-17 13:18 | 只看该作者
AD转换时间是定死的,最快也就这么快,但你在采样的时候可以做别的事,转换的时候也可以做别的事。我不知道你需要多快的AD转换时间

使用特权

评论回复
地板
大杂烩|  楼主 | 2010-9-17 14:56 | 只看该作者
我 通过a/d采集函数发生器的正弦波  串口传送到计算机 最大能到10hz 频率再高了传到电脑显示 采集 的就不像正弦了 我想采几十k的频率应该可以把

使用特权

评论回复
5
XIEYUANBIN| | 2010-9-19 10:32 | 只看该作者
10HZ太慢了。16系列的能够做到32微秒一次AD,也就是说31K多,18系列的应该不比这个差。AD如果做出来不精准,一般都是采样时间这部分造成,再一个是AD的转换时钟太快或太慢。看18系列的数据手册,最快的AD转换一次大概12-13微秒,包括采样转换的时间在内。这样算起来转换速度超过76K。
你需要注意的是:输入电阻,最好小于2K;采样时间,大于2微秒;转换时钟,大于1.6微秒。

使用特权

评论回复
6
大杂烩|  楼主 | 2010-9-19 14:58 | 只看该作者
#include <p18cxxx.h>
void InitUsart1(void)//串口初始化
{
    TRISCbits.TRISC7 = 1;                                                               
    TRISCbits.TRISC6 = 1;
    SPBRG = 10;
    BAUDCON = 0b00000000;
    TXSTA = 0b00100110;
    RCSTA = 0b10010000;
}

void AD(void)
{
    int i;
    ADCON1 = 0b00001110;//AN0为模拟输入
        ADCON0 = 0x00;// AN0选择
        ADCON2 = 0b10010101;//右对齐 4Tad   Fosc/16
        ADCON0bits.ADON = 0x01;//使能a/d
}

void main()//主程序
{
    int i;
    InitUsart1();//初始化串口
    AD();//初始化a/d
while(1) //循环
    {
    ADCON0bits.GO_DONE = 1;
    while(ADCON0bits.GO_DONE != 0);//转换完成

    for(i=0;i<3000;i++)
      ;
    while(!PIR1bits.TXIF);
    TXREG = ADRESL;
   
     }
}



这是源程序 请问 能看看那里配置错了 或有的寄存器没配置么

使用特权

评论回复
7
大杂烩|  楼主 | 2010-9-19 15:00 | 只看该作者
现在20hz就看着波形不大好了

使用特权

评论回复
8
qin0909| | 2010-9-19 15:08 | 只看该作者
采样时间越短有可能采样到的数据越容易有偏差;
赛格电子网--网聚好生意http://www.segdzw.com

使用特权

评论回复
9
XIEYUANBIN| | 2010-9-19 16:44 | 只看该作者
现在20hz就看着波形不大好了
大杂烩 发表于 2010-9-19 15:00

你那20HZ,是什么波形?函数发生器的波形?函数发生器过来,你的采样电路是怎样的?
你试试 采样时间 = 20 TAD

使用特权

评论回复
10
大杂烩|  楼主 | 2010-9-19 22:03 | 只看该作者
正弦波   函数发生器后面直接跟模拟输入引脚 没做别的信号调理处理

使用特权

评论回复
11
yewuyi| | 2010-9-20 08:49 | 只看该作者
定时1MS采集进行一次AD转换,可以得到1KHZ的数据采集速度,如果一个正弦波采集32次,则可以采集到31.25HZ以下的正弦波。

如果想采集到更快频率的正弦波,要么是降低定时时间,要么是减少一个正弦波内的采集次数。一般32是不能再少了,否则对恢复波形就可能失真太严重了,那只能是降低定时时间,具体能降低到多少,和你的信号质量、信号频率上限、AD本身的速度限制、数据处理的速度等等密切相关。

造成信号失真的原因有很多,建议你先改造一下电路,如果对信号质量把握不太准的话,应该加一级缓冲进行阻抗匹配,否则信号输入阻抗过大,例如超过PIC18一般推荐的2K输入阻抗,此时很可能会造成信号采集失真。

尽量不要采用这样的程序写法
while(1) //循环
    {
    ADCON0bits.GO_DONE = 1;
    while(ADCON0bits.GO_DONE != 0);//转换完成

    for(i=0;i<3000;i++)
      ;
    while(!PIR1bits.TXIF);
    TXREG = ADRESL;
   
     }
,使用定时中断采集更容易进行信号恢复。

使用特权

评论回复
12
wh6ic| | 2010-9-20 16:25 | 只看该作者
他的主程序在干什么?
  启动ADC、等待ADC转换完成,软件延时3000Tick,等待上一个ADC结果由串口发送完成,新的ADC结果送串口。也就是说时间要么耗在3000Tick延时上了,要么在等待串口发完上一个字节中虚度。
  LZ应该尝试将串口波特率提高到可能的最高,去掉3000Tick可能也有些用。另外可以尝试中断的方法来处理,比如连续ADC采样1K数据再慢慢发送;还有4550支持 FS USB,可以考虑直接用USB发送数据。

使用特权

评论回复
13
大杂烩|  楼主 | 2010-9-20 18:57 | 只看该作者
信号质量  我的函数发生器 出来50hz不跟随 直接近ad输入 应该没问题吧  不行 就加个电阻分压保证输入电阻2k试试


3000不加 发送就错误 上位机得不到正确波形 改小也不行(可能那里没配置好) 波特率设置115200  本来用
usb因为传的数据慢 所以怀疑a/d问题 用串口验证  结果串口也上不去

使用特权

评论回复
14
XIEYUANBIN| | 2010-9-21 11:01 | 只看该作者
输入电阻越小越好,不一定要2K,而是要小于2K。
3000不加怎么发送会错误?你必须在AD完成之后立即发送,或者立即保存ADRES 的值。另外,你的电压是否超过ADRESL的8BIT值?也就是输入电压会不会超过1/4 的电源电压?超过了,就不是8BIT的值了。

使用特权

评论回复
15
headwolf_83| | 2010-9-21 11:54 | 只看该作者
1、在数据手册中搜索TAD,查得TAD的最小时间。
2、根据TAD,选择合适的振荡和分频,兼顾系统的其它要求,使得实际的TAD尽量接近下限。
3、在数据手册中查TACQ的最小时间,设置AD寄存器中的相关位,尽量达到下限,不要低于下限。
4、开动AD中断。

使用特权

评论回复
16
大杂烩|  楼主 | 2010-9-21 18:40 | 只看该作者
谢谢大家  初步估计 上位机接受软件的问题  发的太快上位机接的慢

使用特权

评论回复
17
XIEYUANBIN| | 2010-9-22 10:04 | 只看该作者
你如果用 PC机作为上位机,应该没有这个问题。我经常用 PC 机接收数据调试的。除非你PC机的软件写得不行

使用特权

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

本版积分规则

个人签名:哈哈哈哈

39

主题

149

帖子

0

粉丝