Download presentation
Presentation is loading. Please wait.
1
Freescale HCS12 微控制器
2
A/D转换模块 Star12 CPU Internal Bus SCI 1 SCI 1 ATD 1 ATD 12K SRAM
12K SRAM 256K FLASEEPROM Internal Bus SPI 2 or PWM CH 4-7 SPI 1 or PWM CH 0-3 SPI 0 BKP INT MMI PWM 8 CHAN Star12 CPU SIM CM BDM MEBI PIM PLL PIT msCAN 4 or IIC msCAN 3 msCAN 2 msCAN 1 BDLC or msCAN ECT 8 CHAN 4K BYTES EEPROM
3
Freescale Corporate Template User Guide
AD转换模块 March 2005 特点: 8/10 位精度 • 7 us, 10-位单次转换时间. • 采样缓冲放大器 • 可编程采样时间 • 左/右 对齐, 有符号/无符号结果数据 • 外部触发控制 • 转换完成中断 • 模拟输入8通道复用 • 模拟/数字输入引脚复用 • 1到8转换序列长度 • 连续转换模式 • 多通道扫描方式 © Freescale Semiconductor, Inc. 2005
4
A/D 寄存器 控制寄存器 状态寄存器 转换结果寄存器
5
A/D 控制寄存器2 ETRIGLE ETRIGP ETRIGE SCAN 描述 x 忽略外部触发,执行一次转换后停止 1
ADPU - A/D 电源使能/禁止 1 = A/D模块上电 0 = 禁止A/D,以减少功耗 AWAI - A/D 等待模式 1 = 等待模式下,转换 0 = 等待模式下,禁止转换 ASCIE - A/D 顺序完成中断使能 ASCIF - A/D 顺序完成标志位 ATDCTRL2 Address offset $0002 AFFC - A/D 快速转换完成标志位清零 1 = 快速标志位清零顺序 每次读取结果寄存器自动清零 0 = 正常标志位清零顺序 需要手动对状态标志位清零 ETRIGLE ETRIGP ETRIGE SCAN 描述 x 忽略外部触发,执行一次转换后停止 1 忽略外部触发,执行连续转换后 X 下降沿触发,每次触发,执行一次转换 上升沿触发,每次触发,执行一次转换 低电平触发,每次触发,执行连续转换 高电平触发,每次触发,执行连续转换
6
A/D 控制寄存器3 FIFO – 结果寄存器 FIFO 1 = 结果寄存器没有映射到转换序列 0 = 结果寄存器没有映射到转换序列
Address offset $0003 ATDCTRL3 FIFO – 结果寄存器 FIFO 1 = 结果寄存器没有映射到转换序列 0 = 结果寄存器没有映射到转换序列 转换序列长度 转换序列长度就是需要转换的通道数 比如: 通道0,1,2作为AD采集通道 则转换序列为3,即S2C=1,S1C=1 在控制寄存器5 ATD0CTL5中: 设CC CB CA = 0 0 0,转换序列从通道0开始;ATD0DR0,ATD0DR1,ATD0DR2存放转换结果 设CC CB CA = 0 1 0,转换序列从通道2开始。 仍然是ATD0DR0,ATD0DR1,ATD0DR2存放转换结果
7
A/D 时钟选择/ 预分频 采样时间选择 • 最大 A/D 时钟 = 2.0 MHz (最小 A/D CLOCK = 0.5 MHz)
ATDCTL4(HI) - A/D 控制寄存器 Address offset $0004 采样时间选择 SRES8 - A/D 精度选择 1 = 8 位 0 = 10位 SMP [1:0] 采样时间 00 2 A/D时钟周期 01 4 A/D时钟周期 10 8 A/D时钟周期 11 16 A/D时钟周期 5位 模数计数器预分频器 - 由A/D控制寄存器中的PRS[4:0]控制 - 分频系数从2到64 - 如果 PRS[4:0] = 0, 预分频不起作用 注: 设置PRS[4:0]时, A/D Clock 不能大于 2 MHz. PRS0-PRS4 除2 5位 模数计数器 预分频器 系统时钟 A/D 时钟
8
转换时间 A/D 时钟 转换时间计算举例: (假设 2MHZ A/D 时钟频率) 例 1:
总是2 个时钟周期 CCF标志位置位,如果在8通道模式下,序列结束 2, 4, 8, 16 时钟周期 转换时间计算举例: (假设 2MHZ A/D 时钟频率) 例 1: 转换时间 = Initial Sample Time + Programmed Sample Time + Resolution Period = = 14 A/D Clocks = 7uSec 例 2: 转换时间= Initial Sample Time + Programmed Sample Time + Resolution Period = = 28 A/D Clocks = 14uSec
9
A/D控制寄存器5 注意:对这个寄存器写操作时,将会中断当前的转换,然后重新启动新的转换序列 DJM – 对齐方式
Address offset $0005 ATDCTRL5 通道选择 0 0 0 = Chan 0 - = Chan 7 SCAN – 连续转换模式 1 = 连续转换模式 0 = 单次转换 DJM – 对齐方式 1 = 右对齐 0 = 左对齐 DSGN – 符号选择 1 = 有符号 0 = 无符号 MULT – 多通道采样模式 1 = 多通道转换 0 = 单通道转换 注意:对这个寄存器写操作时,将会中断当前的转换,然后重新启动新的转换序列
10
Freescale Corporate Template User Guide
A/D 状态寄存器 March 2005 ATDSTAT0 Address Offset $0006 ATDSTAT1 $0007 SCF – 转换序列完成标志 - 在单次转换模式时,当转换完成后置位 (SCAN = 0) 在连续转换模式时,当第一次转换完成后置位 (SCAN = 1). 当 (AFFC = 0) ,写1清零. ETORF - 外部触发覆盖标志 - 如果在转换过程中高/低电平出现,置位 FIFOR – 当结果寄存器在读出之前已经被写入时,置位 ( CCF没有清零) CC[2:0] – 转换计数器 3-位计数器指向下一个将要转换的通道 CCF7 -CCF0 – 独立通道转换完成标志位 每个相应的通道转换结束后置位, 当相应的A/D结果寄存器被读出时,清零 © Freescale Semiconductor, Inc. 2005
11
转换结果寄存器 左对齐数据存放格式 右对齐数据存放格式 Address Offset $0010 - $0011 -
$001E - $001F //假设左对齐10位精度 Word AD_wValue; AD_wValue = ATD0DR0>>6; 右对齐数据存放格式 Address Offset $ $0011 - $001E - $001F
12
A/D口寄存器 A T D P 注意:任何一个引脚可以用作A/D或数字输入 ATDDIEN - ATD 数字输入使能 PORTAD1
Address Offset $000F ADA7 ADA6 ADA5 ADA4 ADA3 ADA2 ADA1 ADA0 A T D P ATDDIEN - ATD 数字输入使能 注意:任何一个引脚可以用作A/D或数字输入
13
AD使用示例-查询方式 void AD_Init(void) //初始化 {
ATD0CTL2=0xC0; //AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断禁止 ATD0CTL3=0x20; // 每个序列4次转换, No FIFO, Freeze模式下继续转换 ATD0CTL4=0x83; // 8位精度, 2个时钟, ATDClock=[BusClock*0.5]/[PRS+1] ; PRS=3, divider=8 ATD0CTL5=0xA0; //右对齐无符号,单通道采样,通道0 ATD0DIEN=0x00; // 禁止数字输入 } void AD_GetValue(word *AD_wValue) //读取AD转换结果 *AD_wValue = ATD0DR0; //Read out the Result Register word AD_wValue; void main(void) { word i; AD_Init(); //AD初始化 DDRB = 0xFF; PORTB = 0x00; EnableInterrupts; for(;;) { while(!ATD0STAT1_CCF0); //等待转换结束 AD_GetValue(&AD_wValue); //读取转换结果 PORTB = (byte)AD_wValue; //在B口显示转换值 }
14
AD使用示例-中断方式 word AD_wData = 0; void main(void) { word i; AD_Init();
DDRB = 0xFF; PORTB = 0x00; EnableInterrupts; for(;;) { PORTB = (byte)AD_wData; } void AD_Init(void) { ATD0CTL2=0xC2; //AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断开放 ATD0CTL3=0x20; ATD0CTL4=0x83; ATD0CTL5=0xA0; ATD0DIEN=0x00; } #pragma CODE_SEG NON_BANKED void interrupt 22 Int_AD0(void) AD_wData = ATD0DR0; //Read out the Result Register
15
AD使用例程 void AD_Init(void) //AD初始化 { //控制寄存器2: 上电,标志位快速清零,开中断
//控制寄存器2: 上电,标志位快速清零,开中断 ATD0CTL2 = (ATD0CTL2_ADPU_MASK|ATD0CTL2_AFFC_MASK|ATD0CTL2_ASCIE_MASK); //控制寄存器3:转换序列长度为3,FIFO模式 ATD0CTL3 = (ATD0CTL3_S2C_MASK|ATD0CTL3_S1C_MASK|ATD0CTL3_FIFO_MASK); //控制寄存器4: ATD0CTL4 = (ATD0CTL4_SRES8_MASK|ATD0CTL4_PRS1_MASK|ATD0CTL4_PRS0_MASK); //控制寄存器5: ATD0CTL5 = (ATD0CTL5_DJM_MASK|ATD0CTL5_SCAN_MASK|ATD0CTL5_MULT_MASK); ATD0DIEN=0x00; // 禁止数字输入缓冲 } #pragma CODE_SEG NON_BANKED //中断服务程序 void interrupt 22 Int_AD0(void) AD_wData[0] = ATD0DR0; //将结果寄存器中的值存放到数组中 AD_wData[1] = ATD0DR1; //将结果寄存器中的值存放到数组中 AD_wData[2] = ATD0DR2; //将结果寄存器中的值存放到数组中 #pragma CODE_SEG DEFAULT_ROM
16
word AD_wData[3]; //全局变量存放 AD0,AD1,AD2的结果
void main(void) { dword i; AD_Init(); //AD 初始化 DDRB = 0xFF; PORTB = 0x00; AD_wData[0] = 0; //全局变量初始化 AD_wData[1] = 0; AD_wData[2] = 0; EnableInterrupts; for(;;) { if(ATD0CTL2_ASCIE == 0) //采用查询方式 while(!ATD0STAT1_CCF0); //等待通道0转换结束 AD_wData[0] = ATD0DR0; //读通道0的转换结果 while(!ATD0STAT1_CCF1); //等待通道1转换结束 AD_wData[1] = ATD0DR1; //读通道1的转换结果 while(!ATD0STAT1_CCF2); //等待通道2转换结束 AD_wData[2] = ATD0DR2; //读通道2的转换结果 } PORTB = (byte)AD_wData[0]; //用PORT B来显示AD0的值 for(i=0;i<0xFFFFF;i++); //delay PORTB = (byte)AD_wData[1]; //用PORT B来显示AD1的值 PORTB = (byte)AD_wData[2]; //用PORT B来显示AD1的值
Similar presentations