飞思卡尔ATD模块

时间:2021-07-05 22:15:35
 S12XS系列MCU的ATD模块有27个寄存器,六个转换控制寄存器,两个转换状态寄存器,一个比较使能寄存器,一个比较方式寄存器和16个转换结果寄存器,附上一段例程
void ATD_init(void)   

{   

  ATD0CTL1=0x0f;   //选择8位转换精度  

  ATD0CTL2=0x40;  //打开CCF快速清零位,关闭外部触发输入,关闭中断    

 ATD0CTL3=0x08;   //数据左对齐,non-fifo,转换序列长度为1  

 ATD0CTL4=0xE3;  //采样时间为24个ATD时钟期,                 ATDCLK=8MB/8=1MHz  

一般常用到的也就是这段例程中用到的几个寄存器。

//-----------------------------------------------------------//
//功能说明:MC9S12XS128--ATD例程
//使用说明:由通道ATD0进行多通道A/D转换,转换值在B口显示
//程序设计:DEMOK工作室(demok.taobao.com)
//设计时间:2010.03.12
//------------------------------------------------------------//

#include <hidef.h>
#include "derivative.h"

word AD_wValue;//AD转换结果


//--------------初始化函数----------------//
//-----时钟初始化程序--------//

void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{ //锁相环时钟=2*16*(2+1)/(1+1)=48MHz
REFDV=1; //总线时钟=48/2=24MHz
SYNR=2;
while(!(CRGFLG&0x08));
CLKSEL=0x80;
}


//-----ATD初始化程序--------//

void AD_Init(void)
{
ATD0CTL1=0x00; //选择AD通道为外部触发,8位精度,采样前不放电
ATD0CTL2=0x40; //标志位自动清零,禁止外部触发, 禁止中断
ATD0CTL3=0xa0; //右对齐无符号,每次转换4个序列, No FIFO, Freeze模式下继续转
ATD0CTL4=0x01; //采样时间为4个AD时钟周期,PRS=1,ATDClock=6MHz
ATD0CTL5=0x30; //特殊通道禁止,连续转换 ,多通道转换,起始通道为0转换4个通道
ATD0DIEN=0x00; //禁止数字输入
}


//-----读取AD转换结果--------//

void AD_GetValue(word *AD_wValue)
{
*AD_wValue=ATD0DR0; //读取结果寄存器的值
}


//-----主函数--------//

void main(void)
{
PLL_Init();
AD_Init();
DDRB=0xFF;
PORTB=0x00;
EnableInterrupts;
for(;;)
{
while(!ATD0STAT2_CCF0); // 等待转换结束while(ATDOSTAT2_CCF0==1)
AD_GetValue(&AD_wValue); // 读取转换结果
PORTB = (byte)AD_wValue; // 在B口显示转换值
}
}