智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 7004|回复: 15
打印 上一主题 下一主题

[资料] XS128 AD采样程序

[复制链接]

4

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
威望
334
贡献
63
兑换币
161
注册时间
2012-9-9
在线时间
49 小时
跳转到指定楼层
1#
发表于 2013-2-23 00:01:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
40贡献
//这个程序是用来采集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;
}





最佳答案

查看完整内容

很久以前写的程序,两路AD,当时是一边翻书一边写的,但是确实能用,亲自试过用两个红外对管控制舵机的。 #include /* common defines and macros */ #include "derivative.h" /* derivative-specific definitions */ void SetBusCLK_80(void)//锁相环初始化 { CLKSEL=0X00; //禁止锁相环 PLLCTL_PLLON=1; //锁相环电路允许位 SYNR=0xc0 | 0x09; //SYNR=1 RE ...

15

主题

446

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6621

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

威望
4233
贡献
1318
兑换币
883
注册时间
2012-3-6
在线时间
535 小时
2#
发表于 2013-2-23 00:01:23 | 只看该作者
很久以前写的程序,两路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 */
}






回复

使用道具 举报

4

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
威望
334
贡献
63
兑换币
161
注册时间
2012-9-9
在线时间
49 小时
3#
 楼主| 发表于 2013-2-23 00:02:12 | 只看该作者
求大家能看一下,指出问题所在,大家一起进步。。。。
回复

使用道具 举报

5

主题

54

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1946
威望
855
贡献
467
兑换币
557
注册时间
2012-12-3
在线时间
312 小时
毕业学校
大连理工大学城市学院
4#
发表于 2013-2-23 02:53:50 | 只看该作者
具体原因我不知道是为什么,但是我AD转换的时候也是,比如开了an0,an1,an2,三个通道,只给an0电压,其他引脚悬空,但是an1,an2也可以转换出和an0一样的电压
回复

使用道具 举报

1

主题

2067

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5124

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

威望
2752
贡献
898
兑换币
59
注册时间
2012-12-8
在线时间
737 小时
5#
发表于 2013-2-23 09:11:05 | 只看该作者
谢谢分享
回复

使用道具 举报

4

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
威望
334
贡献
63
兑换币
161
注册时间
2012-9-9
在线时间
49 小时
6#
 楼主| 发表于 2013-2-23 12:46:25 | 只看该作者
漫无止尽的八月 发表于 2013-2-23 02:53
具体原因我不知道是为什么,但是我AD转换的时候也是,比如开了an0,an1,an2,三个通道,只给an0电压,其他引脚 ...

这个应该是和AD模块本身有关,我看资料上有说当用连续转换时,哪一个先转换好就先放在结果寄存器0,往后依此类推,不知这资料是否正确
回复

使用道具 举报

4

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
威望
334
贡献
63
兑换币
161
注册时间
2012-9-9
在线时间
49 小时
7#
 楼主| 发表于 2013-2-23 12:47:29 | 只看该作者
exiao 发表于 2013-2-23 09:11
谢谢分享

不知您有什么看法没有???
回复

使用道具 举报

4

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
威望
334
贡献
63
兑换币
161
注册时间
2012-9-9
在线时间
49 小时
8#
 楼主| 发表于 2013-2-23 14:38:08 | 只看该作者
tearedice 发表于 2013-2-23 13:21
很久以前写的程序,两路AD,当时是一边翻书一边写的,但是确实能用,亲自试过用两个红外对管控制舵机的。 ...

哦,你采用的是单次转换,我采用的是连续转换模式。嗯,先谢谢你,我试一下用单次转换的试一下
回复

使用道具 举报

4

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
威望
334
贡献
63
兑换币
161
注册时间
2012-9-9
在线时间
49 小时
9#
 楼主| 发表于 2013-3-2 23:34:37 | 只看该作者
:Q:Q:Q:Q问题还是没解决。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
回复

使用道具 举报

4

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
威望
334
贡献
63
兑换币
161
注册时间
2012-9-9
在线时间
49 小时
10#
 楼主| 发表于 2013-3-2 23:35:02 | 只看该作者
:Q:Q:Q:Q:Q
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-26 00:50 , Processed in 0.057038 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表