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口顯示轉換值
}
}