freetech

kinetis的模拟比较器例程

0
阅读(2714)

模拟比较器(Comparator)模块提供了一个电路,可以比较两路模拟电压。在过电压、过电流、欠压判断电路中经常用到。kinetis内置了模拟比较器,且为方便应用增加了些增强功能:

1、内置6位DAC:可以用DAC产生一个比较阀值而省去一些外部分压电阻。从1/64参考电压到参考电压按1/64参考电压递增。其参考电压可选源于VIN1和VIN2。

2、多路复用:同相和反相输入可配置分别从外部的7个引脚和内部的DAC(作为最后1 路,即第7路)共8路输入源输入。且输出可连接至引脚。

其框图如下:

image

模拟比较器有CMPx_CR0、CMPx_CR1、CMPx_FPR、CMPx_SCR、CMPx_DACCR、CMPx_MUXCR共6个寄存器,其中最常用的是CMPx_MUXCR和CMPx_CR1,前者控制输入源的选择,后者控制比较器使能和输出到引脚。若用到内部6位DAC,则要用CMPx_DACCR来设置6位DAC的使能和输出电压大小。

下面例程是CMP0IN1脚做同相输入(PSEL=1),DAC输出VDDA的一半做为反相输入(MSEL=7),输出至引脚

void ACMP_Init()
{
      SIM_SCGC4 |= SIM_SCGC4_CMP_MASK; // 打开CMP时钟 
      CMP0_DACCR = (1<<7)| (1<<6) | 32;//6位DAC输出参考电压的一半,即32
      SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK;//打开PORTC时钟
      PORTC_PCR7 &= (uint32_t)~0x01000700UL; // PORTC_PCR7: ISF=0,MUX=0
      PORTC_PCR5 = (uint32_t)((PORTC_PCR5 & (uint32_t)~0x01000100UL) | (uint32_t)0x0600UL);
      CMP0_MUXCR = 0xCF;// CMP0_MUXCR: PEN=1,MEN=1,PSEL=1,MSEL=7
      CMP0_CR1 = (uint8_t)0x03U;      
}

运行上面程序,顺时针旋转板上电位器R18,当到某位置时板上D1会点亮,反向旋转到该位置时D1会熄灭。