接着上篇继续电源控制。
上篇连接:
https://forum.eepw.com.cn/thread/393692/1
epwm部分

图中EPWM配置界面
核心功能配置
基础波形生成
Time Base,配置计数器工作模式(增/减/增减计数)、周期值(EPWM1_PERIOD)和时钟分频,决定PWM频率。若周期值=1000,系统时钟=100MHz → PWM频率=100kHz(增计数模式)。
Counter Compare,设置比较寄存器(CMPA/CMPB)值,控制占空比。结合Action Qualifier生成高低电平切换点。
输出控制
Action Qualifier,定义计数器匹配时的动作,CMPA匹配时拉高/拉低EPWMxA,CMPB匹配时翻转EPWMxB,用于生成互补PWM。
Dead-Band,插入死区时间(纳秒级),防止H桥上下管直通。支持上升沿/下降沿独立延迟配置。
高精度控制
HRPWM(高分辨率PWM),启用150ps级分辨率,适用于LLC谐振转换器等需精确时序的场景。
保护机制配置
Trip Zone硬件故障保护过流/过压触发时,强制PWM输出预设安全状态(高阻/拉低)。支持多级触发源(如GPIO、ADC故障信号)。
Digital Compare数字比较器实时监控PWM信号,触发条件(如占空比超限)可联动Trip Zone。
Event-Trigger配置ADC启动触发信号PWM周期中点采样,实现电流环同步采样。
引脚映射(PinMux)
EPWM1A → GPIO0/79
EPWM1B → GPIO1/78
将内部PWM信号路由到物理引脚,驱动外部功率器件(如MOSFET/IGBT)。
其他配置
Chopper,启用高频载波调制20kHz,减少电机驱动中的可闻噪声。
Global Load,同步更新多个寄存器CMPA/CMPB,避免动态调整时的波形畸变。
全桥互补波的SYSCONFIG配置,这里主要进行死区的配置
Sysctl enablePeripheral(SYSCTL PERIPH CLK TBCLKSYNC);
使用这行代码,同步两路互补波的时钟。
SCI +FIFO部分

SCI+FIFO的sysconfig配置
// 调试提示 - 需在硬件调试时使能DE引脚(用于RS485收发控制)
// GCK:注意后面这里实际调试的时候要使能DE引脚
// 定义串口接收中断服务函数(Modbus协议)
__interrupt void INT_sci_modbus_RX_ISR(void) {
// 检查并处理串口接收错误
if ((SCI_getRxStatus(sci_modbus_BASE) & SCI_RXSTATUS_ERROR) == SCI_RXSTATUS_ERROR) {
// 411行:清除接收错误中断标志(如帧错误/奇偶校验错)
SCI_clearInterruptStatus(sci_modbus_BASE, SCI_INT_RXERR);
// 强制复位接收FIFO(错误状态下必须复位才能恢复通信)
SCI_resetRxFIFO(sci_modbus_BASE);
// 停止超时定时器(防止错误状态下的误触发)
CPUTimer_stopTimer(CPUTIMER2_BASE);
// 清零接收计数器(丢弃错误数据)
rcvcounter = 0;
}
// 正常数据接收处理
else {
/* 从FIFO读取数据直到清空或缓冲区满 */
while (SCI_getRxFIFOStatus(sci_modbus_BASE) != SCI_FIFO_RX0
&& rcvcounter < RX_BUFFER_LEN) {
// 非阻塞读取字符并存入缓冲区
rcvbuffer[rcvcounter++] = SCI_readCharNonBlocking(sci_modbus_BASE);
}
}
// 启动空闲超时检测(收到数据后重置定时器)
if (rcvcounter != 0) {
// GCK注释:通过CPUTIMER2检测帧间隔超时
CPUTimer_reloadTimerCounter(CPUTIMER2_BASE); // 重载定时器计数值
CPUTimer_startTimer(CPUTIMER2_BASE); // 启动定时器
}
// 清除接收FIFO中断标志(允许下次中断触发)
SCI_clearInterruptStatus(sci_modbus_BASE, SCI_INT_RXFF);
// 清除PIE中断组应答标志(关键!否则无法响应后续中断)
Interrupt_clearACKGroup(INT_sci_modbus_RX_INTERRUPT_ACK_GROUP);
}SCI接收中断
// Modbus发送中断服务函数声明
// - 触发条件:SCI发送FIFO状态变化(如FIFO空或阈值触发)
interrupt void INT_sci_modbus_TX_ISR(void) {
// 444-445:清除发送中断标志(双重清理确保可靠性)
SCI_clearInterruptStatus(sci_modbus_BASE, SCI_INT_TXFF); // 清除FIFO中断
SCI_clearInterruptStatus(sci_modbus_BASE, SCI_INT_TXRDY); // 清除发送就绪中断
// 向发送FIFO填充待传输数据
// - 循环条件:FIFO未满(!=SCI_FIFO_TX16)且缓冲区数据未发完(txcounter != txLen)
while (SCI_getTxFIFOStatus(sci_modbus_BASE) != SCI_FIFO_TX16 && txcounter != txLen) {
// 451:阻塞式写入字符到FIFO(自动触发硬件发送)
SCI_writeCharBlockingFIFO(sci_modbus_BASE, txbuffer[txcounter++]);
}
// 检查发送完成条件
if (SCI_getTxFIFOStatus(sci_modbus_BASE) == SCI_FIFO_TX0) { // FIFO完全空
// 455:检查发送移位寄存器是否空闲(确保最后一字节已发出)
if (HWREGH(sci_modbus_BASE + SCI_O_CTL2) & SCI_CTL2_TXEMPTY) {
// 457-462:Modbus通信结束处理
GPIO_writePin(Rx_TX_enable, 0); // RS485切换到接收模式(DE=0)
txcounter = 0; // 重置发送计数器
txLen = 0; // 清空数据长度标记
Interrupt_disable(INT_sci_modbus_TX); // 关闭发送中断(等待新数据)
}
}
// 未发送完但FIFO已空时的处理
else {
if (txcounter == txLen) { // 数据已全部装入FIFO,但未物理发送完毕
// 469-470:设置FIFO中断触发阈值为空(SCI_FIFO_TX0)
// - 当FIFO完全空时再次触发中断,执行最终状态检查
SCI_setFIFOInterruptLevel(sci_modbus_BASE, SCI_FIFO_TX0, SCI_modbus_FIFO_RX_LVL);
}
}
}
实际判断工作流程:

SCI发送中断

// 重设FIFO中断触发条件为"完全空"(SCI_FIFO_TX0) // - 目的:仅在FIFO和移位寄存器均空时触发中断,确保最后一字节已发出 // - 参数1:sci_modbus_BASE -> SCI模块基地址 // - 参数2:SCI_FIFO_TX0 -> 发送FIFO空触发阈值(0字节剩余) // - 参数3:sci_modbus_FIFO_RX_LVL -> 接收FIFO中断阈值(保持原配置) SCI_setFIFOInterruptLevel(sci_modbus_BASE, SCI_FIFO_TX0, sci_modbus_FIFO_RX_LVL); // 代码块结束符(对应前文的if/while逻辑) // 清除PIE中断组应答标志(关键操作!) // - 作用:允许后续同类型中断再次触发 // - 参数:INT_sci_modbus_TX_INTERRUPT_ACK_GROUP -> SCI发送中断所属的PIE组号 Interrupt_clearACKGroup(INT_sci_modbus_TX_INTERRUPT_ACK_GROUP); // 函数结束符(中断服务程序结尾)
modbus上位机界面

epwm+compare的测试
逻辑分析仪测试图片

对全桥和Buck的输出的pwm进行测试,可以看到全桥的A和B是一路互补的波形,epwm1和EPM2的时序相同,符合预期。对于Buck的pwm的OST模式进行测试,在BUCK_TZ_SIGNAl信号拉高时,BUCK_PWM信号被强制拉低。错误联防有效。
我要赚赏金
