飞思卡尔16位单片机(五)——ADC模数转换模块测试

一、介绍

       ADC模块的作用是将模拟的电压信号转换为CPU可以处理的数字信号。一些低端的单片机上没有ADC模块,必须使用片外的ADC芯片,才能实现模数转换的功能。而飞思卡尔的单片机一般是集成了ADC模块的,这样使用起来就很方便了。虽然片内的ADC模块采集的精度不高,但是对于一般的用途已经足够用了。

        XEP100的ADC模块由模拟量前端、模拟量转换、控制部分和结果存储四部分组成。ADC工作时由CPU发出启动命令,然后经过采样、模数转换,最后将结果保存到相应的寄存器。XEP100单片机ADC模块具有如下特性:

● 8位、10位和12位三种转换模式。
● 采样缓冲器放大功能。
● 可编程的采样时间。
● 左/右对齐,有/无符号的结果。
● 外部触发控制。
● 变换完成生成中断。
● 8路模拟输入通道的复用器。
● 模拟/数字输入引脚的复用技术。
● 1到16个转换序列的长度。
● 连续转换模式。
● 多通道扫描。

        采用下面的电路,对单片机的ADC模块进行测试。

电路中,有两个电位计,对5V的电压进行分压,并将分压后的电压输入给单片机的ADC引脚,调节电位计可以改变输入电压的大小。从而改变输入AD值。

二、模数转换实验

        在这个实验中,我们对ADC的输入功能进行测试,在使用ADC时,首先要对ADC进行初始化,如下所示。

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

在这段初始化代码中,将ADC设置为8位模式快速清零模式,禁止中断,每次只转换一个通道,AD模块始终频率为2MHz。8位模式下,转换结果为0~255,对应电压输入为0~5V。

        下面的函数为AD采集的函数。

unsigned char AD_capture(unsigned char s) 
{
 unsigned char AD_data;
 switch(s)
 { 
  case 1:
    ATD0CTL5 = 0x01;    //转换AD01
    while(!ATD0STAT2_CCF0);
    AD_data = ATD0DR0L;
    break;

  case 2:
    ATD0CTL5 = 0x00;    //转换AD00
    while(!ATD0STAT2_CCF0);
    AD_data = ATD0DR0L;
    break;
 }
 return(AD_data);
}

这个函数对AD0或AD1的AD值进行采集,用ATD0CTL5寄存器启动AD转换,然后等待转换完成,转换完成后将转换结果返回。

这个程序的主函数如下所示。

void main(void) {
  DisableInterrupts; 
  LEDCPU_dir = 1;
  INIT_AD();
  EnableInterrupts; 
  LEDCPU = 0;

  for(;;) 
  {
    AD_in1 = AD_capture(1);
    AD_in0 = AD_capture(2);
    if(AD_in1 > AD_in0)
      LEDCPU = 0;
    else
      LEDCPU = 1;
  } 
}

在主循环中,对AD0和AD1的AD值进行读取,如果AD1>AD0则点亮指示灯,否则熄灭指示灯。

这个实验的代码可以从本文的资源中下载。在本文的资源中,还提供了XEP100单片机所有ADC通道的8位和12位转换的驱动代码。

发布了78 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/bhniunan/article/details/104214548