这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » LAUNCHXL-F280049C+实现的是数字电源的控制2

共1条 1/1 1 跳转至

LAUNCHXL-F280049C+实现的是数字电源的控制2

高工
2025-07-15 10:22:50     打赏

接着上篇继续电源控制。

上篇连接:

https://forum.eepw.com.cn/thread/393692/1



 epwm部分

8da1c4ff-0f6c-44b4-89b2-dc695b2a83af.png

图中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部分

502908b4-9af6-4107-8025-5a9ecc8de857.png


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);
        }
    }
}

828fa147-bae4-4412-b6e5-9cc0f32cea3e.png

实际判断工作流程:

image.png

SCI发送中断

1429796a-4e26-4c9d-98d2-0eb50feff000.png

// 重设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上位机界面

678d5c0b-d8e7-460d-a217-535fff14a6fe.png

epwm+compare的测试

逻辑分析仪测试图片

1a24eac0-f9d8-4aee-bba6-d2f893339f63.png

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






共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]