TMS320F280049C 学习笔记16 比较器子系统(CMPSS)

文章目录

  • 概述
  • 关键模块
    • 1. 参考DAC
    • 2. 斜坡发生器
    • 3. 数字滤波器
  • 例程
    • CMPSS Asynchronous Trip
    • CMPSS Digital Filter Configuration
  • 参考文献

新一代DSP添加的功能,不是很熟悉,先参考手册和例程学习,之后结合具体项目再补充。

概述

比较器子系统(Comparator Subsystem, CMPSS)由模拟比较器和支持电路组成,可用于峰值电流模式控制、开关电源、功率因数校正、电压跳闸监测等应用。
每个CMPSS包含两个比较器、两个12位DAC参考、两个数字滤波器和一个斜坡发生器。比较器在每个模块中表示为“H”或“L”,其中“H”和“L”分别表示高和低。每个比较器产生一个数字输出,指示正输入端的电压是否大于负输入端的电压。比较器的正输入由外部引脚或PGA驱动,负输入可由外部引脚或可编程参考12位DAC驱动。每个比较器输出通过一个可编程的数字滤波器,可以消除假跳闸信号。如果不需要滤波,也可以使用未滤波的输出。一个可选的斜坡发生器电路可用于控制高比较器的12位参考DAC值。
TMS320F280049C 学习笔记16 比较器子系统(CMPSS)_第1张图片

关键模块

1. 参考DAC

每个参考12位DAC都有两组DACxVAL寄存器,即DACxVALA和DACxVAL。DACxVALA是一个只读寄存器,它直接控制12位DAC值。DACxVALS是一个可写的影子寄存器,可以立即加载到DACxVALA中,也可以与下一个EPWMSYNCPER事件同步。高参考12位DAC(DACH)可以选择从斜坡发生器而不是DACHVALS获取其DACHVALA值。
参考12位DAC的工作范围由DACREF和VSSA限定。默认情况下,高压参考电压为VDDA,但可以配置为VDAC。参考12位DAC如图16-3所示。
TMS320F280049C 学习笔记16 比较器子系统(CMPSS)_第2张图片

2. 斜坡发生器

有点复杂,暂时用不到,未来再学。

3. 数字滤波器

数字滤波器在从输入端采集的FIFO采样(SAMPWIN)窗口上工作。滤波器输出为采样窗口内的多数值,其中多数由阈值(THRESH)定义。如果不满足阈值,则滤波器输出保持不变。
THRESH的值必须被设置为大于SAMPWIN/2并且小于或等于SAMPWIN。
预分频(CLKPRESCALE)决定了滤波器的采样率,滤波器的FIFO在每个分频后时钟采样一次。FIFO中的旧数据将被丢弃。
注意,对于SAMPWIN、THRESH和CLKPRESCALE,数字滤波器使用的内部数字在所有情况下都是+1。实际上,samples=SAMPWIN+1,threshold=THRESH+1,prescale=CLKPRESCALE+1。
TMS320F280049C 学习笔记16 比较器子系统(CMPSS)_第3张图片

例程

提供了2个例程,位置在
C:\ti\c2000\C2000Ware_3_01_00_00\driverlib\f28004x\examples\cmpss

CMPSS Asynchronous Trip

此示例启用CMPSS1 COMPH比较器,并将异步CTRIPOUTH信号馈送至GPIO14/OUTPUTXBAR3引脚,CTRIPH馈送至GPIO15/EPWM8B。CMPSS配置为生成跳闸信号以跳闸EPWM信号。CMPIN1P用于提供正输入,内部DAC配置为提供负输入。内部DAC配置为在VDD/2上提供信号。EPWM信号在GPIO15处生成,配置为由CTRIPOUTH触发。

  • 当向CMPIN1P提供低输入(VSS)时,跳闸信号(GPIO14)输出为低;
  • 当向CMPIN1P提供高输入(高于VDD/2)时,跳闸信号(GPIO14)输出变为高,PWM8B(GPIO15)被跳闸,并输出高。

外部连接:向CMPIN1P提供模拟输入电平,该引脚与ADCINB6共享;用示波器观察GPIO14和GPIO15的输出。

这段代码的配置用到了ePWM的DC模块,先做记录,过几天再看。

#include "driverlib.h"
#include "device.h"

//
// Function Prototypes
//
void initCMPSS(void);
void initEPWM(void);

//
// Main
//
void main(void)
{
    //
    // Initialize device clock and peripherals
    //
    Device_init();

    //
    // Disable pin locks and enable internal pullups.
    //
    Device_initGPIO();

    //
    // Initialize PIE and clear PIE registers. Disables CPU interrupts.
    //
    Interrupt_initModule();

    //
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    //
    Interrupt_initVectorTable();

    //
    // Set up COMP1H
    //
    initCMPSS();

    //
    // Set up ePWM8 to take CTRIPH as TRIP4 for its DC trip input
    //
    initEPWM();

    //
    // Configure GPIO14 to output CTRIPOUT1H (routed through XBAROUTPUT3) and
    // GPIO15 to output CTRIPH (routed through ePWM TRIP4 and ePWM8)
    //
    GPIO_setPinConfig(GPIO_14_OUTPUTXBAR3);
    GPIO_setPinConfig(GPIO_15_EPWM8B);

    //
    // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
    //
    EINT;
    ERTM;

    //
    // Loop indefinitely
    //
    while(1)
    {
        //
        // Trip flag is set when CTRIP signal is asserted
        //
        if((EPWM_getTripZoneFlagStatus(EPWM8_BASE) &
            EPWM_TZ_FLAG_OST) != 0U)
        {
            //
            // Wait for comparator CTRIP to de-assert
            //
            while((CMPSS_getStatus(CMPSS1_BASE) & CMPSS_STS_HI_FILTOUT) != 0U)
            {
                ;
            }

            //
            // Clear trip flags
            //
            EPWM_clearTripZoneFlag(EPWM8_BASE, EPWM_TZ_INTERRUPT |
                                   EPWM_TZ_FLAG_OST);
        }
    }
}


// 初始化CMPSS 设置CMPSS1的高侧比较器
void initCMPSS(void)
{
    // 使能CMPSS,设置负输入为DAC
    CMPSS_enableModule(CMPSS1_BASE);
    CMPSS_configHighComparator(CMPSS1_BASE, CMPSS_INSRC_DAC);

    // 使用VDDA作为DAC的参考值,并将参考值设置为一半
    CMPSS_configDAC(CMPSS1_BASE, CMPSS_DACREF_VDDA | CMPSS_DACVAL_SYSCLK |
                    CMPSS_DACSRC_SHDW);
    CMPSS_setDACValueHigh(CMPSS1_BASE, 2048);

    // 设置输出信号,CTRIPH 和 CTRIPOUTH 都将由异步比较器输出
    CMPSS_configOutputsHigh(CMPSS1_BASE, CMPSS_TRIP_ASYNC_COMP |
                            CMPSS_TRIPOUT_ASYNC_COMP);

    // 设置输出X-Bar: CTRIPOUTH on OUTPUTXBAR3
    XBAR_setOutputMuxConfig(XBAR_OUTPUT3, XBAR_OUT_MUX00_CMPSS1_CTRIPOUTH);
    XBAR_enableOutputMux(XBAR_OUTPUT3, XBAR_MUX00);
}

//
// initEPWM - Function to configure ePWM8 and the ePWM X-BAR to take CTRIPH as
//            the DC trip input
//
void initEPWM(void)
{
    // 在设置模块之前关闭ePWM时钟
    SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

    //
    // 设置时钟预分频为 /1
    //
    EPWM_setClockPrescaler(EPWM8_BASE, EPWM_CLOCK_DIVIDER_1,
                           EPWM_HSCLOCK_DIVIDER_1);

    // 为ePWM计数器赋初值
    EPWM_setTimeBaseCounter(EPWM8_BASE, 0);
    EPWM_setTimeBasePeriod(EPWM8_BASE, 0xFFFF);

    // 设置比较器值
    EPWM_setCounterCompareValue(EPWM8_BASE, EPWM_COUNTER_COMPARE_B, 0x8000);

    // 设置动作
    EPWM_setActionQualifierAction(EPWM8_BASE,
                                  EPWM_AQ_OUTPUT_B,
                                  EPWM_AQ_OUTPUT_HIGH,
                                  EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);

    EPWM_setActionQualifierAction(EPWM8_BASE,
                                  EPWM_AQ_OUTPUT_B,
                                  EPWM_AQ_OUTPUT_LOW,
                                  EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);

    // 设置ePWM8B在TZB事件时输出高
    EPWM_setTripZoneAction(EPWM8_BASE, EPWM_TZ_ACTION_EVENT_TZB,
                           EPWM_TZ_ACTION_HIGH);


    // 当DCNH为高时触发的事件
    // Trigger event when DCBH is high
    EPWM_setTripZoneDigitalCompareEventCondition(EPWM8_BASE,
                                                 EPWM_TZ_DC_OUTPUT_B1,
                                                 EPWM_TZ_EVENT_DCXH_HIGH);

    // 设置TRIP4作为DCBH的输入
    EPWM_enableDigitalCompareTripCombinationInput(EPWM8_BASE,
                                                  EPWM_DC_COMBINATIONAL_TRIPIN4,
                                                  EPWM_DC_TYPE_DCBH);

    // 设置DCB为一次性的 OST
    EPWM_enableTripZoneSignals(EPWM8_BASE, EPWM_TZ_SIGNAL_DCBEVT1);

    // 设置DCB的路径为异步非滤波
    EPWM_setDigitalCompareEventSource(EPWM8_BASE,
                                      EPWM_DC_MODULE_B,
                                      EPWM_DC_EVENT_1,
                                      EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL);

    // 同步ePWM时基
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

    // 设置TRIP4 为 CTRIP1H,使用ePWM X-Bar
    XBAR_setEPWMMuxConfig(XBAR_TRIP4, XBAR_EPWM_MUX00_CMPSS1_CTRIPH);
    XBAR_enableEPWMMux(XBAR_TRIP4, XBAR_MUX00);

    // 清除trip标志位
    EPWM_clearTripZoneFlag(EPWM8_BASE, EPWM_TZ_INTERRUPT |
                           EPWM_TZ_FLAG_OST);

    // 增计数模式
    EPWM_setTimeBaseCounterMode(EPWM8_BASE, EPWM_COUNTER_MODE_UP);
}

CMPSS Digital Filter Configuration

此示例启用CMPSS1 COMPH比较器,并将输出通过数字滤波器馈送到GPIO14/OUTPUTXBAR3引脚。CMPIN1P用于提供正输入,内部DAC配置为提供负输入。内部DAC配置为在VDD/2上提供信号。

  • 当向CMPIN1P提供低输入(VSS)时,跳闸信号(GPIO14)输出为低;
  • 当向CMPIN1P提供高输入(高于VDD/2)时,跳闸信号(GPIO14)输出变为高,

参考文献

  1. DSP TMS320F280049之模拟比较器CMPSS(寄存器版)
  2. CMPSS(模拟比较器)模块学习

你可能感兴趣的:(TI,DSP学习)