LPC82x 系列 之 模拟比较器应用

一、什么是比较器

         比较器的功能是比较两个电压的大小(用输出电压的高或低电平,表示两个输入电压的大小关系)电压比较器可用于集成运算放大器组成,如下图所示:

            

        在比较器正输入端 UR 恒定的情况下,Ur 输入值的不同,Uo 对应的输出值也是不同的:

        当正输入端的电压值大于负输入端的电压值时,Uo 的输出值大于 0 。

        当正输入端的电压值小于负输入端的电压值时,Uo 的输出值小于 0。

         如图所示:

 
           

二、LPC824 ACMP 模块特点介绍

        LPC824 ACMP(Analog comparator) 具有以下几个特点

        (1) 可选的外部输入可用作比较器的正输入或负输入。

        (2) 内部基准电压(0.9 V 带隙基准)可用作比较器的正输入或负输入。

        (3) 32 级电压阶梯可用作比较器的正输入或负输入。

        (4) 可以在电源引脚 VDD 或 VDDCMP 引脚之间选择电压阶梯源。

        (5) 不需要时,可以单独关闭电压梯。

        (6) 具有中断能力。

 

三、LPC824 ACMP 硬件框图

 

            

 

 

四、LPC824 ACMP 的基本配置

1.
时钟配置:ACMP 的时钟由 SYSAHBCLKCTRL0 寄存器的 bit 19 控制:
     
    如下是 System clock control 0 register 图:

 

 
2. 电源配置:ACMP 的电源由 PDRUNCFG 寄存器的 bit 15 控制:

    如下是 Power configuration register 图:

            

 

五、LPC824 ACMP 的输入输出介绍


通过图 3-1 我们可以看到比较器的内部构造:

1. 在输入端口,正负输入源各自连接着一个 MUX(多路复用连接器),如图 5-1 所示:

        (1)
MUX 的输入0来自 VOLTAGE LADDER。

        (2) MUX 的输入1至5来自外部输入ACMP_I [5:1]。

        (3) MUX 的输入6来自内部参考电压输入。

        (4) MUX 的输入7来自 DACOUT0。


       通过控制 MUX 即 ACOMP->CTRL 寄存器的 COMPVMSEL & COMPVPSEL 位,我们可以很灵活的将各种电压源链接到比较器的正负输入端。

       模拟比较器多路复用输入输出引脚对照表如下所示:

 
           

        对于 MUX 的输入源 0 来说它相对其他的复用接口较为特殊,因为它的输入源也是可以配置的:

        (1) 控制 ACMP->LAD 寄存器的 LADREF 位来选择电压阶梯的参考电压

        (2) 设置 ACMP->LAD 寄存器的 LADSEL 来设置电压阶梯。

        如下表所示 Voltage ladder register bit description:

 
           

2. 在输出端口,通过 3-1 可以看到输出端分为两部分:

        (1)
一部分控制寄存器的状态位,可以触发中断。

        (2) 一部分将信号输出到外部引脚,这个引脚可以连接到除电源和 GND 外的任一引脚。

 

六、LPC824 ACMP 的使用流程

        (1) 配置并开启 ACMP 的时钟及电源

        (2) 初始化 ACMP module

        (3) 关闭或使能 ACMP 的中断功能

        (3) 设置 ACMP 的正负输入端口

        (4) 轮询 ACMP 的状态标志位或在中断里查询 ACMP 的状态标志位

 

七、LPC824 ACMP 的效果演示

 

示例代码

       #include "fsl_acomp.h"
       #include "fsl_debug_console.h"
       #include "board.h"

       #include "pin_mux.h"
       #include "fsl_power.h"
       #include
       /*******************************************************************************
        * Definitions
        ******************************************************************************/
       #define DEMO_ACOMP ACOMP
       #define DEMO_ACOMP_POSITIVE_INPUT 0U /* Voltage ladder output. */


       #define DEMO_ACOMP_NEGATIVE_INPUT 3U /* ACMP_I3. */
       #define BOARD_LED_PORT 0U
       #define BOARD_LED_PIN 12U

       /*!
        * @brief Main function
        */
       int main(void)
       {
           acomp_config_t acompConfigStruct;
           acomp_ladder_config_t ladderConfigStruct;

           BOARD_InitPins();
           BOARD_BootClockIRC12M();
           /* Power on ACMP. */
           POWER_DisablePD(kPDRUNCFG_PD_ACMP);

           /* Init output LED GPIO. */
           LED_RED_INIT(LOGIC_LED_ON);

           /* Initialize ACOMP module. */
           ACOMP_GetDefaultConfig(&acompConfigStruct);
           ACOMP_Init(DEMO_ACOMP, &acompConfigStruct);

       #if defined(FSL_FEATURE_ACOMP_HAS_CTRL_INTENA) && FSL_FEATURE_ACOMP_HAS_CTRL_INTENA
           /* Disable interrupt. */
           ACOMP_EnableInterrupts(DEMO_ACOMP, kACOMP_InterruptsDisable);
       #endif /*FSL_FEATURE_ACOMP_HAS_CTRL_INTENA*/
           /* Configure ACOMP negative and positive input channels. */
           ACOMP_SetInputChannel(DEMO_ACOMP, DEMO_ACOMP_POSITIVE_INPUT, DEMO_ACOMP_NEGATIVE_INPUT);

           /* Configure internal voltage ladder. */
           ladderConfigStruct.ladderValue      = 15U;                          
           /* Half of reference voltage. */
           ladderConfigStruct.referenceVoltage = kACOMP_LadderRefVoltagePinVDD;
           /* VDDA as the reference voltage. */
           ACOMP_SetLadderConfig(DEMO_ACOMP, &ladderConfigStruct);

           while (true)
           {
               /* Check the comparison result and sets the LED state according to the result.*/
               if (ACOMP_GetOutputStatusFlags(DEMO_ACOMP))
               {
                   LED_RED_ON();
               }
               else
               {
                   LED_RED_OFF();
               }
           }
       }


代码介绍及演示效果

       1. 使用轮询方式去查询模拟比较器的状态标志位并控制 LED 灯的亮灭

       2. 比较器的正输入端为 Voltage ladder output,在程序里面我们将其设置为参考电压的一半,大约为 1.65V 。

       3. 比较器的负输入端为 ACMPI3,即为 PIO014 这个 IO 口。


如下图所示:

        1. 当比较器的负输入端接 GND 时,正输入端电压大于负输入端,比较器的状态值为 1,红灯亮

        2. 当比较器的负输入端接3V 时,正输入端电压小于负输入端,比较器的状态值为 0,红灯灭



          


           

 

 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★博文作者未开放评论功能