This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F280037C:软件跳闸区域示例

Guru**** 666710 points
Other Parts Discussed in Thread: TMS320F280037, C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1281883/tms320f280037c-example-of-trip-zone-by-software

器件型号:TMS320F280037C
主题中讨论的其他器件:TMS320F280037C2000WARE

您好!
 
我正在使用 TMS320F280037来控制 T 型逆变器、因为此微控制器中的 GPIO 数量有限、我需要用软件使用。

我在技术参考模块中发现 TMS320F280037支持软件强制跳闸、但没有找到任何有关如何执行该操作的示例。

此时我的代码非常大、所以我只会放一些主要部分的片段、您能帮助我在其中插入一个 ePWM1软件强制跳闸示例吗?

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

INT DUTY_CYCLE = 50;

__interrupt void ISR_ADC_A (void);// ADC 中断

int main (空)
{

InitSysCtrl ();//初始化器件时钟和外设
dint;//禁用 CPU 中断
InitPieCtrl ();//将 PIE 控制寄存器初始化为已知状态
IER = 0x0000;//禁用 CPU 中断
IFR = 0x0000;//清除所有 CPU 中断标志
InitPieVectTable();//初始化 PIE 向量表

//设置
Setup_GPIO ();//设置 GPIO
Setup_ePWM ();//设置 ePWM
Setup_ADC ();//设置 ADC

// ISR 中断
EALLOW;
PieVectTable.ADCA1_INT =&ISR_ADC_A;//将函数重定向到 ADC_A 中断
EDIS;

//启用 PIE 中断
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//为 ADC1启用第1行的第1列

// PIE 通道线路
IER |= M_INT1;

EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

while (1)
{
EPwm1Regs.CMPA.bit.CMPA = DUTY_CYCLE;
DELAY_US (5000000);

返回0;

__interrupt void ISR_ADC_A (void)
{
DUTY_CYCLE = DUTY_CYCLE+1;


AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;//清除 PIEIFR

void Setup_GPIO (void)
{
EALLOW;

//PWM 1
GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0;//选择 PWM 的 GMUX 1A
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;//选择 PWM 的多路复用器1A
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;//禁用 PWM 的上拉电阻1A

GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 0;//选择 PWM 的 GMUX 1B
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;//选择 PWM 1B 的多路复用器
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;//禁用 PWM 的上拉电阻1B

EDIS;

void Setup_ePWM (void)
{
EALLOW;//允许版本
CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;//启用 ePWM1
CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;//启用 ePWM2
CpuSysRegs.PCLKCR2.bit.EPWM3 = 1;//启用 ePWM3
CpuSysRegs.PCLKCR2.bit.EPWM4 = 1;//启用 ePWM4
CpuSysRegs.PCLKCR2.bit.EPWM5 = 1;//启用 ePWM5
CpuSysRegs.PCLKCR2.bit.EPWM7 = 1;//启用 ePWM7
CpuSysRegs.PCLKCR2.bit.EPWM8 = 1;//启用 ePWM8

CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;//开始与其他 PWM 同步

//PWM 1
EPwm1Regs.TBPRD = 1200;//设置定时器周期(120e6)/(1*2)
EPwm1Regs.TBPHS.bit.TBPHS = 0;//设置相移
EPwm1Regs.EPWMSYNCOUTEN.all = SYNC_OUT_SRC_ENABLE_ALL;
EPwm1Regs.TBCTR = 0x0000;//清除计数器
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数/向下计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相移
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//预分频高速时钟
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;//预分频低速时钟

EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_影子;//避免多次切换
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD;//刷新三角波顶部和底部的占空比
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADANDBY;//模块 B 也是如此
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_Zero_PRD;//对于模块 B 也是如此

EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//有效高电平互补
EPwm1Regs.DBCTL.bit.out_mode = DB_FULL_ENABLE;//启用死区时间模块
EPwm1Regs.DBFED.bit.DBFED = 0;//下降死区时间(0.5us)
EPwm1Regs.DBRED.bit.DBRED = 0;//上升死区时间(0.25us)

EPwm1Regs.AQCTLA.bit.PRD = AQ_NO_ACTION;//实现 PRD 值时采取的操作(在这种情况下无操作)
EPwm1Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION;//实现零值时采取操作(在这种情况下无操作)
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//实现计数器递增值时执行操作(在这种情况下清除)
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;//实现计数器递减值时执行(在这种情况下设置)

EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用模块 A 的转换开始
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_PRDZERO;//ADC 触发在顶部
EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST;//在第一个偶数上触发

//结束设置
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;//结束与其他 PWM 的同步
EDIS;//结束版本

void Setup_ADC (void)
{

//
//将 VREF 设置为内部
//
SetVREF (ADC_ADCA、ADC_INTERNAL、ADC_VREF3P3);

uint16 acqps;
//根据分辨率确定最小采集窗口(在 SYSCLKS 中)
Acqps = 26;

//ADC_A
EALLOW;
CpuSysRegs.PCLKCR13.bit.adc_a = 1;//开启 ADC A 模块
AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;//将脉冲位置设置为较晚
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;//为 ADC 加电
DELAY_US (1000);// 1ms 延迟以允许 ADC 上电时间


//ADC_IN_A0
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;//引脚 A0选择
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//模拟窗口(在本例中为27个 SYSCLK 周期)
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 0x05;// ePWM1A 将负责触发 ADC

AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除

EDIS;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jonas:
    感谢您的联系。

    看起来您想要为跳闸区域模块使用软件强制信号。 请参阅 C2000 ware  文件中的示例1:ePWM 跳闸区域:epwm_ex1_trip_zone.c 开始。
    为了更好地理解- 让软件强制跳闸以生成中断或也对 EPWM 输出采取措施的主要原因是什么?

    您可以使用跳闸区域强制寄存器(TZFRC)并 通过软件强制一次性跳闸事件/DC 比较事件。 在 EPWMxA 和 EPWMxB 输出上立即执行 TZCTL[TZA]和 TZCTL[TZB]位指定的操作。 TripZone 使能中断寄存器(TZEINT)、用于为打算使用或强制从软件使用的特定跳闸信号启用中断。

    -此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Prarthan Bhatt、

    谢谢回答。

    我需要软件强制跳闸、因为我使用的 T 型逆变器将收到一条命令、通过 CAN 通信开始切换。 我无法通过 GPIO 收到此命令、因为它们都已用于其他函数。 CAN 通信接收到的命令是一个逻辑值、我将其放入一个变量中、例如"int enable"。 我需要的是、当变量 enable 中的逻辑值为高电平时、PWM 开始切换、当变量中的逻辑值为低电平时、所有 PWM 都被禁用。

    我找到了您告诉我的 基于 GPIO 跳闸的示例、但由于我没有太多的经验、我不知道如何使用 TZFRC、TZA、TZB、TZEINT 软件跳闸、您能给我举个例子吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jonas、

    了解了仅可以为以下输出配置软件跳闸信号、如下表所示。
    因此、在 CAN 布尔信号传入之后、您可能需要在 TZCTL 寄存器的位字段中将信号设置为高/低/高阻抗、否则执行正常的 ePWM 操作。

    好像您在遵循位域编程、如果您使用 c2000ware 中提供的 driverlib 函数、相对简单得多、请参阅文件夹位置:\driverlib\f28003x\driverlib\epwm.h 和 epwm.c 源文件

    例如,使用以下函数:

    1) EPWM_forceTripZoneEvent (uint32_t base、uint16_t tzForceEvent)是用于强制触发区域事件的函数。 您可以 对 tzForceEvent 使用 EPWM_TZ_FORCE_EVENT_OST
    根据 CAN 信号标志调用此函数
    2) EPWM_enableTripZoneInterrupt (uint32_t base、uint16_t tzInterrupt)、可在需要时根据强制跳闸事件启用中断
    使用 EPWM_TZ_INTERRUPT_OST 进行 tzInterrupt   
    3)  EPWM_setTripZoneAction (uint32_t base、EPWM_TripZoneEvent tzEvent、EPWM_TripZoneAction tzAction)
        根据应用要求使用 EPWM_TZ_ACTION_EVENT_TZA 和 EPWM_TZ_ACTION_EVENT_TZB 并设置为 EPWM_TZ_ACTION_HIGH 或 EPWM_TZ_ACTION_LOW。
    4) 4)为了确保清除 CAN 信号转换时的单触发跳闸强制、请使用 ePWM_clearTripZoneFlag (uint32_t base、uint16_t tzFlags)

    谢谢。
    Prarthan.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回答

    您说过、我将使用位域编程。 是否可以在同一个代码上使用 bitfield 编程和 driverlib 函数?

    谢谢。

    Jonas。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jonas:

    可以同时使用 driverlib 函数和位字段、只需具有工程所需的正确函数声明和头文件即可。
    有关更多详细信息、请参阅该主题:https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1107136/tms320f28388d-base-projects-with-driverlib-and-bitfield-support-for-all-cpus

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Prarthan,您好!

    感谢您的回答。 我将在本周内尝试这样做、如果我有其他问题、我将在这里提出、否则、我将把问题标记为已解决。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢  Prarthan 的帮助 、我能为跳闸区域模块编程软件强制信号、我使用了 Bitfield 编程。 不必太复杂、我只需在 ePWM 初始化时添加以下行

    EPwm1Regs.TZSEL.bit.OSHT1 = 0;
    EPwm1Regs.TZCTL.bit.tZA = TZ_FORCE_LO;
    EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO;

    而 PWM 中断中的以下行

    EALLOW;
    EPwm1Regs.TZCLR.bit.OST = TZ_CLR;
    EPwm1Regs.TZFRC.bit.OST = TZ_FRC;

    EDIS;

    其中 TZ_CLR 和 TZ_FRC 是从 CAN 通信接收指令以清除或强制跳闸的变量。

    我唯一无法做到的是同时使用 Bitfield 和 Driverlib、TMS320F280037中没有空项目支持这两种类型的编程。

    谢谢。

    Jonas。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jonas:

    很高兴看到您能够对跳闸区域模块的软件力量进行编程。
    对于同时支持驱动程序库和位域的空工程、您可以转到以下文件夹位置:C2000Ware_5_00_00_00\driverlib\f28003x\examples\empty_projects

    有关两种类型如何协同工作的详细说明,请参阅: C2000Ware_5_00_00_00\device_support\f28003x\docs\f28003x_FRM_EX_UG.pdf
    下面的具体一节最简单的方法是只包含下面在您正在处理的项目中突出显示的所有必需的定义和头文件。


    谢谢。
    普拉森