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.

[参考译文] CCS/TMS320F28027:ePWM 中断

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/725198/ccs-tms320f28027-epwm-interrupt

器件型号:TMS320F28027

工具/软件:Code Composer Studio

您好!

我尝试在两个不同的事件上从 EPWM-1A 和 EPWM-2A 生成中断服务例程(ISR)。 来自这两者的 PWM 信号为250kHz、具有升压计数器模式和50%占空比。

对于 ePWM-1A、ISR 的瞬时值是 递增时的计数器值 等于 CMPA 值;对于 ePWM-2A 、递减时的计数器值等于 CMPA。  

此外、我还将使用 EPWM1A 的 SOCA 和 SOCB 来触发 ADC 采样。 ADC 工作正常、但 ISR 例程不工作。 我已经为项目编写了两个文件、一个具有外设初始化、另一个具有主代码。 调试时没有错误。 但是、当触发发生时、我要计算的值不会更新和计算。

我始终从一个示例启动项目、然后继续添加、因此可能是一些命令、注释将是额外的

以下是主代码:

#include "PeripheralHeaderIninclude.h"
#include "DSP2802x_ePWM_defines.h"//初始化的有用定义

///%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//函数原型
///%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

void DeviceInit(void);
空 InitFlash();
空 Memcopy (uint16 * SourceAddr、uint16* SourceEndAddr、uint16* DestAddr);
void Init_EPWM1 (void);
void Init_EPWM2 (void);
void Init_ADC (void);
void Init_ECapture (void);
void PieCntlInit (void);
void PieVectTableInit (void);

_interrupt void epwm1_ISR (void);
_interrupt void epwm2_ISR (void);
///%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//变量声明-常规
///%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

//用于在闪存中运行后台,在 RAM 中运行 ISR
extern UINT16 RamfuncsLoadStart、RamfuncsLoadEnd、RamfuncsRunStart;

uint16 Duty_cycle_a=60;//初始设置占空比50%
uint16 Duty_cycle_B=60;//初始设置占空比50%

// ADC 结果寄存器
#define ADCRESULT_uLpos (AdcResult.ADCRESULT0)
#define ADCRESULT_uLneg (AdcResult.ADCRESULT1)
#define ADCRESULT_UM (AdcResult.ADCRESULT7)

//计数器寄存器
#define COUNTER_LOW (ECap1Regs.CAP1)
#define COUNTER_HIGH (ECap1Regs.CAP2)

//---------------------- 变量--------------------------
浮点 uLpos、uLneg、uLposRead、uLnegRead;//电感器辅助绕组的正负采样电压
浮点 iLbarRead、iLbar;//电流互感器输出电压的自然采样

int c1、c2;//计数器变量
//uint16 C3 = 0、C4 = 0;

//---------------------- 常量------------------------------
//浮点 L = 0.000551;//转换器的电感器
//长整型 FS = 250000;//开关频率为250kHz

//---------------------- 控制器参数-------------------------------------------------------
浮点 K_LF = 0.007259;// L * FS = 137.75和 K_LF = 1/(L*FS)= 1/137.75 = 0.007259
浮点阈值= 0.001;//需要根据仿真定义阈值1mA

//---------------------- 电流观测器信号---
float iLmax = 0、Ilmin = 0、iLed = 0;
float delta_i = 0;


//#define period 500 // 60kHz when PLL is set to 0xC (60MHz)
//周期250 // 120kHz 当 PLL 设置为0xC (60MHz)时

///%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//主代码-从此处开始
///%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void main (void)

//========================================================
//初始化-常规
//========================================================

DeviceInit();//器件寿命支持和 GPIO 多路复用器设置

//仅在从闪存运行时使用
//请注意,变量 flash 由编译器定义(-d flash)
ifdef 闪存
//将时间关键代码和闪存设置代码复制到 RAM
// RamfuncsLoadStart、RamfuncsLoadEnd 和 RamfuncsRunStart
//符号由链接器创建。 请参阅链接器文件。
Memcopy (&RamfuncsLoadStart、&RamfuncsLoadEnd、&RamfuncsRunStart);

//调用闪存初始化以设置闪存等待状态
//此函数必须驻留在 RAM 中
InitFlash();//调用闪存包装程序初始化函数
#endif //(闪存)

//----------------------------------------------


init_EPWM1();
init_EPWM2();
init_adc();
init_ecapture ();
PieCntlInit();
PieVectTableInit();

EALLOW;
PieVectTable.EPWM1_INT =&epwm1_ISR;
PieVectTable.EPWM2_INT =&epwm2_ISR;
IER |= M_INT3;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
// PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
//设置比较值
EPwm1Regs.CMPA.half.CMPA = Duty_cycle_A;//最初将占空比设置为50%
EPwm2Regs.CMPA.half.CMPA = Duty_cycle_A;//最初将占空比设置为50%
EPwm2Regs.CMPB = Duty_cycle_B;//初始设置占空比50%

//========================================================
//永远循环
//========================================================
//只需坐下来循环:
//本示例中不需要中断。
可以使用示波器观察到// PWM 引脚。

for (;;)


EPwm1Regs.CMPA.half.CMPA = Duty_cycle_A;//最初将占空比设置为50%
EPwm2Regs.CMPA.half.CMPA = Duty_cycle_A;//将 Duty_cycle_A 添加到监视窗口中
EPwm2Regs.CMPB = Duty_cycle_B;//将 Duty_cycle_B 添加到监视窗口
//并更改其值以更改占空比
uLposRead = ADCRESULT_uLpos;
uLnegRead = ADCRESULT_uLneg;
iLbarRead = ADCRESULT_UM;

uLpos = 1.065;//(uLposRad*3.3)/4096;
uLneg = 1.065;//(uLnegRad*3.3)/4096;
iLbar =(iLbarRad*3.3)/4096;

C1 = COUNTER_HIGH;
C2 = COUNTER_LOW;

// C3 = ECap1Regs.CAP3;
// C4 = ECap1Regs.CAP4;

Δ_I = ABS (iLbar - iLed);
iLmed=(iLmax + Ilmin)/2;

_interrupt void epwm1_ISR (void){
Ilmin = iLmax -(C2 * uLneg * K_LF);//电流观测器的电感器电流最小值
EPwm1Regs.ETCLR.bit.INT = 1;

_interrupt void epwm2_ISR (void){
if (delta_i <阈值){
iLmax =(C1 * uLpos * K_LF)+ Ilmin;//电流观测器的电感器电流最大值

否则{
iLmax = iLbar +(0.5 * C2 * uLneg * K_LF);

EPwm2Regs.ETCLR.bit.INT = 1;

定义的外设函数如下:

#include "PeripheralHeaderIninclude.h"
#include "DSP2802x_ePWM_defines.h"//初始化的有用定义
#include "DSP2802x_ECAP.h"

//需要将从 RAM 运行的函数分配给
//另一个段。 然后、该段将映射到加载和
//使用链接器 cmd 文件运行地址。
#pragma CODE_SECTION (InitFlash、"ramfuncs");
#define Device_cal (void (*)(void)) 0x3D7C80
#define ADC_USDELAY 5000L

#define period 120 //生成250kHz 对称 PWM 的 PWM

void DeviceInit(void);
void PieCntlInit (void);
void PieVectTableInit (void);
void WDogDisable (void);
空 PLLset (UINT16);
void isr_illegal (void);
void Init_EPWM1 (void);
void Init_EPWM2 (void);
void Init_ADC (void);
void Init_ECapture (void);
///----------------------------------------------------------
//在此处为目标应用配置设备
///----------------------------------------------------------
void DeviceInit (void)

WDogDisable();//初始禁用看门狗
DINT;//全局禁用所有中断
IER = 0x0000;//禁用 CPU 中断
IFR = 0x0000;//清除所有 CPU 中断标志


// Device_cal 函数、复制 ADC 和振荡器校准值
//从 TI 保留的 OTP 到适当的调整寄存器中,自动发生
//在引导 ROM 中。 如果在调试过程中绕过引导 ROM 代码
//要使 ADC 和振荡器正常工作、必须调用以下函数
//符合规格。
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;//启用 ADC 外设时钟
(* Device_cal)();//从 TI OTP 自动校准
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 0;//将 ADC 时钟返回到原始状态
EDIS;


//切换到内部振荡器1并关闭所有其它时钟
//源以最大程度地降低功耗
EALLOW;
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL=0;// Clk src = INTOSC1
SysCtrlRegs.CLKCTL.bit.XCLKINOFF=1;//关闭 XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF=1;//关闭 XTALOSC
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF=1;//关闭 INTOSC2
EDIS;


//基于内部振荡器的系统时钟速度= 10MHz
// 0xC = 60MHz (12)
// 0xB = 55MHz (11)
// 0xA = 50MHz (10)
// 0x9 = 45MHz (9)
// 0x8 = 40MHz (8)
// 0x7 = 35MHz (7)
// 0x6 = 30MHz (6)
// 0x5 = 25MHz (5)
// 0x4 = 20MHz (4)
// 0x3 = 15MHz (3)
// 0x2 = 10MHz (2)

PLLset (0xC);//从上面的选项中选择

//初始化中断控制器和矢量表
//现在为默认值。 应用 ISR 映射稍后完成。
PieCntlInit();
PieVectTableInit();

EALLOW;//下面的寄存器是"受保护的"、允许访问。

//低速时钟预分频寄存器设置
SysCtrlRegs.LOSPCP。ALL = 0x0002;// SYSCLK / 4 (15MHz)
SysCtrlRegs.XCLK.bit.XCLKOUTDIV=2;

//外设时钟使能
//------------------------------------
//如果您不使用外设,则可能需要切换
//关闭时钟以节省功耗,即设置为=0
//
//注意:并非所有外设都在所有280x 衍生产品上可用。
//请参阅特定器件的数据表。

SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;// ADC
//----------------------------------
SysCtrlRegs.PCLKCR3.bit.COMP1ENCLK = 0;// COMP1
SysCtrlRegs.PCLKCR3.bit.COMP2ENCLK = 0;// Comp2
//----------------------------------
SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 0;// I2C
//----------------------------------
SysCtrlRegs.PCLKCR0.bit.SPIANCLK = 0;// SPI-A
//----------------------------------
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 0;// SCI-A
//----------------------------------
SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1;//eCAP1
//----------------------------------
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;// ePWM1
SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;// ePWM2
SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 0;// ePWM3
SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 0;// ePWM4
//----------------------------------
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;//启用 TBCLK
//----------------------------------


///--------------------------------------------
// GPIO (通用 I/O)配置
///--------------------------------------------
///----------------
//使用快速备注:
///----------------
//如果 GpioCtrlRegs.GP?MUX?bit.GPIO?= 1、2或3 (即非 GPIO 功能),则离开
//注释的其余行
//如果 GpioCtrlRegs.GPRegisteredMUXRegisteredbit.GPIO?= 0 (即 GPIO 功能),则:
// 1)取消对 GpioCtrlRegs.GP?DIR.bit.GPIO 的注释? =? 并选择要输入或输出的引脚
// 2)如果在中、可以保留注释行旁边的行
// 3)如果输出,请取消对.gpaclear...行的注释。 以强制引脚处于低电平、或
//取消对.GPASET...行的注释 以强制引脚处于高电平、或
///--------------------------------------------
///--------------------------------------------
// GPIO-00 -引脚功能=--备用--
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;// 0=GPIO、1=EPWM1A、2=Resv、3=Resv
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;// 1 =输出、0 =输入
// GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;//如果->最初设置为低电平则取消注释
// GpioDataRegs.GPASET.bit.GPIO0 = 1;//如果->初始设置为高电平则取消注释
// GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;//禁用 GPIO0 (EPWM1A)上的上拉电阻
///--------------------------------------------
// GPIO-01 -引脚功能=--备用--
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;// 0=GPIO、1=EPWM1B、2=EMU0、3=COMP1OUT
GpioCtrlRegs.GPADIR.bit.GPIO1 = 0;// 1=输出、0=输入
// GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;//如果->初始设置为低电平则取消注释
// GpioDataRegs.GPASET.bit.GPIO1=1;//如果->初始设置为高电平则取消注释
///--------------------------------------------
// GPIO-02 -引脚功能=--备用--
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;// 0=GPIO、1=EPWM2A、2=Resv、3=Resv
GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;// 1=输出、0=输入
// GpioDataRegs.GPACLEAR.bit.GPIO2 = 1;//如果->最初设置为低电平则取消注释
// GpioDataRegs.GPASET.bit.GPIO2 = 1;//如果->初始设置为高电平则取消注释
///--------------------------------------------
// GPIO-03 - PIN 功能=--备用--
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;// 0=GPIO、1=EPWM2B、2=Resv、3=COMP2OUT
GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;// 1=输出、0=输入
// GpioDataRegs.gpaclear.bit.gpio3 = 1;//如果->初始设置为低电平则取消注释
// GpioDataRegs.GPASET.bit.GPIO3=1;//如果->初始设置为高电平则取消注释
///--------------------------------------------
// GPIO-04 -引脚功能=--备用--
GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;// 0=GPIO、1=EPWM3A、2=Resv、3=Resv
GpioCtrlRegs.GPADIR.bit.GPIO4 = 0;// 1=输出、0=输入
// GpioDataRegs.GPACLEAR.bit.GPIO4=1;//如果->最初设置为低电平则取消注释
// GpioDataRegs.GPASET.bit.GPIO4=1;//如果->初始设置为高电平则取消注释
///--------------------------------------------
// GPIO-05 -引脚功能=--备用--
GpioCtrlRegs.GPAMUX1.bit.GPIO5=0;// 0=GPIO、1=EPWM3B、2=Resv、3=ECAP1
GpioCtrlRegs.GPADIR.bit.GPIO5 = 0;// 1=输出、0=输入
// GpioDataRegs.GPACLEAR.bit.GPIO5=1;//如果->初始设置为低电平则取消注释
// GpioDataRegs.GPASET.bit.GPIO5=1;//如果->初始设置为高电平则取消注释
///--------------------------------------------
// GPIO-06 - PIN 功能=--备用--
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;// 0=GPIO、1=EPWM4A、2=SYNCI、3=SYNCO
GpioCtrlRegs.GPADIR.bit.GPIO6 = 0;// 1=输出、0=输入
// GpioDataRegs.GPACLEAR.bit.GPIO6 = 1;//如果->初始设置为低电平则取消注释
// GpioDataRegs.GPASET.bit.GPIO6 = 1;//如果->初始设置为高电平则取消注释
///--------------------------------------------
// GPIO-07 -引脚功能=--备用--
GpioCtrlRegs.GPAMUX1.bit.GPIO7=0;// 0=GPIO、1=EPWM4B、2=SCIRX-A、3=Resv
GpioCtrlRegs.GPADIR.bit.GPIO7 = 0;// 1=输出、0=输入
// GpioDataRegs.GPACLEAR.bit.GPIO7=1;//如果->初始设置为低电平则取消注释
// GpioDataRegs.GPASET.bit.GPIO7=1;//如果->初始设置为高电平则取消注释
///--------------------------------------------
// GPIO-08 - GPIO-11不存在
///--------------------------------------------
// GPIO-12 -引脚功能=--备用--
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;// 0=GPIO、1=TZ1、2=SCITX-A、3=Resv
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;// 1=输出、0=输入
// GpioDataRegs.GPACLEAR.bit.GPIO12 = 1;//如果->初始设置为低电平则取消注释
// GpioDataRegs.GPASET.bit.GPIO12 = 1;//如果->初始设置为高电平则取消注释
///--------------------------------------------
// GPIO-13 - GPIO-15不存在
///--------------------------------------------
///--------------------------------------------

// GPIO-16 -引脚功能=--备用--
GpioCtrlRegs.GPAMUX2.bit.GPIO16=0;// 0=GPIO、1=SPISIMO-A、2=Resv、3=TZ2
GpioCtrlRegs.GPADIR.bit.GPIO16 = 0;// 1=输出、0=输入
// GpioDataRegs.GPACLEAR.bit.GPIO16=1;//如果->初始设置为低电平则取消注释
// GpioDataRegs.GPASET.bit.GPIO16=1;//如果->初始设置为高电平则取消注释
///--------------------------------------------
// GPIO-17 -引脚功能=--备用--
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0;// 0=GPIO、1=SPISOMI-A、2=Resv、3=TZ3
GpioCtrlRegs.GPADIR.bit.GPIO17 = 0;// 1=输出、0=输入
// GpioDataRegs.GPACLEAR.bit.GPIO17 = 1;//如果->初始设置为低电平则取消注释
// GpioDataRegs.GPASET.bit.GPIO17 = 1;//如果->初始设置为高电平则取消注释
///--------------------------------------------
// GPIO-18 -引脚功能=--备用--
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0;// 0=GPIO、1=SPICLK-A、2=SCITX-A、3=XCLKOUT
GpioCtrlRegs.GPADIR.bit.GPIO18 = 0;// 1=输出、0=输入
// GpioDataRegs.GPACLEAR.bit.GPIO18=1;//如果->最初设置为低电平则取消注释
// GpioDataRegs.GPASET.bit.GPIO18=1;//如果->初始设置为高电平则取消注释
///--------------------------------------------
// GPIO-19 -引脚功能=--备用--
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 3;// 0=GPIO、1=SPISTE-A、2=SCIRX-A、3=ECAP1
GpioCtrlRegs.GPADIR.bit.GPIO19 = 0;// 1=输出、0=输入
// GpioDataRegs.GPACLEAR.bit.GPIO19 = 1;//如果->初始设置为低电平则取消注释
// GpioDataRegs.GPASET.bit.GPIO19 = 1;//如果->初始设置为高电平则取消注释
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;// 0 =使能上拉
///--------------------------------------------
// GPIO-20 - GPIO-27不存在
///--------------------------------------------
// GPIO-28 -引脚功能=--备用--
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 0;// 0=GPIO、1=SCIRX-A、2=I2C-SDA、3=TZ2
GpioCtrlRegs.GPADIR.bit.GPIO28 = 0;// 1=输出、0=输入
// GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;//如果->初始设置为低电平则取消注释
// GpioDataRegs.GPASET.bit.GPIO28 = 1;//如果->初始设置为高电平则取消注释
///--------------------------------------------
// GPIO-29 -引脚功能=--备用--
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 0;// 0=GPIO、1=SCITXD-A、2=I2C-SCL、3=TZ3
GpioCtrlRegs.GPADIR.bit.GPIO29 = 0;// 1=输出、0=输入
// GpioDataRegs.GPACLEAR.bit.GPIO29 = 1;//如果->初始设置为低电平则取消注释
// GpioDataRegs.GPASET.bit.GPIO29 = 1;//如果->初始设置为高电平则取消注释
///--------------------------------------------
// GPIO-30 - GPIO-31不存在
///--------------------------------------------
///--------------------------------------------

// GPIO-32 -引脚功能=--备用--
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0;// 0=GPIO、1=I2C-SDA、2=SYNCI、3=ADCSOCA
GpioCtrlRegs.GPBDIR.bit.GPIO32 = 0;// 1 =输出、0 =输入
// GpioDataRegs.GPBCLEAR.bit.GPIO32 = 1;//如果->初始设置为低电平则取消注释
// GpioDataRegs.GPBSET.BIO32 = 1;//如果->初始设置为高电平则取消注释
///--------------------------------------------
// GPIO-33 -引脚功能=--备用--
GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 0;// 0=GPIO、1=I2C-SCL、2=SYNCO、3=ADCSOCB
GpioCtrlRegs.GPBDIR.bit.GPIO33 = 0;// 1 =输出、0 =输入
// GpioDataRegs.GPBCLEAR.bit.GPIO33=1;//如果->初始设置为低电平则取消注释
// GpioDataRegs.GPBSET.BIO33=1;//如果->初始设置为高电平则取消注释
///--------------------------------------------
// GPIO-34 -引脚功能= F28027 USB 软件狗的 LED
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;// 0=GPIO、1=COMP2OUT、2=EMU1、3=Resv
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;// 1 =输出、0 =输入
// GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;//如果->初始设置为低电平则取消注释
GpioDataRegs.GPBSET.BIO34 = 1;//取消注释 if ->初始设置为高电平
///--------------------------------------------
GpioCtrlRegs.GPAQSEL1.ALL = 0x0000;// GPIO0-GPIO15同步到 SYSCLKOUT
GpioCtrlRegs.GPAQSEL2.ALL = 0x0000;// GPIO16-GPIO31同步到 SYSCLKOUT
GpioCtrlRegs.GPBQSEL1.ALL = 0x0000;// GPIO32-GPIO34同步到 SYSCLKOUT
EDIS;//禁用寄存器访问

//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//注意:
// EPWM2用于对电感器辅助绕组的电压进行采样
// EPWM-2A 生成 SOC 信号来对 u_LPO 进行采样
// EPWM-2B 生成 SOC 信号来对 u_Lneg 进行采样
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
void Init_EPWM1 (void){

//时基寄存器
EPwm1Regs.TBPRD =周期;//设置定时器周期、PWM 频率= 1/周期
EPwm1Regs.TBPHS.ALL = 0;//时基相位寄存器
EPwm1Regs.TBCTR = 0;//时基计数器寄存器
EPwm1Regs.TBCTL.bit.PRDLD = TB_Immediate;//设置立即加载
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数模式:用于非对称 PWM
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

//将影子寄存器加载设置为零
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;// CTR 上的负载=零

//设置操作
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//将 PWM1A 设置为零事件
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;//在递增计数 CompareA 事件上清除 PWM1A

//来自 ePWM-1A 的中断
EPwm1Regs.ETSEL.bit.INTSEL = 100;//在递增时选择 TBCTR = CMPA 上的 INT
EPwm1Regs.ETSEL.bit.INTEN = 1;//启用 INT
EPwm1Regs.ETPS.bit.INTPRD = 01;//在发生第一个事件时生成 INT

void Init_EPWM2 (void){
//时基寄存器

EPwm2Regs.TBPRD =周期;//设置定时器周期、PWM 频率= 1/周期
EPwm2Regs.TBPHS.ALL = 0;//时基相位寄存器
EPwm2Regs.TBCTR = 0;//时基计数器寄存器
EPwm2Regs.TBCTL.bit.PRDLD = TB_Immediate;//设置立即加载
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//递减计数模式:用于对称 PWM
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;

//将影子寄存器加载设置为零

EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;// CTR 上的负载=零

//设置操作

EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;//在事件 A 上设置 PWM2A、递增计数
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;//在事件 A 上清除 PWM2A、递减计数

EPwm2Regs.AQCTLB.bit.CBU = AQ_SET;//在事件 B 上设置 PWM2B、递增计数
EPwm2Regs.AQCTLB.bit.CBD = AQ_CLEAR;//在事件 B 上清除 PWM2B、递减计数

//事件触发选择寄存器
//对于 EPWM-2A、当时间计数器=周期时生成 SOC 脉冲
//对于 EPWM-2B、当时间计数器=零时生成 SOC 脉冲
EPwm2Regs.ETSEL.bit.INTEN = 1;// 0 =禁用 INT、1 =启用 INT
EPwm2Regs.ETSEL.bit.INTSEL = 101;//递减时选择 TBCTR = CMPA 上的 INT
EPwm2Regs.ETPS.bit.INTPRD = 01;//在发生第一个事件时生成 INT
EPwm2Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA 脉冲
EPwm2Regs.ETSEL.bit.SOCASEL = ET_CTR_PRD;//在 PRD 上触发 ADC (CTR=PRD)
EPwm2Regs.ETSEL.bit.SOCBEN = 1;//启用 SOCA 脉冲
EPwm2Regs.ETSEL.bit.SOCBSEL = ET_CTR_ZERO;//在 PRD 上触发 ADC (CTR=ZERO)
EPwm2Regs.ETPS.bit.SOCAPRD = et_1st;//第一个事件触发
EPwm2Regs.ETPS.bit.SOCAPRD = et_1st;//第一个事件触发
EPwm2Regs.ETPS.bit.SOCBPRD = et_1st;//第一个事件触发

//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// ADC-A0、ADC-A1和 ADC-A7用于对 u_LPO、u_Lneg 和 u_M 信号进行采样。
// ADC-A0和 ADC-A7由 ePWM-2A @ TBCTR = PRD 和的 SOCA 触发
// ADC-A1由 ePWM-2B @ TBCTR = 0的 SOCB 触发
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

void Init_ADC (void){
uint16 i = 0;

EALLOW;
// ADC 上电序列
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0;//内部;用于生成基准的外部(VREFHI/VREFLO)带隙
AdcRegs.ADCCTL1.bit.ADCPWDN = 1;//内核内的模拟电路上电
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;//内核内的带隙缓冲器电路上电
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1;//内核内的基准缓冲器电路上电
AdcRegs.ADCCTL1.bit.ADCENABLE = 1;//启用 ADC
for (i=0;i<5000;i++){}//等待60000个周期= 1ms (每个迭代为12个周期)

//-------- TRIGSEL ------
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 0x7;//触发源:EPWM2 ADCSOCA
AdcRegs.ADCSOC7CTL.bit.TRIGSEL = 0x7;//触发源:EPWM2 ADCSOCA
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 0x8;//触发源:EPWM2 ADCSOCB

//-------- CHSEL --------
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0x0;// ADCINA0 (A0:引脚3 controlSTICK)
AdcRegs.ADCSOC1CTL.bit.CHSEL = 0x1;// ADCINA1 (A1:引脚12 controlSTICK)
AdcRegs.ADCSOC7CTL.bit.CHSEL = 0x7;// ADCINA7 (A7:引脚1 controlSTICK)

//-------- ACQPS ---
AdcRegs.ADCSOC0CTL.bit.ACQPS = 0x6;//对窗口进行采样7个时钟周期
AdcRegs.ADCSOC1CTL.bit.ACQPS = 0x6;//对窗口进行采样7个时钟周期
AdcRegs.ADCSOC7CTL.bit.ACQPS = 0x6;//对窗口7个时钟周期进行采样

//-------- INTSELxNy--------
AdcRegs.INTSEL1N2.bit.INT1CONT = 1;//连续模式(不需要清除 intFlag)
AdcRegs.INTSEL1N2.bit.INT2CONT = 1;//连续模式(不需要清除 intFlag)
// AdcRegs.INTSEL3N4.bit.INT3CONT = 1;//连续模式(不需要清除 intFlag)

AdcRegs.INTSEL1N2.bit.INT1E = 1;// 1=启用 EOC 中断!
AdcRegs.INTSEL1N2.bit.INT2E = 1;// 1=启用 EOC 中断!
// AdcRegs.INTSEL3N4.bit.INT3E = 1;// 1=启用 EOC 中断!

AdcRegs.INTSEL1N2.bit.INT1SEL = 0;// EOC0为 ADCINT1触发//***
AdcRegs.INTSEL1N2.bit.INT2SEL = 1;// EOC1为 ADCINT2触发//***
// AdcRegs.INTSEL3N4.bit.INT3SEL = 7;// EOC7为 ADCINT3触发//***
//--------------------------------------------------------
EDIS;

//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// ECapture 外设模块初始化。 controlSTICK 上的 GPIO-19引脚25
//用作输入。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
void Init_ECapture (void){
//禁用全局中断、停止 eCAP 计数器、禁用 eCAP 中断
ECap1Regs.ECEINT.ALL = 0x0000;//禁用所有捕捉中断
ECap1Regs.ECCLR.ALL = 0xFFFF;//清除所有 CAP 中断标志
ECap1Regs.ECCTL1.bit.CAPLDEN = 0;//禁用 CAP1-CAP4寄存器加载
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;//确保计数器被停止

//配置外设寄存器
ECap1Regs.ECCTL1.bit.CAP1POL = 0;//捕捉事件1在上升沿触发(RE)
ECap1Regs.ECCTL1.bit.CAP2POL = 1;//捕捉事件2在一个下降边沿上触发(FE)
ECap1Regs.ECCTL1.bit.CAP3POL = 0;//捕捉事件3在上升沿触发(RE)
ECap1Regs.ECCTL1.bit.CAP4POL = 1;//捕捉事件4在一个下降边沿上触发(FE)

ECap1Regs.ECCTL1.bit.CTRST1 = 1;//捕获事件1时间戳后的复位计数器
ECap1Regs.ECCTL1.bit.CTRST2 = 1;//捕获事件2时间戳后的复位计数器
// ECap1Regs.ECCTL1.bit.CTRST3 = 1;//捕获事件3时间戳后的复位计数器
// ECap1Regs.ECCTL1.bit.CTRST4 = 1;//捕获事件4时间戳后的复位计数器

ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0;//在连续模式下运行
ECap1Regs.ECCTL2.bit.STOP_Wrap = 1;//在事件2之后换行
ECap1Regs.ECCTL2.bit.SYNCO_SEL = 2;//禁用
ECap1Regs.ECCTL2.bit.SYNCI_EN = 0;//禁用

ECap1Regs.ECCTL1.bit.CAPLDEN = 1;//启用 CAP 1-4寄存器在捕捉事件时间加载
ECap1Regs.ECCTL1.bit.prescale = 0;//除以1

//启动 eCAP 计数器
ECap1Regs.ECCTL2.bit.CAP_APWM = 0;
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;

//捕获事件1和事件2后的中断
// ECap1Regs.ECEINT.ALL = 0x0004;

void PieCntlInit (void)

//在 CPU 级别禁用中断:
Dint;

//禁用 PIE
PieCtrlRegs.PIECTRL.bit.ENPIE = 0;

//清除所有 PIEIER 寄存器:
PieCtrlRegs.PIEIER1.ALL = 0;
PieCtrlRegs.PIEIER2.ALL = 0;
PieCtrlRegs.PIEIER3.ALL = 0;
PieCtrlRegs.PIEIER4.ALL = 0;
PieCtrlRegs.PIEIER5.ALL = 0;
PieCtrlRegs.PIEIER6.ALL = 0;
PieCtrlRegs.PIEIER7.ALL = 0;
PieCtrlRegs.PIEIER8.ALL = 0;
PieCtrlRegs.PIEIER9.ALL = 0;
PieCtrlRegs.PIEIER10.ALL = 0;
PieCtrlRegs.PIEIER11.all = 0;
PieCtrlRegs.PIEIER12.ALL = 0;

//清除所有 PIEIFR 寄存器:
PieCtrlRegs.PIEIFR1.ALL = 0;
PieCtrlRegs.PIEIFR2.ALL = 0;
PieCtrlRegs.PIEIFR3.ALL = 0;
PieCtrlRegs.PIEIFR4.ALL = 0;
PieCtrlRegs.PIEIFR5.ALL = 0;
PieCtrlRegs.PIEIFR6.ALL = 0;
PieCtrlRegs.PIEIFR7.ALL = 0;
PieCtrlRegs.PIEIFR8.ALL = 0;
PieCtrlRegs.PIEIFR9.ALL = 0;
PieCtrlRegs.PIEIFR10.ALL = 0;
PieCtrlRegs.PIEIFR11.all = 0;
PieCtrlRegs.PIEIFR12.ALL = 0;


void PieVectTableInit (void)

Int16 I;
PINT * Dest = PieVectTable.TINT1;

EALLOW;
对于(i=0;i < 115;i++)
*Dest++=&ISR_ILLEGY;
EDIS;

//启用 PIE 矢量表
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;

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

    您好!

    您是否说 ePWM ISR 正常工作、但 ADC ISR 不工作?
    我建议您单独启用/禁用它们、并确保每个都可以被触发。
    您将知道中断配置是否存在任何问题。