智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2105|回复: 5
打印 上一主题 下一主题

[采集类] 飞思卡尔芯片AD采样

[复制链接]

2

主题

8

帖子

0

精华

注册会员

Rank: 2

积分
58
威望
40
贡献
8
兑换币
10
注册时间
2016-10-21
在线时间
5 小时
毕业学校
厦门大学
跳转到指定楼层
1#
发表于 2016-10-21 13:04:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用飞思卡尔芯片MC9S12XS芯片的开发板对外进行电压量的采集,AD口是直接连外部电路的电压(0-5V)输出口可以吗?需要外搭什么电路吗?VRH和VRL两个引脚在开发板上已经分别为5V和地了。需要另接什么吗?这两个引脚需要连在外部电路上吗?求大神指点
回复

使用道具 举报

4

主题

220

帖子

0

精华

常驻嘉宾

技术盒子

Rank: 8Rank: 8

积分
4641

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

威望
2678
贡献
1245
兑换币
915
注册时间
2016-3-27
在线时间
359 小时
毕业学校
东科大
2#
发表于 2016-10-21 17:32:50 | 只看该作者
输入不要超过单片机工作电压
回复 支持 反对

使用道具 举报

56

主题

1684

帖子

2

精华

版主

有所思,有所为。

Rank: 9Rank: 9Rank: 9

积分
9497

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章资源大师奖章论坛骨干奖章

威望
6762
贡献
83
兑换币
3601
注册时间
2014-10-31
在线时间
1326 小时
3#
发表于 2016-10-22 18:56:11 | 只看该作者
xs有内部AD配置一下就ok
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

注册会员

Rank: 2

积分
58
威望
40
贡献
8
兑换币
10
注册时间
2016-10-21
在线时间
5 小时
毕业学校
厦门大学
4#
 楼主| 发表于 2016-10-24 09:54:17 | 只看该作者
YFKJ 发表于 2016-10-21 17:32
输入不要超过单片机工作电压

AD引脚没有给输入的时候,为什么会有电压值呢,而且还一直波动
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

注册会员

Rank: 2

积分
58
威望
40
贡献
8
兑换币
10
注册时间
2016-10-21
在线时间
5 小时
毕业学校
厦门大学
5#
 楼主| 发表于 2016-10-24 10:30:02 | 只看该作者
じ~凝眸处 发表于 2016-10-22 18:56
xs有内部AD配置一下就ok

为什么加上PIT定时器模块,AD模块采样就失效呢,以下是部分程序:#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include "ZX0802_002.h"      
#include "18B20_002.h"      

#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
#define  BUS_CLOCK                   32000000           //总线频率
#define  OSC_CLOCK                   16000000           //晶振频率

unsigned int AD_in1,AD_in0,AD_in3,AD_in4;
unsigned int wendu;
unsigned int zhengshu,xiaoshu;
unsigned int volt_zhengshu,volt_xiaoshu;
unsigned int strom_zhengshu,strom_xiaoshu;
float u_xiaoshu,i_xiaoshu;
signed char temperature[7]={'0','0','0','.','0','0','C'};
signed char volt[6]={'0','0','.','0','0','V'};
signed char strom[7]={'0','0','0','.','0','0','A'};
unsigned int num[9];
int i,j,n;
int pit_count,pit_flag;

/*************************************************************/
/*                      初始化锁相环                         */
/*************************************************************/
void INIT_PLL(void)
{
    CLKSEL &= 0x7f;       //设置OSCCLK作为系统时钟
    PLLCTL &= 0x8F;       //禁止锁相环
     CRGINT &= 0xDF;

    //PLLCLK=2×OSCCLK×(SYNDIV+1)/(REFDIV+1), fbus=PLLCLK/2
    #if(BUS_CLOCK == 120000000)
        SYNR = 0xcd;
    #elif(BUS_CLOCK == 104000000)
      SYNR = 0xcc;
    #elif(BUS_CLOCK == 96000000)
      SYNR = 0xcb;
    #elif(BUS_CLOCK == 88000000)
      SYNR = 0xca;
    #elif(BUS_CLOCK == 80000000)
      SYNR = 0xc9;
   #elif(BUS_CLOCK == 72000000)
       SYNR = 0xc8;
    #elif(BUS_CLOCK == 64000000)
      SYNR = 0xc7;
    #elif(BUS_CLOCK == 56000000)
      SYNR = 0xc6;
    #elif(BUS_CLOCK == 48000000)
      SYNR = 0xc5;
    #elif(BUS_CLOCK == 40000000)
      SYNR = 0x44;
    #elif(BUS_CLOCK == 32000000)
      SYNR = 0x43;     
    #elif(BUS_CLOCK == 24000000)
      SYNR = 0x42;
    #elif(BUS_CLOCK == 16000000)
      SYNR = 0x01;
   #endif

    REFDV = 0x81;
    PLLCTL |=0x70;  //使能锁相环
    asm NOP;
    asm NOP;
    while(!(CRGFLG&0x08)); //PLLCLK锁定
    CLKSEL |= 0x80;        //设置PLLCLK为系统时钟
}


/************************************************************/
/*                    初始化ECT模块                         */
/************************************************************/
void initialize_ect(void){
  TSCR1_TFFCA = 1;  // 定时器标志位快速清除
  TSCR1_TEN = 1;    // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
  TIOS  = 0xff;      //指定所有通道为输出比较方式
  TCTL1 = 0x00;            // 后四个通道设置为定时器与输出引脚断开
  TCTL2 = 0x00;     // 前四个通道设置为定时器与输出引脚断开
  TIE   = 0x00;     // 禁止所有通道定时中断
  TSCR2 = 0x07;            // 预分频系数pr2-pr0:111,,时钟周期为4us,
  TFLG1 = 0xff;            // 清除各IC/OC中断标志位
  TFLG2 = 0xff;     // 清除自由定时器中断标志位
}
/*************************************************************/
/*                     PIT模块初始化函数                     */
/*************************************************************/
void init_PIT(){
PITCFLMT=0x00;
PITMTLD0=249;     //为0通道8位计数器赋值
PITLD0=63999;     //为0通道16位计数器赋值   //(249+1)*(63999+1)=16000000个总线周期=0.5秒
PITMUX_PMUX0=0;   //第0通道使用微计数器0
PITCE_PCE0=1;     //第0通道计数器工作
PITCFLMT=0x80;    //使能周期中断定时器
PITINTE_PINTE0=1; //0通道定时器定时中断被使能
}

/*************************************************************/
/*                      计时中断函数                         */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void  PIT_INTER(void)
{
    if(PITTF_PTF0==1) {

      PITTF_PTF0=1;
      pit_count++;   
   if(pit_count==10)
    {
   pit_flag=1;
   pit_count=0;
     }

       }
}
#pragma CODE_SEG DEFAULT


/*************************************************************/
/*                      初始化AD模块                         */
/*************************************************************/
void INIT_AD(void)
{
ATD0CTL2 = 0x40;  //启动A/D模块,快速清零,禁止中断
ATD0CTL1_SRES=2;  //选用12位模数转换
ATD0CTL3 = 0x88;   //每次只转换一个通道
ATD0CTL4 = 0x07;   //AD模块时钟频率为8MHz
}


/*************************************************************/
/*                        起动AD转换                         */
/*************************************************************/
unsigned int AD_capture(unsigned char chanel)
{
unsigned int AD_data;
switch(chanel)
{
  case 0:
    ATD0CTL5 = 0x00;    //转换AD00
    while(!ATD0STAT0_SCF);
    AD_data = ATD0DR0;
    break;               

  case 1:
    ATD0CTL5 = 0x01;    //转换AD01
    while(!ATD0STAT0_SCF);
    AD_data = ATD0DR0;
    break;

  case 2:
    ATD0CTL5 = 0x02;    //转换AD02
    while(!ATD0STAT0_SCF);
    AD_data = ATD0DR0;
    break;

  case 3:
    ATD0CTL5 = 0x03;    //转换AD03
    while(!ATD0STAT0_SCF);
    AD_data = ATD0DR0;
    break;

  case 4:
    ATD0CTL5 = 0x04;    //转换AD04
    while(!ATD0STAT0_SCF);
    AD_data = ATD0DR0;
    break;

  case 5:
    ATD0CTL5 = 0x05;    //转换AD05
    while(!ATD0STAT0_SCF);
    AD_data = ATD0DR0;
    break;

  case 6:
    ATD0CTL5 = 0x06;    //转换AD06
    while(!ATD0STAT0_SCF);
    AD_data = ATD0DR0;
    break;

  case 7:
    ATD0CTL5 = 0x07;    //转换AD07
    while(!ATD0STAT0_SCF);
    AD_data = ATD0DR0;
    break;

  case 8:
    ATD0CTL5 = 0x08;    //转换AD08
    while(!ATD0STAT0_SCF);
    AD_data = ATD0DR0;
    break;

  case 9:
    ATD0CTL5 = 0x09;    //转换AD09
    while(!ATD0STAT0_SCF);
    AD_data = ATD0DR0;
    break;

  case 10:
    ATD0CTL5 = 0x0a;    //转换AD10
    while(!ATD0STAT0_SCF);
    AD_data = ATD0DR0;
    break;

  case 11:
    ATD0CTL5 = 0x0b;    //转换AD11
    while(!ATD0STAT0_SCF);
    AD_data = ATD0DR0;
    break;

  case 12:
    ATD0CTL5 = 0x0c;    //转换AD12
    while(!ATD0STAT0_SCF);
    AD_data = ATD0DR0;
    break;

  case 13:
    ATD0CTL5 = 0x0d;    //转换AD13
    while(!ATD0STAT0_SCF);
    AD_data = ATD0DR0;
    break;

  case 14:
    ATD0CTL5 = 0x0e;    //转换AD14
    while(!ATD0STAT0_SCF);
    AD_data = ATD0DR0;
    break;

  case 15:
    ATD0CTL5 = 0x0f;    //转换AD15
    while(!ATD0STAT0_SCF);
    AD_data = ATD0DR0;
    break;

}
return(AD_data);
}



/************************************************************/
/*                  在液晶上显示温度                        */
/************************************************************/
void play_temp(void)
{


//     INIT_LCD();
//      lcd_clear();

      lcd_string(temperature[0]);
      lcd_string(temperature[1]);
      lcd_string(temperature[2]);
      lcd_string(temperature[3]);
      lcd_string(temperature[4]);
      lcd_string(temperature[5]);
      lcd_string(temperature[6]);   
      lcd_string(32);                           
      delay1ms(500);


}

/************************************************************/
/*                  在液晶上显示电压                        */
/************************************************************/
void play_volt(void)
{

      lcd_string(volt[0]);
      lcd_string(volt[1]);
      lcd_string(volt[2]);
      lcd_string(volt[3]);
      lcd_string(volt[4]);
      lcd_string(volt[5]);
      lcd_string(32);                                
      delay1ms(500);

}
/************************************************************/
/*                  在液晶上显示电流                        */
/************************************************************/
void play_strom(void)
{

      lcd_string(strom[0]);
      lcd_string(strom[1]);
      lcd_string(strom[2]);
      lcd_string(strom[3]);
      lcd_string(strom[4]);
      lcd_string(strom[5]);
      lcd_string(strom[6]);

      delay1ms(500);

}
/************************************************************/
/*                 电压数值转换                        */
/************************************************************/
void trans_volt(unsigned int k)
{

     volt_zhengshu=k/819;        //计算电压的证整数部分
     u_xiaoshu=(k/819.00-volt_zhengshu)*100;       //计算电压的小数部分
     volt_xiaoshu=(int)u_xiaoshu;
     volt[0]=volt_zhengshu/10+48;    //计算电压的各位字符型
     volt[1]=volt_zhengshu%10+48;
     volt[3]=volt_xiaoshu/10+48;
     volt[4]=volt_xiaoshu%10+48;

}

/************************************************************/
/*                 电流数值转换                        */
/************************************************************/
void trans_strom(unsigned int k)
{
  if(k>820)
  {

     strom_zhengshu=(k/819.000-1)/0.0052;
     i_xiaoshu=((k/819.000-1)/0.0052-strom_zhengshu)*100;
     strom_xiaoshu=(int)i_xiaoshu;

     strom[0]=strom_zhengshu/100+48;    //计算电流的各位字符型
     strom[1]=(strom_zhengshu/10)%10+48;
     strom[2]=strom_zhengshu%10+48;
     strom[4]=strom_xiaoshu/10+48;
     strom[5]=strom_xiaoshu%10+48;
  }
  else
  {
     strom[0]=0+48;    //计算电流的各位字符型
     strom[1]=0+48;
     strom[2]=0+48;
     strom[4]=0+48;
     strom[5]=0+48;
  }
}

/*************************************************************/
/*                        温度数值转换                          */
/*************************************************************/
void trans_temp() {

if(wendu<2001)                //温度为0上的温度
                 {               
        wendu&=0x07ff;
        zhengshu=wendu/16;        //计算温度的整数部分

        xiaoshu=(wendu*25/4)%100; //计算温度的小数部分
        temperature[0]=zhengshu/100+48;     //计算温度的各位的字符值
        temperature[1]=(zhengshu%100)/10+48;
        temperature[2]=zhengshu%10+48;
        temperature[4]=xiaoshu/10+48;
        temperature[5]=xiaoshu%10+48;

                 }
                 else
                 {                       
                          wendu=~(wendu-1);                               
        zhengshu=wendu/16;             //计算温度的整数部分
                          xiaoshu=(wendu*25/4)%100;      //计算温度的小数部分
        temperature[0]='-';
        temperature[1]=zhengshu/10+48;   //计算温度的各位的字符值
        temperature[2]=zhengshu%10+48;
        temperature[4]=xiaoshu/10+48;
        temperature[5]=xiaoshu%10+48;

                 }
}
                 
/*************************************************************/
/*                         主函数                            */
/*************************************************************/
void main(void) {
  pit_count=1;
  pit_flag=0;
  DisableInterrupts;
  init_PIT();
  INIT_PLL();
  initialize_ect();

  LEDCPU_dir=1;
  LEDCPU=0;
  INIT_AD();
  EnableInterrupts;


  INIT_LCD();
for(;;)
   {

     wendu=read_T_001();               //读取温度值
                 trans_temp();
                 INIT_LCD();
           play_temp();
           delay1ms(100);
           AD_in3=AD_capture(3);
     trans_volt(AD_in3);
     play_volt();

     trans_strom(AD_in3);
     play_strom();
          
  }
}


回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

注册会员

Rank: 2

积分
58
威望
40
贡献
8
兑换币
10
注册时间
2016-10-21
在线时间
5 小时
毕业学校
厦门大学
6#
 楼主| 发表于 2016-10-24 20:48:21 | 只看该作者
已解决,中断地址有问题
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-5 14:47 , Processed in 0.162750 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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