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.
当我想选取EPWM7作为相移的基准主通道时,其他EPWM通道出现了不断相移的情况,但我的相移寄存器给的时固定值,换用EPWM1作为主通道后不会出现这种情况,想求助一下这种情况应如何解决。以下附上我的代码
//###########################################################################
// FILE: epwm_deadband_c28.c
// TITLE: 检查PWM死区
//
//! \addtogroup cpu01_example_list
//! <h1> ePWM死区控制 (epwm_deadband)</h1>
//!
//! 测试期间,在示波器上监控ePWM1、ePWM2和/或ePWM3输出
//!
//! - ePWM1A对应GPIO0
//! - ePWM1B对应GPIO1
//! - ePWM2A对应GPIO2
//! - ePWM2B对应GPIO3
//! - ePWM3A对应GPIO4
//! - ePWM3B对应GPIO5
//!
//! 此示例将ePWM1、ePWM2和ePWM3配置为:
//! - 增减计数模式
//! - 带死区控制
//!
//! 包含3个示例:
//! - ePWM1: 低电平有效PWM
//! - ePWM2: 低电平有效互补PWM
//! - ePWM3: 高电平有效互补PWM
//!
//! 每个ePWM配置为在第3次计数到零事件时产生中断。
//! 发生中断时,死区时间将被修改,范围为0 <= DB <= DB_MAX。
//! 即死区时间会在0到最大值之间变化。
//!
//! 通过示波器观察EPWM1A/B、EPWM2A/B和EPWM3A/B波形
//
//
//###########################################################################
// $TI Release: F2837xS Support Library v180 $
// $Release Date: Fri Nov 6 16:27:58 CST 2015 $
// $Copyright: Copyright (C) 2014-2015 Texas Instruments Incorporated -
// http://www.ti.com/ ALL RIGHTS RESERVED $
//###########################################################################
#include "F28x_Project.h" // 设备头文件和示例包含文件
#include <math.h>
// 本文件中函数的原型声明
void InitEPwm1Example(void);
void InitEPwm2Example(void);
void InitEPwm3Example(void);
void InitEPwm4Example(void);
void InitEPwm6Example(void);
void InitEPwm7Example(void);
__interrupt void epwm4_isr(void);
// 本示例中使用的全局变量
Uint32 EPwm4TimerIntCount; // EPWM4定时器中断计数
// 最小死区时间值
#define EPWM1_MIN_DB 0
#define EPWM2_MIN_DB 0
#define EPWM3_MIN_DB 0
#define EPWM4_MIN_DB 0
#define EPWM6_MIN_DB 0
#define EPWM7_MIN_DB 0
// 死区时间定义 - 使用整数计算结果
#define DEADTIME_SEC 0.00000020f // 200ns死区时间
#define DEADTIME_CYCLES (Uint16)(DEADTIME_SEC * CPU_CLK) // 转换为时钟周期
#define EPWM1_DB DEADTIME_CYCLES
#define EPWM2_DB DEADTIME_CYCLES
#define EPWM3_DB DEADTIME_CYCLES
#define EPWM4_DB DEADTIME_CYCLES
#define EPWM6_DB DEADTIME_CYCLES
#define EPWM7_DB DEADTIME_CYCLES
// 超前时间计算参数
static float Lm; // 电感值
static float LEAD_TIME; // 超前时间
static Uint16 cmp_offset; // 比较偏移值(整数)
static Uint16 phase1; // 相位偏移值(整数)
#define CPU_CLK 200e6 // 200MHz系统时钟
#define f1 74500 // 频率值1
#define f2 75000 // 频率值2
#define SP (Uint16)(CPU_CLK/4/f1) // 周期值
#define pi 3.1415926f // π值
// 相位偏移参数
#define PHASE_120_DEGREE (SP / 3) // 120度相位偏移
// PWM比较值
Uint16 EPWM1_CMA=SP/2;
Uint16 EPWM2_CMA=SP/2;
Uint16 EPWM3_CMA=SP/2;
Uint16 EPWM4_CMA=SP/2;
Uint16 EPWM6_CMA=SP/2;
Uint16 EPWM7_CMA=SP/2;
Uint16 flag = 1; // 模式标志(1:整流模式, 0:逆变模式)
// 整型化中间参数计算
#define RL (Uint16)((450U*450U)/30000U) // 负载电阻值
// 初始化计算函数
void CalculateParameters()
{
// 浮点计算部分
float n = 0.6; // 变比计算
float Raci = (3.0f * 8.0f * n * n * RL) / (pi * pi);
float Q = 0.2f; // 品质因数
float fr = 75000.0f; // 谐振频率
float CrY = 1.0f / (2 * pi * Q * fr * Raci); // 谐振电容计算
float Lr = 1.0f / ( (2 * pi * fr) * (2 * pi * fr) * CrY ); // 谐振电感计算
Lm = 15.0f * Lr; // 激磁电感计算
// 超前关断时间计算
float sqrt_term = sqrtf(powf(2*pi*f1*Lm*pi,2)/(16*powf(n,4)*powf(RL,2)) +
(pi*2*pi*f1*Lm*powf(f1/fr,2))/(2*powf(n,2)*RL));
LEAD_TIME = sqrtf((-2*pi*f1*Lm*pi)/(4*n*n*RL) +
sqrtf(powf((2*pi*f1*Lm*pi), 2)/(16*powf(n,4)*powf(RL,2)) +
(pi*2*pi*f1*Lm*powf((f1/fr),2))/(2*powf(n,2)*RL))) / (2*f1) ;
// 计算cmp_offset和phase1并转换为整数
float cmp_offset_float = (0.0000002f + 6.7114e-6f - 6.414e-6f) * CPU_CLK;
float phase1_float = (0.2974e-6f) * 180.0f / (6.7114e-6f) * SP / 360.0f;
// 转换为整数
cmp_offset = cmp_offset_float*0.75;
phase1 = phase1_float;
}
void main(void)
{
// 步骤1. 初始化系统控制
// PLL、看门狗、使能外设时钟
// 此示例函数位于F2837xS_SysCtrl.c文件中
InitSysCtrl();
// 步骤2. 初始化GPIO
// 此示例函数位于F2837xS_Gpio.c文件中
// 演示如何将GPIO设置为默认状态
// InitGpio();
// 将PWM1、PWM2和PWM3分配给CPU1
// CpuSysRegs.CPUSEL0.bit.EPWM1 = 0;
// CpuSysRegs.CPUSEL0.bit.EPWM2 = 0;
// CpuSysRegs.CPUSEL0.bit.EPWM3 = 0;
// 使能PWM1、PWM2和PWM3
CpuSysRegs.PCLKCR2.bit.EPWM1=1;
CpuSysRegs.PCLKCR2.bit.EPWM2=1;
CpuSysRegs.PCLKCR2.bit.EPWM3=1;
CpuSysRegs.PCLKCR2.bit.EPWM4=1;
CpuSysRegs.PCLKCR2.bit.EPWM6=1;
CpuSysRegs.PCLKCR2.bit.EPWM7=1;
// 仅初始化ePWM1、ePWM2、ePWM3的GPIO引脚
// 这些函数位于F2837xS_EPwm.c文件中
InitEPwm1Gpio();
InitEPwm2Gpio();
InitEPwm3Gpio();
InitEPwm4Gpio();
InitEPwm6Gpio();
InitEPwm7Gpio();
// 步骤3. 清除所有中断并初始化PIE向量表
// 禁用CPU中断
DINT;
// 初始化PIE控制寄存器为默认状态
// 默认状态为禁用所有PIE中断并清除标志
// 此函数位于F2837xS_PieCtrl.c文件中
InitPieCtrl();
// 禁用CPU中断并清除所有CPU中断标志
IER = 0x0000;
IFR = 0x0000;
// 用指向默认中断服务程序(ISR)的指针初始化PIE向量表
// 这将填充整个表,即使某些中断在此示例中未使用
// 这对调试很有用
// 默认ISR位于F2837xS_DefaultIsr.c文件中
// 此函数位于F2837xS_PieVect.c文件中
InitPieVectTable();
// 将此示例中使用的中断重新映射到此文件中的ISR函数
EALLOW; // 需要此操作才能写入EALLOW保护的寄存器
PieVectTable.EPWM4_INT = &epwm4_isr;
EDIS; // 禁用对EALLOW保护寄存器的写访问
// 步骤4. 初始化设备外设
// 在此示例中,仅初始化ePWM
EALLOW;
// InputXbarRegs.INPUT5SELECT = 1; // EPWM1 SYNCOUT -> INPUT5(供EPWM2使用)
// InputXbarRegs.INPUT6SELECT = 1; // EPWM1 SYNCOUT -> INPUT6(供EPWM3使用)
// InputXbarRegs.INPUT7SELECT = 1; // EPWM1 SYNCOUT -> INPUT7(供EPWM4使用)
// InputXbarRegs.INPUT8SELECT = 1; // EPWM1 SYNCOUT -> INPUT8(供EPWM6使用)
// InputXbarRegs.INPUT9SELECT = 1; // EPWM1 SYNCOUT -> INPUT9(供EPWM1使用)
// EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // EPWM2同步输入
// EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // EPWM3同步输入
// EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // EPWM4同步输入
// EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // EPWM6同步输入
// EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // EPWM7同步输入
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0; // 暂时禁用时基时钟同步
EDIS;
// 计算参数
CalculateParameters();
InitEPwm7Example(); // 初始化EPWM7
InitEPwm1Example(); // 初始化EPWM1
InitEPwm2Example(); // 初始化EPWM2
InitEPwm3Example(); // 初始化EPWM3
InitEPwm6Example(); // 初始化EPWM6
InitEPwm4Example(); // 初始化EPWM4
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =1; // 启用时基时钟同步
EDIS;
// 步骤5. 用户特定代码,启用中断
// 初始化计数器
EPwm4TimerIntCount = 0;
// 启用连接到EPWM1-3 INT的CPU INT3
IER |= M_INT3;
// 启用PIE中的EPWM INTn: 组3中断1-3
PieCtrlRegs.PIEIER3.bit.INTx4 = 1;
// 启用全局中断和更高优先级的实时调试事件
EINT; // 启用全局中断INTM
ERTM; // 启用全局实时中断DBGM
// 步骤6. 空闲循环,无限循环(可选)
for(;;)
{
asm (" NOP"); // 空操作
}
}
// EPWM4中断服务程序
__interrupt void epwm4_isr(void)
{
if (flag == 1)
{
// 整流模式
EPwm1Regs.DBRED.bit.DBRED = EPWM1_DB; // 设置EPWM1上升沿死区
EPwm1Regs.DBFED.bit.DBFED = EPWM1_DB; // 设置EPWM1下降沿死区
EPwm2Regs.DBRED.bit.DBRED = EPWM2_DB; // 设置EPWM2上升沿死区
EPwm2Regs.DBFED.bit.DBFED = EPWM2_DB; // 设置EPWM2下降沿死区
EPwm3Regs.DBRED.bit.DBRED = EPWM3_DB; // 设置EPWM3上升沿死区
EPwm3Regs.DBFED.bit.DBFED = EPWM3_DB; // 设置EPWM3下降沿死区
EPwm4Regs.DBRED.bit.DBRED = cmp_offset; // 设置EPWM4上升沿死区(超前值)
EPwm4Regs.DBFED.bit.DBFED = cmp_offset; // 设置EPWM4下降沿死区(超前值)
EPwm6Regs.DBRED.bit.DBRED = cmp_offset; // 设置EPWM6上升沿死区(超前值)
EPwm6Regs.DBFED.bit.DBFED = cmp_offset; // 设置EPWM6下降沿死区(超前值)
EPwm7Regs.DBRED.bit.DBRED = cmp_offset; // 设置EPWM7上升沿死区(超前值)
EPwm7Regs.DBFED.bit.DBFED = cmp_offset; // 设置EPWM7下降沿死区(超前值)
}
else
{
// 逆变模式
EPwm1Regs.DBRED.bit.DBRED = cmp_offset; // 设置EPWM1上升沿死区(超前值)
EPwm1Regs.DBFED.bit.DBFED = cmp_offset; // 设置EPWM1下降沿死区(超前值)
EPwm2Regs.DBRED.bit.DBRED = cmp_offset; // 设置EPWM2上升沿死区(超前值)
EPwm2Regs.DBFED.bit.DBFED = cmp_offset; // 设置EPWM2下降沿死区(超前值)
EPwm3Regs.DBRED.bit.DBRED = cmp_offset; // 设置EPWM3上升沿死区(超前值)
EPwm3Regs.DBFED.bit.DBFED = cmp_offset; // 设置EPWM3下降沿死区(超前值)
EPwm4Regs.DBRED.bit.DBRED = EPWM4_DB; // 设置EPWM4上升沿死区
EPwm4Regs.DBFED.bit.DBFED = EPWM4_DB; // 设置EPWM4下降沿死区
EPwm6Regs.DBRED.bit.DBRED = EPWM6_DB; // 设置EPWM6上升沿死区
EPwm6Regs.DBFED.bit.DBFED = EPWM6_DB; // 设置EPWM6下降沿死区
EPwm7Regs.DBRED.bit.DBRED = EPWM7_DB; // 设置EPWM7上升沿死区
EPwm7Regs.DBFED.bit.DBFED = EPWM7_DB; // 设置EPWM7下降沿死区
}
// 清除中断标志
EPwm4Regs.ETCLR.bit.INT = 1;
// 向PIE控制器发送中断响应
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
// 初始化EPWM1示例
void InitEPwm1Example()
{
EALLOW;
EPwm1Regs.TBPRD = SP; // 设置定时器周期
EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; // 相位为0
EPwm1Regs.TBCTR = 0x0000; // 清除计数器
// 设置时基时钟
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 增减计数模式
EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 禁用相位加载
EPwm1Regs.TBPHS.bit.TBPHS = phase1; // 相位偏移
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 时钟分频比
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
// 设置比较控制
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 影子模式
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // 计数器为0时加载
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// 设置比较值
EPwm1Regs.CMPA.bit.CMPA = EPWM1_CMA;
// 设置动作限定符
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 计数器向上计数匹配时设置PWM1A
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 计数器向下计数匹配时清除PWM1A
// 低电平有效PWM - 设置死区
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 全功能死区
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 极性选择
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; // 输入模式
EPwm1Regs.DBRED.bit.DBRED = EPWM1_DB; // 设置上升沿死区
EPwm1Regs.DBFED.bit.DBFED = EPWM1_DB; // 设置下降沿死区
EDIS;
}
// 初始化EPWM2示例
void InitEPwm2Example()
{
EPwm2Regs.TBPRD = SP; // 设置定时器周期
EPwm2Regs.TBPHS.bit.TBPHS = 0x0000; // 相位为0
EPwm2Regs.TBCTR = 0x0000; // 清除计数器
// 设置时基时钟
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 增减计数模式
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 启用相位加载
EPwm2Regs.TBPHS.bit.TBPHS = SP*2/3+phase1; // 120度相位偏移
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 时钟分频比
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 分频比
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
// 设置比较值
EPwm2Regs.CMPA.bit.CMPA = EPWM2_CMA;
// 设置动作限定符
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; // 计数器向上计数匹配时设置PWM2A
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 计数器向下计数匹配时清除PWM2A
// 低电平有效互补PWM - 设置死区
EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 全功能死区
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 极性选择
EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL; // 输入模式
EPwm2Regs.DBRED.bit.DBRED = EPWM2_DB; // 设置上升沿死区
EPwm2Regs.DBFED.bit.DBFED = EPWM2_DB; // 设置下降沿死区
}
// 初始化EPWM3示例
void InitEPwm3Example()
{
EPwm3Regs.TBPRD = SP; // 设置定时器周期
EPwm3Regs.TBPHS.bit.TBPHS = 0x0000; // 相位为0
EPwm3Regs.TBCTR = 0x0000; // 清除计数器
// 设置时基时钟
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 增减计数模式
EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 启用相位加载
EPwm3Regs.TBPHS.bit.TBPHS = SP*4/3+phase1; // 120度相位偏移
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 时钟分频比
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 分频比
EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
// 设置比较值
EPwm3Regs.CMPA.bit.CMPA = EPWM3_CMA;
// 设置动作限定符
EPwm3Regs.AQCTLA.bit.CAU = AQ_SET; // 计数器向上计数匹配时设置PWM3A
EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 计数器向下计数匹配时清除PWM3A
// 高电平有效互补PWM - 设置死区
EPwm3Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 全功能死区
EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 极性选择
EPwm3Regs.DBCTL.bit.IN_MODE = DBA_ALL; // 输入模式
EPwm3Regs.DBRED.bit.DBRED = EPWM3_DB; // 设置上升沿死区
EPwm3Regs.DBFED.bit.DBFED = EPWM3_DB; // 设置下降沿死区
}
// 初始化EPWM4示例
void InitEPwm4Example()
{
EPwm4Regs.TBPRD = SP; // 设置定时器周期
EPwm4Regs.TBPHS.bit.TBPHS = 0x0000; // 相位为0
EPwm4Regs.TBCTR = 0x0000; // 清除计数器
// 设置时基时钟
EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 增减计数模式
EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 启用相位加载
EPwm4Regs.TBPHS.bit.TBPHS = 4*SP/3; // 相位偏移
EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 时钟分频比
EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 分频比
EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
// 设置比较控制
EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 影子模式
EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // 计数器为0时加载
EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// 设置比较值
EPwm4Regs.CMPA.bit.CMPA = EPWM4_CMA;
// 设置动作限定符
EPwm4Regs.AQCTLA.bit.CAU = AQ_SET; // 计数器向上计数匹配时设置PWM4A
EPwm4Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 计数器向下计数匹配时清除PWM4A
// 低电平有效PWM - 设置死区
EPwm4Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 全功能死区
EPwm4Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 极性选择
EPwm4Regs.DBCTL.bit.IN_MODE = DBA_ALL; // 输入模式
EPwm4Regs.DBRED.bit.DBRED = EPWM4_DB; // 设置上升沿死区
EPwm4Regs.DBFED.bit.DBFED = EPWM4_DB; // 设置下降沿死区
// 设置中断 - 用于修改死区时间
EPwm4Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // 在计数器为0时触发中断
EPwm4Regs.ETSEL.bit.INTEN = 1; // 启用中断
EPwm4Regs.ETPS.bit.INTPRD = ET_3RD; // 每3个事件产生一次中断
}
// 初始化EPWM6示例
void InitEPwm6Example()
{
EPwm6Regs.TBPRD = SP; // 设置定时器周期
EPwm6Regs.TBPHS.bit.TBPHS = 0x0000; // 相位为0
EPwm6Regs.TBCTR = 0x0000; // 清除计数器
// 设置时基时钟
EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 增减计数模式
EPwm6Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 启用相位加载
EPwm6Regs.TBPHS.bit.TBPHS = SP*2/3; // 相位偏移
EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 时钟分频比
EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 分频比
EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
// 设置比较控制
EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 影子模式
EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // 计数器为0时加载
EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// 设置比较值
EPwm6Regs.CMPA.bit.CMPA = EPWM6_CMA;
// 设置动作限定符
EPwm6Regs.AQCTLA.bit.CAU = AQ_SET; // 计数器向上计数匹配时设置PWM6A
EPwm6Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 计数器向下计数匹配时清除PWM6A
// 低电平有效PWM - 设置死区
EPwm6Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 全功能死区
EPwm6Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 极性选择
EPwm6Regs.DBCTL.bit.IN_MODE = DBA_ALL; // 输入模式
EPwm6Regs.DBRED.bit.DBRED = EPWM6_DB; // 设置上升沿死区
EPwm6Regs.DBFED.bit.DBFED = EPWM6_DB; // 设置下降沿死区
}
// 初始化EPWM7示例
void InitEPwm7Example()
{
EPwm7Regs.TBPRD = SP; // 设置定时器周期
EPwm7Regs.TBPHS.bit.TBPHS = 0x0000; // 相位为0
EPwm7Regs.TBCTR = 0x0000; // 清除计数器
// 设置时基时钟
EPwm7Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 增减计数模式
EPwm7Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 启用相位加载
EPwm7Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 时钟分频比
EPwm7Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 分频比
EPwm7Regs.TBCTL.bit.SYNCOSEL = 1;
// 设置比较控制
EPwm7Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 影子模式
EPwm7Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm7Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // 计数器为0时加载
EPwm7Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// 设置比较值
EPwm7Regs.CMPA.bit.CMPA = EPWM7_CMA;
// 设置动作限定符
EPwm7Regs.AQCTLA.bit.CAU = AQ_SET; // 计数器向上计数匹配时设置PWM7A
EPwm7Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 计数器向下计数匹配时清除PWM7A
// 低电平有效PWM - 设置死区
EPwm7Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 全功能死区
EPwm7Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 极性选择
EPwm7Regs.DBCTL.bit.IN_MODE = DBA_ALL; // 输入模式
EPwm7Regs.DBRED.bit.DBRED = EPWM7_DB; // 设置上升沿死区
EPwm7Regs.DBFED.bit.DBFED = EPWM7_DB; // 设置下降沿死区
}
您好
我看到你在使用死区示例作为参考,但你提到你想实现相移。你应该举一个C2000Ware中相移的例子。
此外,你能澄清一下你的问题陈述吗?与当前产量相比,你的目标是什么?期待您的回复。