智能车制作

标题: XS128 AD采样程序 [打印本页]

作者: 风中柳    时间: 2013-2-23 00:01
标题: XS128 AD采样程序
//这个程序是用来采集2个传感器传回的信号进行转化,可是一起用的时候就出现问题。单独用一个AD没问题。恳求大神们拯救。。。。。我把其中一个信号线拔掉,可是显示屏上的数据还是会随着谐振电路位置的改变而改变。。。

#include "main.h"
//uint counttime,showtime;
//uchar pwmflag,modecount,delaycount;
unsigned int AdResult[4];
unsigned count;
unsigned int sampletimes=0;
void main(void) {
  /* put your own code here */
//  unsigned char value;
  SetBusCLK_64M();        // 选择待设定的总线频率
Port_init();            // IO口初始化
PWM_Init();             // PWM 初始化
LCD_Init();             // LCD 初始化
AD_Init() ;             // AD  初始化
PIT_Init();             // 中断初始化
// Capture_Init();         // 捕捉初始化
LCD_clear();            // 清屏幕  
  EnableInterrupts;       // 开总中断
  for(;;) {   
   
  }
  for(;;) {
  } /* loop forever */
  /* please make sure that you never leave main */
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0_ISR(void)
{
    DisableInterrupts;             // 关闭总中断
     
   
      
   
    LCD_Write_Num(0,5,AdResult[2],4);
    LCD_Write_Num(54,5,AdResult[3],4);
     PORTE_PE7=1;
    AdResult[3]=0;
    AdResult[2]=0;
   // AdResult[1]=0;
   // AdResult[0]=0;
    for(;sampletimes<20;sampletimes++) {
       while(!ATD0STAT_SCF);
      {
       // AdResult[0]+=ATD0DR0;
       // AdResult[1]+=ATD0DR1;
      
       AdResult[3]+=ATD0DR3;
      }
       while(!(ATD0STAT0&0x04)) ; {
        AdResult[2]+=ATD0DR2;}
      
    }
    AdResult[3]=AdResult[3]/20;
    AdResult[2]=AdResult[2]/20;
  //  AdResult[1]=AdResult[1]/20;
   // AdResult[0]=AdResult[0]/20;
    sampletimes=0;
    PORTE_PE7=0;                     // finish with 89us
      
      
      
      
      
  PORTB_PB7=~PORTB_PB7;
   
   
    PITTF_PTF0=1;                  // 清中断标志位
    EnableInterrupts;
}






作者: tearedice    时间: 2013-2-23 00:01
很久以前写的程序,两路AD,当时是一边翻书一边写的,但是确实能用,亲自试过用两个红外对管控制舵机的。



#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

void SetBusCLK_80(void)//锁相环初始化
{  
    CLKSEL=0X00;    //禁止锁相环       
    PLLCTL_PLLON=1;          //锁相环电路允许位
    SYNR=0xc0 | 0x09;        //SYNR=1
    REFDV=0x80 | 0x01;      
    POSTDIV=0x00;//VC0_clock=PLL_clock      
    _asm(nop); //短暂延时        
    _asm(nop);
    while(!(CRGFLG_LOCK==1));//时钟频率稳定,锁相环频率锁定
CLKSEL_PLLSEL =1; //使能锁相环时钟

}

/**********************************************************
//PWM初始化,两路PWM输出



***********************************************************/
void PWM_01(void) {   
    PWME=0x00;
    PWMCTL_CON01=1;    //0和1联合成16位PWM
    PWMCTL_CON23=1;   //4和5联合成16位PWM
    PWMCTL_CON45=1;
    PWMCAE=0x00;    //选择输出模式为左对齐输出模式
    PWMCNT01 = 0;     //计数器清零;
    PWMCNT23 = 0;
    PWMCNT23 = 0;
    PWMPOL=0xFF;    //先输出高电平,计数到DTY时,反转电平
    PWMPRCLK = 0x33;    //clockA B 8 分频 10M;
    PWMSCLA = 0x05;    //clock SA =clockA/(5*2)=1M;
    PWMSCLB = 0x05;      
    PWMCLK = 0xFF;     // 选择clockSA   clockSB为时钟
    PWMPER01 = 60;    //电机16.7kHz ;
    PWMPER23 = 20000;//周期20ms; 50Hz;
    PWMPER45 = 60;  
    PWMDTY01 = 0;
    PWMDTY23 = 1475;   //舵机,高电平时间为1.5ms,中间1469,1320最右,1680最左;
    PWMDTY45 = 15;
    PWME = 0xFF;
      
}

void delay(void)
  {
  
  
  unsigned int loop_i,loop_j;
  for (loop_i=0;loop_i<5000;loop_i++)
  
   {
   for(loop_j=0;loop_j<5000;loop_j++)
   {
   ;
   }
   }

   }







void ATD0_Init()
  {
  ATD0DIEN =0X00;
  ATD0CTL1 =0X00;
  ATD0CTL2 =0X40;
  ATD0CTL3 =0XC0;
  ATD0CTL4 =0X03;
  ATD0CTL5 =0X30;
  
}

/**************************AD***********************
void AD01 (unsigned char)
  {
  
   unsigned char a;
   while(!ATD0STAT2L_CCF0);
  
  ;a=ATD0DR0L;return a;
  }
  
   
void AD02 (unsigned char)

  {
  
   unsigned char a;

  
    while(!ATD0STAT2L_CCF1) ;

  a=ATD0DR0L;return a;
   
  }     */
   
   
/**************************延时********************************/   
   
void delay_01(void)
  {
  
  
  unsigned int loop_i,loop_j;
  for (loop_i=0;loop_i<500;loop_i++)
  
   {
   for(loop_j=0;loop_j<5000;loop_j++)
   {
   ;
   }
   }  
  
}










void main(void) {
  /* put your own code here */
SetBusCLK_80();
ATD0_Init();
     PWM_01();
     PWMDTY45 =14;
     PWMDTY23 = 1635; delay_01();
     PWMDTY23 = 1360; delay_01();
     PWMDTY23 =1495;
  delay();
   
     PWMDTY45 = 20;
     
     
     
     for(;;)
      {
      
     while(!ATD0STAT2L_CCF0); {; }
     while(!ATD0STAT2L_CCF1); {; }
     if( ATD0DR0L>116   ) {
      PWMDTY23 = 1360; PWMDTY45 =14;
     }
       else if ( ATD0DR1L>116) {
        PWMDTY23 = 1630;   PWMDTY45 =14;  
       }
        else PWMDTY23 =1495; PWMDTY45 =14;
        delay_01();
      }
     PWME=0X00;
        EnableInterrupts;



  for(;;) {
    _FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}







作者: 风中柳    时间: 2013-2-23 00:02
求大家能看一下,指出问题所在,大家一起进步。。。。
作者: 漫无止尽的八月    时间: 2013-2-23 02:53
具体原因我不知道是为什么,但是我AD转换的时候也是,比如开了an0,an1,an2,三个通道,只给an0电压,其他引脚悬空,但是an1,an2也可以转换出和an0一样的电压
作者: exiao    时间: 2013-2-23 09:11
谢谢分享
作者: 风中柳    时间: 2013-2-23 12:46
漫无止尽的八月 发表于 2013-2-23 02:53
具体原因我不知道是为什么,但是我AD转换的时候也是,比如开了an0,an1,an2,三个通道,只给an0电压,其他引脚 ...

这个应该是和AD模块本身有关,我看资料上有说当用连续转换时,哪一个先转换好就先放在结果寄存器0,往后依此类推,不知这资料是否正确
作者: 风中柳    时间: 2013-2-23 12:47
exiao 发表于 2013-2-23 09:11
谢谢分享

不知您有什么看法没有???
作者: 风中柳    时间: 2013-2-23 14:38
tearedice 发表于 2013-2-23 13:21
很久以前写的程序,两路AD,当时是一边翻书一边写的,但是确实能用,亲自试过用两个红外对管控制舵机的。 ...

哦,你采用的是单次转换,我采用的是连续转换模式。嗯,先谢谢你,我试一下用单次转换的试一下
作者: 风中柳    时间: 2013-3-2 23:34
:Q:Q:Q:Q问题还是没解决。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
作者: 风中柳    时间: 2013-3-2 23:35
:Q:Q:Q:Q:Q
作者: yyq20104668    时间: 2013-3-20 00:14
单通道转换不行吗?
作者: 风中柳    时间: 2013-3-21 21:54
yyq20104668 发表于 2013-3-20 00:14
单通道转换不行吗?

单通道可以用,现在问题真的解决了,可惜到现在还不知问题是怎么解决掉的,不过现在可以正常使用了,哈哈

作者: 浮夸    时间: 2013-4-7 20:16
似乎多通道AD转换需要分时用的吧?
作者: xzit308    时间: 2013-4-9 21:24
受教了
作者: 笔尖世界    时间: 2013-12-17 19:48

作者: 笔尖世界    时间: 2013-12-18 09:18
:):)




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