|
作者 :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 uchar unsigned char
#define uint unsigned 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 结果(FIFO First in First out )寄存器先进先出模式位
//bit10 背景调试冻结使能位
//00 继续转换 01 保留 10 完成当前转换,再冻结 ,11 立即冻结
ATD0CTL4=0x01; //采样时间为4个ATD时钟
//bit7-5 采样时钟选择位(page 280)
//bit4-0 PRS[4:0]ATD时钟预分频位
//公式: ATDClock=[BusClock]/[2*(PRS+1)] 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------------------*/ |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|