fire 发表于 2011-8-11 16:12:52

飞思卡尔单片机(MC9S12XS128)系列之7- AD 的使用

作者   :fire
时间地点 :2009 年于广州
开发平台 :MC9S12XS128最小系统(龙丘出品)
编译环境 :Freescale CodeWarrier 4.7

写在前面的话->:
ATD 的具体使用可参考 datasheet Chapter 10 Analog-to-Digital Converter (ADC12B16CV1) ,其中代码里头以有详细的注释,其余这里不再详述。

/***************************以下为代码实现****************************/
#include <hidef.h>      /* common defines and macros */
#include <MC9S12XS128.h>   /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
#define ucharunsigned char
#define uintunsigned int
/*--------函数原型声明----------------*/
void ATD_Init(void);
void Read_AD(uint ch, uchar *ad);
void SetBusCLK_16M(void);
/*-------------主函数-----------------*/
void main(void)
{
uchar *ad;
DisableInterrupts;
SetBusCLK_16M();

ATD_Init();
DDRB = 0XFF;
for(;;)
{
      Read_AD(0,ad);      //读取通道0的AD值
      PORTB = *ad;          //读取的AD值通过 LED 显示出来
}
}

/*---------------ATD初始化-------------*/
void ATD_Init(void)
{
   ATD0DIEN=0X00;      //禁止数字输入
   ATD0CTL1=0X00;      //不外部触发,8位分辨率
   //ATD0CTL1=0X15;   
                     //ATD控制寄存器1,写此寄存器会停止当前的转换序列(page 275)
                     //bit7外部触发源选择, =1外部触发源使能 =0外部触发源禁止
                     //bit65   AD 分辨率选择位00-8位精度 01-10位精度 10-12位精度11-保留
                     //bit4    =1采样前放电=0采样前不放电
                     //bit3210 外部触发通道选择Page 276
   ATD0CTL2=0x40;      //禁止外部触发, 中断禁止 快速清除标志 0100 0000
                                          
                     //bit7未生效或者保留
                     //bit6   AFFC快速清除标志位
                     //bit5   外部时钟输入停止模式位
                     //bit4   外部触发Level/Edge 控制
                     //bit3   外部触发极性选择
                     //bit2   外部触发模式使能
                     //bit1   ATD转换完成中断使能
                     //bit0   ATD比较中断使能
   ATD0CTL3=0x84;      //| DJM | S8C | S4C | S2C || S1C | FIFO | FRZ1 | FRZ0 |
                     //右对齐无符号,每次转换4个序列, No FIFO, Freeze模式下继续转
                     //bit7转换结果对齐模式位 =0左对齐 =1右对齐
                     //bit6543转换序列长度就是需要转换的通道数默认转换序列长度为4 Page 279
                     
                     //bit2   结果(FIFOFirst in First out )寄存器先进先出模式位
                     //bit10    背景调试冻结使能位
                                  //00 继续转换01 保留10 完成当前转换,再冻结 ,11 立即冻结
   ATD0CTL4=0x01;      //采样时间为4个ATD时钟
                     //bit7-5   采样时钟选择位(page 280)
                     //bit4-0   PRSATD时钟预分频位
                     //公式: ATDClock=/Page 280
                     
   ATD0CTL5=0;         //bit7 281页
                     //bit6 SC 特殊通道转换使能位=0特殊通道不使能 =1特殊通道使能
                     //bit5 SCAN=1 连续转换=0 Signal conversion sequence
                     //bit4多通道采样模式位 =1 多通道轮流采样=0单通道采样
                     //bit3-0模拟输入通道选择位 CD CC CB CA 0000-1111 0-16通道
}                                                               

/*---------------读取ATD的值------------------*/
void Read_AD(uint ch, uchar *ad)
{   
    ATD0CTL5|=(0X20+ch);   //禁止特殊通道,扫描模式,单通道采样
                           //通道选择 ch可为 0 1 2 3 4 5 6 7
                           //281页
    while(!ATD0STAT0_SCF);   //等待转换完成
    switch(ch)
    {         
       case 0:   *(ad+0)= ATD0DR0L;   break;   
       case 1:   *(ad+1)= ATD0DR1L;   break;
       case 2:   *(ad+2)= ATD0DR2L;   break;
       case 3:   *(ad+3)= ATD0DR3L;   break;
       case 4:   *(ad+4)= ATD0DR4L;   break;
       case 5:   *(ad+5)= ATD0DR5L;   break;
       case 6:   *(ad+6)= ATD0DR6L;   break;
       case 7:   *(ad+7)= ATD0DR7L;   break;         
    }
}
/*-----------------配置系统时钟---------------*/
void SetBusCLK_16M(void)
{   
    CLKSEL=0X00;                  //disengage PLL to system
    PLLCTL_PLLON=1;               //turn on PLL
    SYNR=1;         
    REFDV=1;                        //pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
    _asm(nop);                      //BUS CLOCK=16M
    _asm(nop);
    while(!(CRGFLG_LOCK==1));      //when pll is steady ,then use it;
    CLKSEL_PLLSEL =1;            //engage PLL to system;
}
/*-----------------end of file------------------*/

fire 发表于 2011-8-11 16:13:43

呵呵,先发这几篇吧,等帖子审核过了之后再发。

fire 发表于 2011-8-12 13:52:37

两天了,还没审核过,难道我这个帖子有什么问题嘛

fire 发表于 2011-8-12 13:55:42

请阿莫快点帮我审核吧,我手头上还有涉嫌头和图像处理的demo哩

lycjickson 发表于 2011-8-23 16:09:01

呵呵,以前用过飞思卡尔芯片,谢谢分享

xiaochong5105 发表于 2011-11-12 20:49:47

楼主ATD1的寄存器怎么配置啊,好像XS128没有ATD1的寄存器

zhangxingxing 发表于 2011-11-13 09:37:48

zhangxingxing 发表于 2011-11-13 09:38:23

同意

wscjun 发表于 2011-11-25 14:19:02

很实用的资料 真心谢谢分享

yinian 发表于 2011-11-29 22:03:03

谢谢分享,正在进行学习
页: [1]
查看完整版本: 飞思卡尔单片机(MC9S12XS128)系列之7- AD 的使用