0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文分享MM32F0140 COMP的学习笔记

科技观察员 来源:灵动MM32 MCU 作者:灵动小姐姐 2022-04-15 14:51 次阅读

COMP简介

COMP作为比较器,可用于比较模拟输入电压,并集成数字滤波器,其结果可输出至I/O口或定时器

MM32F0140的COMP包含连接外部输入的COMP正相通道1 ~ 4,连接CRV及其他外部输入的COMP反相输入通道1 ~ 4;支持多种速率和功耗,支持比较结果的滤波功能,支持通过外部事件将CPU从睡眠和停机模式唤醒,带有轮询功能。

COMP的功能框图如图1所示,COMP存在多个正相输入与多个反相输入通道,正相输入可从各外部引脚之间选取,反相输入可从外部引脚或者CRV电压分压值,CRV的电压可选择VDDA或者内部参考电压(VREFINT)的分压。当正相输入电压高于反相输入电压,输出比较结果为高输出,当正相输入电压低于反相输入电压,输出比较结果为低输出,比较结果可输出至定时器或I/O口。

pYYBAGJZFdOAB9WZAAEJvDTuQ44184.png

图1.COMP功能框图

COMP配置

COMP的配置包含关于输出滤波、迟滞电压、输出极性、输出方向选择、正相输入选择、反相输入选择、功耗选择及比较器工作模式选择,其中在使用I/O端口用作比较器输入时,需配置对应引脚为模拟输入模式;比较器也具有锁定机制,可保证比较器的设置不会被无效寄存器访问或因程序计数器破坏而改变。

迟滞电压

迟滞电压能够防止噪声干扰,保证系统工作更加稳定,可通过操作比较器控制状态寄存器(COMPx_CSR)的HYST位,对迟滞电压进行配置。迟滞电压可配置为:90mV(HYST[1:0]=11)、30mV(HYST[1:0]=10)、15mV(HYST[1:0]=01)、0mV(HYST[1:0]=00)。

输出极性

输出极性用于设置输出为同相输出或反相输出,操作比较器控制状态寄存器(COMPx_CSR)的POL位,POL配置为1则为反相输出,POL位配置为0则为同相输出。

输出方向

通过操作比较器控制状态寄存器(COMPx_CSR)的OUT_SEL位,可配置输出结果到特定的定时器中,COMP输出方向列表如图2所示。

poYBAGJZFd6AGxsDAADleJ36XM4638.png

图2.COMP输出方向

正相输入

操作比较器控制状态寄存器(COMPx_CSR)的INP_SEL位,可对比较器的正相输入信号源进行选择,共有4种信号源,正相通道如图3所示。

正相通道0 COMPx_INP0(INP\_SEL[1:0]=00)

正相通道1 COMPx_INP1(INP\_SEL[1:0]=01)

正相通道2 COMPx_INP2(INP\_SEL[1:0]=10)

正相通道3 COMPx_INP3(INP\_SEL[1:0]=11)

poYBAGJZFeOAFCulAADDSL61jw4512.png

图3.COMP正相输入

反相输入

操作比较器控制状态寄存器(COMPx_CSR)的INM_SEL位,可对比较器的反相输入信号源进行选择,部分反相通道如图4所示。

反相通道0 COMPx_INM0(INM\_SEL[2:0]=000)

反相通道1 COMPx_INM1(INM\_SEL[2:0]=001)

反相通道2 COMPx_INM2(INM\_SEL[2:0]=010)

反相通道3 COMPx_INM3(INM\_SEL[2:0]=011)

反相通道4 COMPx_INM4(INM\_SEL[2:0]=100)

poYBAGJZFeiAdA6zAADykUg2zIA615.png

图4.COMP反相输入

功耗模式

在具体应用中,可通过调整比较器功耗和响应时间得到最优的结果,功耗模式共包含四种,能够通过软件操作比较器控制状态寄存器(COMPx_CSR)的MODE位进行功耗设置。

高速/高功耗(MODE[1:0]=00)

中速/中等功耗(MODE[1:0]=01)

低速/低功耗(MODE[1:0]=10)

极低速/极低功耗(MODE[1:0]=11)

输出滤波

操作比较器控制状态寄存器(COMPx_CSR)的OFLT位,可进行输出滤波的配置,若比较结果保持n个时钟周期不变,则输出有效,“n”为图5中所例举的时钟周期数。

pYYBAGJZFe6APMKDAAEtJh66W50775.png

图5.输出滤波配置

工作模式

普通工作模式

COMP的输入通道可以在普通工作模式下通过软件选择,配置比较器控制状态寄存器(COMPx_CSR)的INP_SEL位和INM_SEL位选择正相输入与反相输入,将COMPx_CSR寄存器的EN位置1,使能比较器,COMP比较所选择的INP和INM端口上的信号,比较结果存放于COMPx_CSR寄存器的OUT位。若在配置COMP的INM_SEL位时选择CRV,则需要配置比较器外部参考电压寄存器(COMP_CRV)的CRV_SEL位,然后将CRV_EN置位。

轮询工作模式

COMP可以在轮询工作模式下通过硬件轮询的方式分时监测多个通道的比较结果,配置比较器轮询寄存器(COMPx_POLL)的PER1OD位来选择所需要的轮询等待周期,配置F1XN位决定INM端口的信号是否跟随INP端口轮询变化,配置POLL_CH位决定所需要轮询的通道是1/2/3 或者1/2,POLL_EN位置1启动轮询功能,再配置COMPx_CSR寄存器的EN位,使比较器开始上电工作,轮询比较的结果存放于COMPx\_POLL寄存器的POUT位,其中POUT[2]、POUT[1]、POUT[0]位分别存放轮询通道3/2/1的比较结果。

锁定机制

为使比较器设置不会被无效寄存器访问或因程序计数器破坏而改变,可将比较器控制状态寄存器设置为写保护。操作比较器控制状态寄存器(COMPx_CSR)的LOCK位置1,使比较器锁定,整个COMPx_CSR寄存器变成只读,该位可由系统复位清零。

实验

本实验使用COMP的0号比较器,将正相输入通道0与反相输入通道0进行比较,通过串口打印当前的比较状态。配置比较器控制状态寄存器的OFLT位,设置为若比较结果保持4个时钟周期不变,则输出有效;配置HYST位使迟滞电压为90mV,配置POL位使输出极性为同相输出,配置OUT_SEL位为0使输出结果不进入任何TIM,配置INP_SEL与INM_SEL位选择正相输入通道0与反相输入通道0,配置MODE位使功耗为高速/高功耗;通过EN位置位使能COMP,给予正相输入通道与反相输入通道电压,通过串口观察比较结果

启用COMP外设时钟 enable_clock()

实验使用COMP进行正相输入电压与反相输入电压对比,采用串口打印的方式观察实验结果,所使用的引脚均属于GPIOA组,因此需要启用COMP、UART1及GPIOA的外设时钟。

void enable_clock()
{
    /* Enable COMP clock. */
    RCC->APB2ENR |= RCC_APB2_PERIPH_COMP;
    /* Enable GPIOA clock. */
    RCC->AHB1ENR |= RCC_AHB1_PERIPH_GPIOA;
    /* Enable UART1 clock. */
    RCC->APB2ENR |= RCC_APB2_PERIPH_UART1;
}

配置引脚 pin_init()

配置COMP的正相输入通道0与反相输入通道0所对应的引脚,正相通道0的对应引脚为PA1,反相通道0的对应引脚为PA5,模式配置为模拟输入;由于实验现象通过串口显示,故配置UART的TX(PA9)与RX(PA10)引脚。

void pin_init()
{
    /* PA1 - COMP PInput_0. */
    GPIOA->CRL &= ~GPIO_CRL_MODE1_MASK;
    GPIOA->CRL |= GPIO_CRL_MODE1(GPIO_PinMode_In_Analog); /* PA1 Analog input. */

    /* PA5 - COMP NInput_0. */
    GPIOA->CRL &= ~GPIO_CRL_MODE5_MASK;
    GPIOA->CRL |= GPIO_CRL_MODE5(GPIO_PinMode_In_Analog); /* PA5 Analog input. */

    /* Setup PA9, PA10. */
    GPIOA->CRH &= ~GPIO_CRH_MODE9_MASK;
    GPIOA->CRH |= GPIO_CRH_MODE9(GPIO_PinMode_AF_PushPull);     /* PA9 multiplexed push-pull output. */
    GPIOA->AFRH &= ~GPIO_AFRH_AFR_MASK;
    GPIOA->AFRH |= (GPIO_AF_1 << GPIO_CRH_MODE9_SHIFT);   /* Use AF1. */
    
    GPIOA->CRH &= ~GPIO_CRH_MODE10_MASK;
    GPIOA->CRH |= GPIO_CRH_MODE10(GPIO_PinMode_In_Floating);     /* PA10 floating input. */
    GPIOA->AFRH |= (GPIO_AF_1 << GPIO_CRH_MODE10_SHIFT);    /* Use AF1. */
}

UART初始化 uart_init()

初始化UART,配置时钟频率、波特率、数据长度、停止位、传输模式及是否使用校验。

void uart_init()
{
    /* Clear the corresponding bit to be used. */
    UART1->CCR &= ~( UART_CCR_PEN_MASK | UART_CCR_PSEL_MASK | UART_CCR_SPB0_MASK | UART_CCR_SPB1_MASK | UART_CCR_CHAR_MASK );
    UART1->GCR &= ~( UART_GCR_AUTOFLOWEN_MASK | UART_GCR_RXEN_MASK | UART_GCR_TXEN_MASK );
    /* WordLength. */
    UART1->CCR |= UART_CCR_CHAR_MASK;
    /* XferMode. */
    UART1->GCR |= (UART_XferMode_RxTx << UART_GCR_RXEN_SHIFT);
    /* Setup baudrate, BOARD_DEBUG_UART_FREQ = 48000000u, BOARD_DEBUG_UART_BAUDRATE = 9600u. */
    UART1->BRR = (BOARD_DEBUG_UART_FREQ / BOARD_DEBUG_UART_BAUDRATE) / 16u;
    UART1->FRA = (BOARD_DEBUG_UART_FREQ / BOARD_DEBUG_UART_BAUDRATE) % 16u;
    /* Enable UART1. */
    UART1->GCR |= UART_GCR_UARTEN_MASK;
}

COMP初始化 comp_init()

实验使用COMP的0号比较器,操作比较器控制状态寄存器(COMP1_CSR),配置输出滤波、迟滞电压、输出极性、输出方向选择、正相输入通道、反相输入通道及功耗模式。

void comp_init()
{
    /* Output filter. */
    COMP->CSR[0] |= COMP_CSR_OFLT(COMP_OutFilter_4);  /* If the comparison result remains unchanged for four clock cycles, the output is valid. COMP_OutFilter_4 = 2. */
    /* Hysteresis. */
    COMP->CSR[0] |= COMP_CSR_HYST(COMP_Hysteresis_Alt3);  /* 90mV, COMP_Hysteresis_Alt3 = 3. */
    /* No invert output. */
    COMP->CSR[0] |= COMP_CSR_POL(false);  /* In-phase output. */
    /* Not output to other peripheral input. */
    COMP->CSR[0] |= COMP_CSR_OUTSEL(COMP_OutMux_None);  /* COMP_OutMux_None = 0. */
    /* Positive side. */
    COMP->CSR[0] |= COMP_CSR_INPSEL(COMP_InMux_Alt0);  /* COMP_INP[0], PA1, COMP_InMux_Alt0 = 0. */
    /* Inverse side. */
    COMP->CSR[0] |= COMP_CSR_INMSEL(COMP_InMux_Alt0);   /* COMP_INM[0], PA5, COMP_InMux_Alt0 = 0. */
    /* The faster the speed, the higher the power consumption. */
    COMP->CSR[0] |= COMP_CSR_MODE(COMP_Speed_High);  /* COMP_Speed_High = 0, high speed, high power. */
}

main()函数

main()函数结合上述操作,通过读取比较器控制状态寄存器(COMP_CSR)的OUT位,获取当前输出状态;本实验使对应引脚由杜邦线连接VCC或GND,从而给予正相输入通道与反相输入通道电压,每按下任意按键就获取一次当前输出状态,当正相输入高于反相输入,输出为高输出,串口打印"- positive";当正相输入低于反相输入,输出为低输出,串口打印"- inverse"。实验结果如图6所示,当PA1接VCC且PA5接GND时,当前输出状态为高输出,按下任意按键,串口显示"- positive";当PA1接GND且PA5接VCC时,当前输出状态为低输出,按下任意按键,串口显示"- inverse"。

void main()
{
    enable_clock();
    pin_init();
    uart_init();
    printf("comp_basic example.\r\n");
    comp_init();
    printf("press any key to get compare result ...\r\n");

    while (1)
    {
        getchar();
        if ( 0u != ( COMP_CSR_OUT_MASK & COMP->CSR[0] ) )
        {
            printf("- positive.\r\n"); /* The positive input voltage is higher than the negative input voltage. */
        }
        else
        {
            printf("- inverse.\r\n");  /* The positive input voltage is lower than the negative input voltage. */
        }
    }
}

poYBAGJZFlOAJESuAAB0ol2S0MQ762.png

图6.实验结果

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 比较器
    +关注

    关注

    14

    文章

    1633

    浏览量

    107096
  • MM32
    +关注

    关注

    1

    文章

    106

    浏览量

    744
收藏 人收藏

    评论

    相关推荐

    MM32F5270】Keil开发环境搭建

    本文是对MM32F5270相关的灵动官网资料和社区现有几篇环境搭建帖的整理和总结。详细且完整的记录了——如何从零搭建MM32F5270 Keil开发环境以及如何编译运行MM32F5270 SDK中
    的头像 发表于 11-06 16:14 2613次阅读
    【<b class='flag-5'>MM32F</b>5270】Keil开发环境搭建

    buck电路环路补偿中comp电容电阻起什么作用

    环路补偿是开关电源设计中的关键环节,它确保了电源的稳定性和响应速度。在Buck转换器中,环路补偿通常涉及到补偿网络,该网络由个补偿电容(Comp电容)和个补偿电阻(Comp电阻)组
    的头像 发表于 09-12 16:04 835次阅读

    测试UCC2808的误差放大器开环增益,当在COMP上施加电压comp会出现梯形的波,怎么解决?

    我的需要测试PWM芯片UCC2808的误差放大器开环增益,其误差放大器正向端在芯片内部接了2V电压,输出端COMP同时还是PWM输入,反相端为FB。当在COMP上施加电压comp会出现梯形的波,电压越大,梯形面积越大,辅助运放
    发表于 08-29 06:46

    LM318中的COMP1 COMP2 COMP3这三个管脚有什么用,应该怎么接?

    请问下LM318中的COMP1 COMP2 COMP3这三个管脚有什么用,应该怎么样接?如果只是用于普通的跟随器是否还有必要接?求各位大神回答~谢谢啦!
    发表于 08-28 06:05

    篇:V1.5-STM32f103c8t6智能小车笔记 标准库开发 6612电机驱动新手入门项目

    这是全网最详细、性价比最高的STM32实战项目入门教程,通过合理的硬件设计和详细的视频笔记介绍,硬件使用STM32F103主控资料多方便学习,通过3万字笔记、12多个小时视频、20多章
    的头像 发表于 08-12 18:25 1486次阅读
    第<b class='flag-5'>一</b>篇:V1.5-STM32<b class='flag-5'>f</b>103c8t6智能小车<b class='flag-5'>笔记</b> 标准库开发 6612电机驱动新手入门项目

    LM318 COMP管脚是什么引脚,干什么用的?

    LM318 COMP 管脚是什么引脚,干什么用的,PSPICEFORTI 里面没有318的COMP管脚在怎么应用
    发表于 07-31 07:45

    小度发布首款百度心大模型学习

    近日,小度科技推出了款基于心大模型的学习机——小度学习机Z30。这款学习机针对学习计划、诊断
    的头像 发表于 05-29 09:10 731次阅读

    CoMP多点协同技术外场应用

    当前5G同频组网场景多,且普遍采用多天线技术,小区间交叠覆盖大,交叠区存在较大的同频干扰,影响用户感知。同时在小区边缘,用户上行性能受限,导致网络体验偏差。多点协同(CoMP
    的头像 发表于 05-24 08:05 374次阅读
    <b class='flag-5'>CoMP</b>多点协同技术外场应用

    STM8L151内部比较器COMP1怎么用?为什么唤醒不了?

    如题,使用STM8L151G4U6的COMP1作为比较器检测外部输入电压是否高于内部参考1.24V的时候,在单片机没有休眠的情况下,可以正常触发中断,也可以读取比较器输出结果,但是旦单片机进入
    发表于 04-24 07:13

    跟优秀的人,学习笔记!文末有看海的点评

    很多同学私信我,说自己学习时不会记笔记,要么是记录的非常潦草,没有保留有效信息。要么是把所有信息都抄到笔记本上,结果变成了抄书,自己都不想看。 我们学习时,怎么高效记录
    的头像 发表于 03-22 18:19 1141次阅读
    跟优秀的人,<b class='flag-5'>学习</b>记<b class='flag-5'>笔记</b>!文末有看海的点评

    allegro学习笔记

    电子发烧友网站提供《allegro学习笔记.zip》资料免费下载
    发表于 02-29 09:14 1次下载

    ElfBoard学习笔记分享

    与独特视角。今天就跟大家分享篇共创官学习笔记,共同见证携手进步的真实写照:本篇文章来源于ElfBoard的首批共创官oo,感谢分享!最近很荣幸能够参加飞凌嵌入式举
    的头像 发表于 01-06 16:56 409次阅读
    ElfBoard<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>分享

    LTM4625 comp FB管脚增加电容导致输出电压过大是什么原因?

    LTM4625电源芯片在COMP和FB管脚同时增加10nF电容,会导致FB电压升高到0.7V左右,导致输出电压增大,COMP和FB管脚,单独加电容电压正常,这是什么原因
    发表于 01-05 07:46

    51单片机中断学习笔记

    51单片机中断学习笔记
    发表于 12-05 12:13

    如何在压缩器中获取In、 OUT和Comp级别?

    如何在压缩器中获取 In、 OUT 和 Comp 级别? MCU 可以通过它们的参数添加器读取值 ?
    发表于 11-28 06:10