智能车制作

标题: AD模块让我弃疗了 [打印本页]

作者: 850477905    时间: 2014-6-3 12:03
标题: AD模块让我弃疗了
AD模块让我弃疗了。我是电磁组的,我的电感直接接到最小系统版(128)的AN0~AN6.这是AD 采集及初始化源程序:
void ADC_INIT(void){
  ATD0CTL1=0x00;
  ATD0CTL2=0x40;    //0100,0000,自动清除使能控制位,忽略外部触发
                    //转换结束允许中断,中断禁止
  ATD0CTL3=0xA4;    //0100,0100,转换序列长度为4; FIFO模式,冻结模式下继续转换
  ATD0CTL4=0x05;  //00001000,8位精度,PRS=5,ATDCLOCK=BusClock(24mb)/(5+1)*2,约为2MHz,采样周期位4倍AD周期
  ATD0DIEN=0x00;    //输入使能禁止

  ATD0DIEN=0x00;    //输入使能禁止
}

void AD_CaiJi(void){

int sum;
int *q;
int a[6][8];
int i,j;
   ATD0CTL5=0X20;    //,连续AD转换,右对齐,单通道,无符号,起始通道为AN0
  while(!ATD0STAT0_SCF);//等待左前第一个电感电压转换完成
  q=a[0];
  *(q)  =ATD0DR0L;
  *(q+1)=ATD0DR1L;
  *(q+2)=ATD0DR2L;
  *(q+3)=ATD0DR3L;
  ATD0CTL5=0X21;    //重置ATD0CTL5,将启动一次新的AD转换
  while(!ATD0STAT0_SCF); //右前侧第一个电感电压转换完成  
  q=a[1];  
  *(q)  =ATD0DR0L;
  *(q+1)=ATD0DR1L;
  *(q+2)=ATD0DR2L;
  *(q+3)=ATD0DR3L;

  ATD0CTL5=0X22;
  while(!ATD0STAT0_SCF);  //左前侧第二个电感电压转换完成
  q=a[2];
  *(q)  =ATD0DR0L;
  *(q+1)=ATD0DR1L;
  *(q+2)=ATD0DR2L;
  *(q+3)=ATD0DR3L;
  ATD0CTL5=0X23;
  while(!ATD0STAT0_SCF);//  右前侧第1个电感电压转换完成
  q=a[3];
  *(q)  =ATD0DR0L;
  *(q+1)=ATD0DR1L;
  *(q+2)=ATD0DR2L;
  *(q+3)=ATD0DR3L;
  ATD0CTL5=0X24;
  while(!ATD0STAT0_SCF);//等待左前第一个电感电压转换完成
  q=a[4];
  *(q)  =ATD0DR0L;
  *(q+1)=ATD0DR1L;
  *(q+2)=ATD0DR2L;
  *(q+3)=ATD0DR3L;

  ATD0CTL5=0X25;
  while(!ATD0STAT0_SCF);//  右前侧第1个电感电压转换完成
  q=a[5];
  *(q)  =ATD0DR0L;
  *(q+1)=ATD0DR1L;
  *(q+2)=ATD0DR2L;
  *(q+3)=ATD0DR3L;
  /*********************************************************
          再次启动一轮AD转换来减小误差  

  ***********************************************************/
  ATD0CTL5=0X25;
  while(!ATD0STAT0_SCF);//  右前侧第1个电感电压转换完成
  q=a[5];
  *(q+4)=ATD0DR0L;
  *(q+5)=ATD0DR1L;
  *(q+6)=ATD0DR2L;
  *(q+7)=ATD0DR3L;
  ATD0CTL5=0X24;
  while(!ATD0STAT0_SCF);//等待左前第一个电感电压转换完成
  q=a[4];
  *(q+4)=ATD0DR0L;
  *(q+5)=ATD0DR1L;
  *(q+6)=ATD0DR2L;
  *(q+7)=ATD0DR3L;
  ATD0CTL5=0X23;
  while(!ATD0STAT0_SCF);//  右前侧第1个电感电压转换完成
  q=a[3];
  *(q+4)=ATD0DR0L;
  *(q+5)=ATD0DR1L;
  *(q+6)=ATD0DR2L;
  *(q+7)=ATD0DR3L;
ATD0CTL5=0X22;
  while(!ATD0STAT0_SCF);  //左前侧第二个电感电压转换完成
  q=a[2];
  *(q+4)=ATD0DR0L;
  *(q+5)=ATD0DR1L;
  *(q+6)=ATD0DR2L;
  *(q+7)=ATD0DR3L;

  ATD0CTL5=0X21;    //重置ATD0CTL5,将启动一次新的AD转换
  while(!ATD0STAT0_SCF); //右前侧第一个电感电压转换完成  
  q=a[1];  
  *(q+4)=ATD0DR0L;
  *(q+5)=ATD0DR1L;
  *(q+6)=ATD0DR2L;
  *(q+7)=ATD0DR3L;

  ATD0CTL5=0X20;    //,连续AD转换,右对齐,单通道,无符号,起始通道为AN0
  while(!ATD0STAT0_SCF);//等待左前第一个电感电压转换完成
  q=a[0];
  *(q+4)=ATD0DR0L;
  *(q+5)=ATD0DR1L;
  *(q+6)=ATD0DR2L;
  *(q+7)=ATD0DR3L;

  for(i=0;i<6;i=i+1)                       //累加后求均值,AD转换滤波
  {
  sum=0;
  q=a;     //赋予指针新地址
  for(j=0;j<8;j++)
    sum+=*(q+j);

  ad_val=sum/8;
  }   
}


      OutData[0] = ad_val[0];
      OutData[1] = ad_val[1];
      OutData[2] = ad_val[4];
      OutData[3] = ad_val[5];

      OutPut_Data();
  用蓝牙将数据传回来,发现数据全为0;用万用表测AD0~AN6都有示数。搞了好多天,我认为是结果寄存器里面没有存转换的值。搞不好了,问了好多学长,也说不出个所有然,唉

反正弃疗了。
再见了。


作者: Jyoun    时间: 2014-6-3 12:18
鄙视一下楼主。
作者: 850477905    时间: 2014-6-3 12:21
Jyoun 发表于 2014-6-3 12:18
鄙视一下楼主。

额。

作者: 碛北的孤狼    时间: 2014-6-3 12:35
这个。。。。。也太。。。。。。。
作者: 竹音清影    时间: 2014-6-3 12:42
字体太大了。
作者: 板正的    时间: 2014-6-3 13:12

作者: emper    时间: 2014-6-3 13:18
这是第六届某大学贴出来的程序
作者: lh_include    时间: 2014-6-3 18:49
为什么不试一下多通道连续转换?




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