主题中讨论的其他器件:TMS320F280037、 C2000WARE
您好!
我正在使用 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;
}