飞思卡尔单片机(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------------------*/ 呵呵,先发这几篇吧,等帖子审核过了之后再发。 两天了,还没审核过,难道我这个帖子有什么问题嘛 请阿莫快点帮我审核吧,我手头上还有涉嫌头和图像处理的demo哩 呵呵,以前用过飞思卡尔芯片,谢谢分享 楼主ATD1的寄存器怎么配置啊,好像XS128没有ATD1的寄存器 恩 同意 很实用的资料 真心谢谢分享 谢谢分享,正在进行学习
页:
[1]