常驻嘉宾
- 积分
- 3903
- 威望
- 436
- 贡献
- 3327
- 兑换币
- 16
- 注册时间
- 2011-5-29
- 在线时间
- 70 小时
|
要让ATD 开始转换工作,必须经过以下三个步骤:
1.将ADPU 置1,使ATD 启动;
2.按照要求对转换为数、扫描方式、采样时间、时钟频率及标志检查等方式进行设置;
3.发出启动命令;
如果上电默认状态即能满足工作要求,那么只要将ADPU 置1,然后通过控制寄存器发出转换命令,即可实现转换。
【例程】
程序描述:由通道ATD0进行单通道A/D转换,转换值在B口显示
程序如下:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
/******定义变量********/
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;
}
/*AD初始化*/
void AD_Init(void)
{
ATD0CTL2=0xC0; //1100 0000 启动A/D, 快速清零, 无等待模式, 禁止外部触发, 中断禁止
ATD0CTL3=0x20; // 转换序列长度为4, No FIFO, Freeze模式下继续转换
ATD0CTL4=0x85; // 8位精度, 2个时钟,分频系数为32,ATDClock=[BusClock*0.5]/[PRS+1]=2MHzRS=5,divider=12
ATD0CTL5=0xA0; //1010 0000 右对齐方式,有符号,单通道转换,通道0
ATD0DIEN=0x00; // 禁止数字输入
}
/*读取AD转换结果*/
void AD_GetValue(word *AD_wValue)
{
*AD_wValue=ATD0DR0; //ATDDR0~~ATDDR7为8个结果寄存器,此处为读取结果寄存器的值
}
/**********主函数**************/
void main(void)
{
PLL_Init();
AD_Init();
DDRB=0xFF;
PORTB=0x00;
EnableInterrupts;
for(;;)
{
while(!ATD0STAT1_CCF0); // 独立通道转换完成标志位,每个通道转换结束后置位,
while(ATDOSTAT1_CCF0==1)
AD_GetValue(&AD_wValue); // 读取转换结果
PORTB = (byte)AD_wValue; // 在B口显示转换值
}
} |
|