【TI|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值。
文章图片
关键模块 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所示。
文章图片
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。
文章图片
例程 提供了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)被跳闸,并输出高。
这段代码的配置用到了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)输出变为高,
- DSP TMS320F280049之模拟比较器CMPSS(寄存器版)
- CMPSS(模拟比较器)模块学习