1 / 16

Freescale HCS12 微控制器

Freescale HCS12 微控制器. A/D 转换模块. SCI 1. SCI 1. ATD 1. ATD 0. 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

morty
Download Presentation

Freescale HCS12 微控制器

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Freescale HCS12 微控制器

  2. A/D转换模块 SCI 1 SCI 1 ATD 1 ATD 0 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 0 ECT 8 CHAN 4K BYTES EEPROM

  3. AD转换模块 特点: 8/10 位精度 • 7 us, 10-位单次转换时间. • 采样缓冲放大器 • 可编程采样时间 • 左/右 对齐, 有符号/无符号结果数据 • 外部触发控制 • 转换完成中断 • 模拟输入8通道复用 • 模拟/数字输入引脚复用 • 1到8转换序列长度 • 连续转换模式 • 多通道扫描方式

  4. A/D 寄存器 控制寄存器 状态寄存器 转换结果寄存器

  5. A/D 控制寄存器2 ADPU - A/D 电源使能/禁止 1 = A/D模块上电 0 = 禁止A/D,以减少功耗 AWAI - A/D 等待模式 1 = 等待模式下,转换 0 = 等待模式下,禁止转换 ASCIE - A/D 顺序完成中断使能 ASCIF - A/D 顺序完成标志位 Address offset $0002 ATDCTRL2 AFFC - A/D 快速转换完成标志位清零 1 = 快速标志位清零顺序每次读取结果寄存器自动清零 0 = 正常标志位清零顺序需要手动对状态标志位清零

  6. A/D 控制寄存器3 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位 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 时钟 CCF标志位置位,如果在8通道模式下,序列结束 总是2 个时钟周期 2, 4, 8, 16 时钟周期 转换时间计算举例: (假设 2MHZ A/D 时钟频率) 例 1: 转换时间 = Initial Sample Time + Programmed Sample Time + Resolution Period = 2 + 2 + 10 = 14 A/D Clocks = 7uSec 例 2: 转换时间= Initial Sample Time + Programmed Sample Time + Resolution Period = 2 + 16 + 10 = 28 A/D Clocks = 14uSec

  9. A/D控制寄存器5 Address offset $0005 ATDCTRL5 通道选择 0 0 0 = Chan 0 - - 1 1 1 = Chan 7 DJM – 对齐方式 1 = 右对齐 0 = 左对齐 SCAN – 连续转换模式 1 = 连续转换模式 0 = 单次转换 DSGN – 符号选择 1 = 有符号 0 = 无符号 MULT – 多通道采样模式 1 = 多通道转换 0 = 单通道转换 注意:对这个寄存器写操作时,将会中断当前的转换,然后重新启动新的转换序列

  10. A/D 状态寄存器 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结果寄存器被读出时,清零

  11. 转换结果寄存器 左对齐数据存放格式 Address Offset $0010 - $0011 - - - $001E - $001F //假设左对齐10位精度 Word AD_wValue; AD_wValue = ATD0DR0>>6; 右对齐数据存放格式 Address Offset $0010 - $0011 - - - $001E - $001F

  12. A/D口寄存器 Address Offset $000F PORTAD1 ADA7 ADA6 ADA5 ADA4 ADA3 ADA2 ADA1 ADA0 A T D P T 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: 上电,标志位快速清零,开中断 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的值 for(i=0;i<0xFFFFF;i++); //delay PORTB = (byte)AD_wData[2]; //用PORT B来显示AD1的值 for(i=0;i<0xFFFFF;i++); //delay } }

More Related