国产MCU学习Day10——CW32F030C8T6模拟电压比较器全解析

发布于:2025-07-08 ⋅ 阅读:(10) ⋅ 点赞:(0)

每日更新教程,评论区答疑解惑,小白也能变大神!"

目录

一.CW32F030C8T6 模拟电压比较器(VC)概述

二.案例-VC模块的输出信号上升沿/下降沿触发中断功能。

关键点


一.CW32F030C8T6 模拟电压比较器(VC)概述

1.1概述

  • CW32x030 内部集成 2 个模拟电压比较器(VC),用于比较两路模拟输入电压,并将比较结果从引脚输出。电压 比较器的正端输入支持多达 8 路外部模拟输入,负端既支持 8 路外部模拟输入,又支持内部电压基准、内部电阻 分压器、内部温度传感器等电压参考。比较结果输出具有滤波功能、迟滞窗口功能,以及极性选择。支持比较中断, 可用于低功耗模式下唤醒 MCU。

1.2主要特性

  • 双路的模拟电压比较器 VC1、VC2
  • 内部 64 阶电阻分压器
  • 多达 8 路外部模拟信号输入
  • 4 路片内模拟输入信号: ‒ 内置电阻分压器输出电压 ‒ 内置温度传感器输出电压 ‒ 内置 1.2V 基准电压 ‒ ADC 参考电压
  • 可选择输出极性
  • 支持迟滞窗口比较功能
  • 可编程的滤波器和滤波时间
  • 3 种中断触发方式,可组合使用: ‒ 高电平触发 ‒ 上升沿触发 ‒ 下降沿触发
  • 支持低功耗模式下运行,中断唤醒 MCU

1.3 功能框图

1.3输入输出引脚

  • 模拟电压比较器支持 8路外部模拟信号输入,用户必须将对应 GPIO端口配置为模拟功能(GPIOx_ANALOG.PINy = 1)。 模拟电压比较器支持将比较结果从引脚输出,用户必须将对应 GPIO 端口配置为数字输出,同时选择功能复用。 VC1、VC2 支持的输入输出引脚如下表所示:

1.4延迟 / 响应时间

  • 设置控制寄存器 VCx_CR0 的 EN 位域为 1,使能 VC 模块。
  • 从 VC 使能或 VC 的正负两端输入电压变化,到电压比较器输出正确比较结果的时间,被定义为比较器的延迟 / 响 应时间。延迟 / 响应时间由控制寄存器 VCx_CR0 的 RESP 位域配置,响应时间值从 200ns 到 20μs 四档可调,且 响应时间越短,VC 模块的功耗越大。

1.5极性选择

  • 电压比较器 VC1、VC2 的输出信号的极性,由控制寄存器 VCx_CR0 的 POL 位域设置:
  • POL 为 1,VCx_OUTP 信号与 VCx_OUTA 信号极性相反,即正端大于负端时 VCx 输出低电平。
  • POL 为 0,VCx_OUTP 信号与 VCx_OUTA 信号极性相同,即正端大于负端时 VCx 输出高电平。

1.6数字滤波

  • 电压比较器内置的数字滤波器,用于对电压比较器的输出信号进行数字滤波,由控制寄存器 VCx_CR1 的 FLTEN 位域控制,FLTEN 为 1 使能数字滤波,FLTEN 为 0 禁止数字滤波。用户可使用滤波功能过滤系统噪声,比如马达 停止时的大电流噪声等,避免比较器的噪声输出引起系统的误动作。 数字滤波器的时钟由控制寄存器 VCx_CR1 的 FLTCLK 位域选择:
  • FLTCLK 为 1,使用 PCLK 作为滤波时钟。
  • FLTCLK 为 0,使用内置 RC 振荡器时钟作为滤波时钟,其频率约 150kHz。 数字滤波器的滤波宽度由控制寄存器 VCx_CR1 的 FLTTIME 位域选择,滤除宽度小于一定时钟周期的信号,有 8 级滤波宽度可选择。 电压比较器经数字滤波后的输出电平,可通过状态寄存器 VCx_SR 的 FLTV 位域读出。 当用户设置了 VCx_OUT 引脚为数字输出,且选择 VC 比较输出的复用功能时,VCx_OUT 引脚将输出电压比较器 经数字滤波后的输出电平。 VC 的滤波响应波形,如下图所示:

  • 电压比较器的输出可以作为高级定时器 (ATIM) 的 BK 刹车输入或 OCREF_CLR 输入,分别由控制寄存器 VCx_CR1 的 ATIMBK 和 ATIMCLR 位域控制,关于 BK 和 OCREF_CLR 的详细介绍请参见 15 高级定时器(ATIM)章节。此功 能通常应用于电机保护场合,详细请参考相关应用笔记。

1.7迟滞功能

  • 模拟电压比较器支持迟滞功能,使用迟滞功能后,比较器的输出结果不会随输入信号的变化而立即翻转,而是在 两路输入信号的偏移值高于或低于迟滞阈值电压后才发生翻转。
  • VC 迟滞功能波形示意图,如下图所示:
  • 迟滞功能可以有效增强芯片的抗干扰能力,避免因输入信号的小幅度抖动,导致比较器的输出端不必要的频繁翻转。 迟滞阈值电压由控制寄存器 VCx_CR0 的 HYS 位域决定,如下表所示:

1.8窗口比较功能

  • 模拟电压比较器支持窗口比较功能,可将 VC1 和 VC2 的比较结果进行异或操作后输出,由控制寄存器 VCx_CR0 的 WINDOW 位域使能。
  • WINDOW 为 1 时,VCx_OUTW 信号为 VC1_OUTP 信号与 VC2_OUTP 信号的异或值。
  • WINDOW 为 0 时,VCx_OUTW 信号与 VCx_OUTP 信号电平相同。

1.9BLANK 窗口功能

  • 在保持 VCx 模块工作的同时,如果想暂时停止电压比较功能,或者为避免某些应用系统(比如电机控制)中,被 监测信号短时间的合理波动造成电压比较器的输出电平发生不必要的翻转,本芯片的电压比较器增加了 BLANK 窗口功能,即,当指定的外部触发条件启动 BLANK 窗口时,在设定的 BLANK 窗口期内,不进行电压比较,电压 比较器的输出电平保持当前电平状态。BLANK 窗口期之后,电压比较器恢复正常工作。 BLANK 窗口持续时间,由控制寄存器 VCx_CR1 的 BLANKFLT 位域配置,
  • 窗口持续时间为 (2( BLANKFLT+2) ~ 2( BLANKFLT +2)+ 2 )个 PCLK 周期
  • 如下表所示:

  • BLANK 窗口的触发启动条件,由控制寄存器 VCx_CR1 的 BLANKCH1B、BLANKCH2B、BLANKCH3B 位域配置, 分别由 ATIM 的 CH1B、CH2B、CH3B 上升沿触发启动 BLANK 窗口。

1.10 VC 中断

  • CW32x030 的电压比较器支持在低功耗模式下工作,比较中断可将芯片从低功耗模式下唤醒。 设置控制寄存器 VCx_CR0 的 IE 位域为 1,使能 VCx 中断,产生中断时状态寄存器 VCx_SR 的中断标志位 INTF 会 被硬件置 1,用户可以向 INTF 位写 0,清除中断标志。 设置控制寄存器 VCx_CR1 的 HIGHIE、RISEIE、FALLIE 位域,可选择不同的中断触发方式:
  • HIGHIE 为 1,VCx_OUT 输出信号高电平触发中断。
  • RISEIE 为 1,VCx_OUT 输出信号上升沿触发中断。
  • FALLIE 为 1,VCx_OUT 输出信号下降沿触发中断。

1.11编程示例

  • 在此示例中,使用数字滤波功能,并配置比较中断,配置方法如下所示:
  • 步骤 1:配置 VCx_DIV.EN 为 1, 使能分压器;
  • 步骤 2:配置 VCx_DIV.DIV,设置分压系数;
  • 步骤 3:配置 VCx_CR0.INP ,选择正端待监测的电压来源;
  • 步骤 4:配置 VCx_CR0.INN,选择负端待监测的电压来源;
  • 步骤 5:配置 VCx_CR1.FLTTIME,选择滤波时间;
  • 步骤 6:配置 VCx_CR1.FLTCLK,选择滤波时钟;
  • 步骤 7:配置 VCx_CR1.FLTEN 为 1,使能 VCx 滤波;
  • 步骤 8:设置 VCx_CR1 寄存器的 HIGHIE、RISEIE、FALLIE 为 1,选择中断触发方式;
  • 步骤 9:设置 VCx_CR0.IE 为 1,使能 VCx 中断;
  • 步骤 10:设置 VCx_CR0.EN 为 1,使能 VCx;
  • 步骤 11:等待 VCx_SR.READY 标志位变为 1;
  • 步骤 12:在 VC 模块的初始化程序和 VC 模块的中断服务程序中,对 VCx_SR 的 INTF 位写入 0,清除中断标志后, 允许 VCx 中断的产生。

1.12寄存器列表

二.案例-VC模块的输出信号上升沿/下降沿触发中断功能。

VC_PortInit函数

/**
 * @brief 初始化VC模块相关GPIO引脚
 * 配置PA11作为VC输出引脚,PA0/PA1作为VC模拟输入通道
 */
void VC_PortInit(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    // 使能GPIOA时钟
    REGBITS_SET(CW_SYSCTRL->AHBEN, SYSCTRL_AHBEN_GPIOA_Msk);
    // 使能VC模块时钟
    REGBITS_SET(CW_SYSCTRL->APBEN2, SYSCTRL_APBEN2_VC_Msk);
    
    // 配置PA11为推挽输出模式(VC输出)
    GPIO_InitStructure.Pins = GPIO_PIN_11;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
    GPIO_Init(CW_GPIOA, &GPIO_InitStructure);
    
    // 将PA11复用为VC1输出功能
    PA11_AFx_VC1OUT();
    // 使能PA0作为VC通道0的正向输入(P-input)
    PA00_ANALOG_ENABLE();
    // 使能PA1作为VC通道1的负向输入(N-input)
    PA01_ANALOG_ENABLE();
}

main函数

/**
 * @brief 主程序
 * 初始化硬件并进入事件循环,通过中断触发LED状态切换
 */
int main(void)
{
    VC_InitTypeDef VC_InitStruct;
    VC_BlankTypeDef VC_BlankStruct;
    VC_OutTypeDef VC_OutStruct;
    
    // 初始化LED控制引脚
    LED_Init();
    // 初始化VC模块相关GPIO
    VC_PortInit();
    
    /* VC模块通道配置 */
    VC_InitStruct.VC_InputP = VC_InputP_Ch0;       // 正向输入选择通道0(PA0)
    VC_InitStruct.VC_InputN = VC_InputN_Bgr1P2;    // 负向输入选择内部基准1.2V
    VC_InitStruct.VC_Hys = VC_Hys_10mV;            // 设置10mV滞回电压
    VC_InitStruct.VC_Resp = VC_Resp_High;          // 高速响应模式
    VC_InitStruct.VC_FilterEn = VC_Filter_Enable;  // 使能滤波器
    VC_InitStruct.VC_FilterClk = VC_FltClk_RC150K; // 滤波器时钟源选择150K RC
    VC_InitStruct.VC_FilterTime = VC_FltTime_4095Clk; // 滤波器时间设为4095个时钟周期
    VC_InitStruct.VC_Window = VC_Window_Disable;   // 关闭窗口比较功能
    VC_InitStruct.VC_Polarity = VC_Polarity_Low;   // 输出极性为低电平有效
    VC1_ChannelInit(&VC_InitStruct);
    
    /* 空白窗口配置(抑制噪声) */
    VC1VC2_BlankInit(&VC_BlankStruct);
    VC1_BlankCfg(&VC_BlankStruct);
    
    /* 输出路由配置 */
    VC1VC2_OutInit(&VC_OutStruct);
    VC1_OutputCfg(&VC_OutStruct);
    
    /* 中断配置 */
    VC1_ITConfig(VC_IT_FALL | VC_IT_RISE, ENABLE); // 使能上升沿和下降沿中断
    VC1_EnableIrq(VC_INT_PRIORITY);                // 设置中断优先级
    VC1_ClearIrq();                                // 清除中断标志
    VC1_EnableChannel();                           // 启动VC通道
    
    // 主循环:检测中断标志并翻转PB9引脚状态
    while (1)
    {
        if (gFlagIrq)
        {
            PB09_TOG();          // 翻转PB9电平(LED状态变化)
            gFlagIrq = FALSE;    // 清除中断标志
        }
    }
}

LED_Init函数

/**
 * @brief 初始化LED控制引脚
 * 配置PB8/PB9为推挽输出模式,初始状态为低电平(LED灭)
 */
void LED_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    // 使能GPIOB时钟
    REGBITS_SET(CW_SYSCTRL->AHBEN, SYSCTRL_AHBEN_GPIOB_Msk);
    
    /* 配置PB8和PB9为推挽输出 */
    GPIO_InitStructure.Pins = GPIO_PIN_8 | GPIO_PIN_9;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
    GPIO_Init(CW_GPIOB, &GPIO_InitStructure);
    
    // 初始状态设置为低电平(LED熄灭)
    PB08_SETLOW();
    PB09_SETLOW();
}

关键点

  1. VC模块功能:代码实现电压比较器(VC)的配置,包含输入通道选择、滤波器设置、中断触发等。
  2. 中断机制:通过gFlagIrq标志位实现异步事件处理,触发LED状态变化。


网站公告

今日签到

点亮在社区的每一天
去签到