智能车制作

标题: AD 采集 [打印本页]

作者: jianpeng    时间: 2013-3-27 21:02
标题: AD 采集
AD采集时间超长!!!    5ms中断,开始处 AD采集五次平均还好,换成十次程序就会出错     而除了采集,其余在1ms内就能控制完成
大家帮忙看下哪儿出错了。    这样子主程序连OLED显示程序都运行不了   
void AD_Init(void)  //AD初始化
{
  //ATD0CTL0=0x08;  //后四位WRAP[3:0]回绕通道选择位,选择转换那一通道后绕回AN0  默认0000为保留
  ATD0CTL1|=0x40;   //ETRIGSEL SRES1 SRES0 SMP_DIS ETRIGCH3 ETRIGCH2 ETRIGCH1 ETRIGCH0
                    //  0        1     0        0      0         0        0        0  
                    //SRES1=0、SRES0=0选择 8位 01 选择10位 10选择12位  11保留
  ATD0CTL2=0x40;    // 0 AFFC AWAl ETRIGLE ETRIGP ETRIGE ASCIE ASCIF
                     // 0  1    0    0       0       0     0       0
                    //AFFC=0 标志位手动清0 =1 自动清0
                    //AWAI=1 等待模式下可转换 =0 等待模式下禁止转换
                    //ETRIGLE、ETRIGP 触发方式选择
                    //ASCIE 顺序完成中断使能   ASCIF  比较中断使能
  ATD0CTL3=0xb0;    // DJM S8C S4C S2C S1C FIFO FRZ1 FRZ0
                    //  1  0    1   1  0    0    0    0
                    //DJM=0 左对齐存放在结果寄存器中 先存入ATD0DR0H(高位)
                    //DJM=1 右对齐                   先存入ATD0DR0L(低位)
                    // S8C~~S1C 转换序列长度 即要转换的通道数 这里是6
                    //FIFO=0, 结果寄存器映射到转换序列   即依次把数据存入ATD0DR0~ATD0DRn
                    //FIFO =1  则没有 即ANn通道数据存入ATD0DRn
                                   //同时依次把数据存入ATD0DR0~ATD0DRn
  ATD0CTL4=0x03;    //  SMP2 SMP1 SMP0   PRS4~~PRS0  
                    //  0     0     0      00011
                    //采样周期选择 T=(1/Fad)*4     
                    // AD时钟频率Fad=Fbus/2/(PRS+1)=64M/2/16=2M
                    // 最大A/D时钟=2.0MHz(最小A/D CLOCK=0.5MHz)
  ATD0CTL5=0x30;    //  0 SC  SCAN MUIT CD CC CB CA
                    //  0  0   1    1    0 0  0  0   
                    //SC=0 CD~CA用于选择0~15号通道 即起始转换通道选择
                    //SC=1选择特殊通道
                    //SCAN=1 单次转换 =0 多次连续转换
                    //MUIT=1 多通道转换 =0 单通道转换
  ATD0DIEN=0xf000;  //数字输入使能 这里禁止输入
// ATD0STAT0       SCF 0 ETORF FIFOR CC3 CC2 CC1 CC0
                 //SCF 转换序列完成标志 完成转换则置1
                 //CC[3:0] 转换计数器 4-位计数器指向下一个将要转换的通道
// ATD0STAT2       CCF15~~CCF0  独立通道转换完成标志位  
                 // 每个相应的通道转换结束后置位
                 //当相应的A/D结果寄存器被读出时,清零
}

/************************************************************************************
  --------------------------------- 中断子函数 ------------------------------------
*************************************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区
void interrupt 67 PIT1(void)
{
   GetSpeed();
   j=ATD0DR5;
   while(i)
   {
      while((!(ATD0STAT2&0x0001))||(!(ATD0STAT2&0x0002))); //等待转换完成
      i--;
      c=ATD0DR0;
      d=ATD0DR1;
      a+=c/5;
      b+=d/5;
    }
    i=5;
    VOLTAGE_GRAVITY=b;
    VOLTAGE_GYRO=a;
   
    AngleCalculateControl();
    PwmControl();
    a=0;
    b=0;
    PITTF|=0x02; //清中断标志位
}
#pragma CODE_SEG DEFUALT


作者: 云雾高速公路    时间: 2013-3-27 21:40
ATD0CTL4=0x03;    //  SMP2 SMP1 SMP0   PRS4~~PRS0  
                    //  0     0     0      00011
                    //采样周期选择 T=(1/Fad)*4     
                    // AD时钟频率Fad=Fbus/2/(PRS+1)=64M/2/16=2M
                    // 最大A/D时钟=2.0MHz(最小A/D CLOCK=0.5MHz)
这个频率有点大,改小点,我上次也是用2M,出来结果一点不正确
作者: jianpeng    时间: 2013-3-28 07:41
云雾高速公路 发表于 2013-3-27 21:40
ATD0CTL4=0x03;    //  SMP2 SMP1 SMP0   PRS4~~PRS0  
                    //  0     0     0      0001 ...

      嗯,注释是2M   实际应该是8M。不过这样子采集的数据没问题 。问题是即使这样子,AD采集数据那块还是占了好长时间!按资料上说转换都是微秒级的   但我这程序里采集几组数据就能占到级ms     崩溃啊!死活找不出原因
作者: yg_1031    时间: 2013-4-12 19:31
jianpeng 发表于 2013-3-28 07:41
嗯,注释是2M   实际应该是8M。不过这样子采集的数据没问题 。问题是即使这样子,AD采 ...

我的也是,不知道什么原因。

作者: @飞    时间: 2013-7-15 16:33
学习了,




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2