4. C2000系列DSP外设入门

在OBC(On-Board Charger,车载充电机)的数字控制系统中,DSP(Digital Signal Processor,数字信号处理器)是核心运算与控制单元。C2000系列DSP(如TMS320F28379D、F280049C等)凭借其强大的定点/浮点运算能力、高精度PWM(Pulse Width Modulation,脉宽调制)输出以及丰富的模拟外设,成为OBC数字电源控制的主流选择。本章将聚焦于OBC控制中最常用的五大外设:GPIO(General Purpose Input/Output,通用输入输出)、ADC(Analog-to-Digital Converter,模数转换器)、PWM、定时器以及中断系统。我们将从寄存器级配置出发,结合TI官方库函数(如bitfield或driverlib),深入讲解每个外设的工作原理、配置流程及在OBC实际工况下的编程要点。理解这些外设的协同工作方式,是编写稳定、高效数字电源控制算法的基石。

C2000 DSP 外设协同工作架构(OBC控制视角) C2000 DSP 内核 CLA / FPU / 中断控制 ADC 模块 12/16位, 多通道 V/I/温度采样 ePWM 模块 HRPWM, 死区控制 驱动LLC/移相全桥 GPIO 模块 数字I/O, 复用 继电器/使能/故障 CPU 定时器 周期中断/调度 软件时基/看门狗 中断系统 (PIE) ADC中断→PWM更新 结果寄存器 比较值更新 状态读取/控制 周期中断请求 中断服务路由 模拟信号 数字信号 模拟采样路径 PWM驱动路径

上图展示了OBC数字控制中DSP外设的协同工作关系。ADC负责采集输出电压、电感电流等模拟量,PWM模块产生驱动功率管的开关信号,GPIO控制继电器与状态指示,定时器提供软件调度时基,而中断系统则将这些事件高效地串联起来。下面我们逐一深入剖析每个外设的配置与编程方法。

4.1 GPIO模块:数字I/O的灵活配置

核心原理

GPIO是DSP与外部数字世界交互的桥梁。在OBC中,GPIO常用于控制继电器(如输入/输出继电器)、读取保护信号(如过温、过压比较器输出)、驱动LED指示灯或与外部通信芯片握手。C2000的GPIO引脚通常具有多功能复用(MUX)特性,一个物理引脚可配置为通用数字I/O或特定外设功能(如EPWM输出、SCI接收等)。其内部结构包含输入限定器(Input Qualification)、上拉/下拉电阻、以及输出驱动控制。

配置流程与判断方法

配置GPIO的核心步骤包括:1) 功能选择(MUX):通过GPxMUX寄存器将引脚设置为GPIO模式或外设模式;2) 方向控制:通过GPxDIR寄存器设置输入或输出;3) 输入限定:通过GPxCTRL和GPxQSEL寄存器设置采样窗口,以滤除数字噪声(在OBC强电磁环境下尤为重要);4) 输出特性:通过GPxPUD选择是否启用内部上拉,通过GPxDAT或GPxSET/CLEAR/TOGGLE寄存器控制输出电平。

寄存器组关键位/字段功能说明OBC典型应用
GPxMUXGPIO0-31选择引脚功能(0=GPIO,1=外设)将GPIO24配置为EPWM1A输出
GPxDIRDIR0-31设置引脚方向(0=输入,1=输出)继电器控制引脚设为输出
GPxQSELQSEL0-31输入限定模式(同步/异步/滤波)故障信号输入使用3样本滤波
GPxPUDPUD0-31内部上拉电阻使能(0=使能,1=禁用)开漏输出时启用上拉
GPxDAT/SET/CLEARDAT0-31数据读取与输出控制使用GPxSET置位继电器

案例拆解:继电器控制与状态读取

在OBC启动流程中,需要先闭合输入继电器,再闭合输出继电器。为防止浪涌,两个继电器动作需间隔100ms。我们使用GPIO12控制输入继电器(高电平闭合),GPIO13控制输出继电器,GPIO14读取继电器辅助触点反馈(高电平表示已闭合)。

// 使用driverlib库函数配置GPIO
// 1. 配置GPIO12为输出,控制输入继电器
GPIO_setPinConfig(GPIO_12_GPIO12);          // 设置为GPIO功能
GPIO_setDirectionMode(12, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(12, GPIO_PIN_TYPE_STD);   // 标准推挽输出

// 2. 配置GPIO14为输入,读取反馈信号
GPIO_setPinConfig(GPIO_14_GPIO14);
GPIO_setDirectionMode(14, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(14, GPIO_PIN_TYPE_PULLUP); // 内部上拉,防止悬空
GPIO_setQualificationMode(14, GPIO_QUAL_3SAMPLE); // 3次采样滤波

// 3. 控制逻辑
GPIO_writePin(12, 1);   // 闭合输入继电器
DELAY_US(100000);       // 延时100ms
GPIO_writePin(13, 1);   // 闭合输出继电器

// 4. 读取反馈
uint16_t feedback = GPIO_readPin(14);
if(feedback == 0) {
    // 继电器未闭合,进入故障处理
}
工程风险提示:在OBC高压场景下,GPIO引脚必须串联限流电阻(如1kΩ)并考虑与功率地的隔离。切勿直接用GPIO驱动继电器线圈,必须经过三极管或光耦隔离驱动。输入限定滤波时间需根据实际噪声频率调整,过长的滤波时间会延迟故障响应。

4.2 ADC模块:高精度模拟量采集

核心原理

ADC是数字控制环路的“眼睛”。OBC需要实时采集输入电压、输入电流、输出电压、输出电流以及多个温度点。C2000的ADC模块通常为12位或16位分辨率,支持多通道分时采样,并具有后处理模块(PPB)用于自动比较和触发。关键特性包括:采样保持电路、排序器(Sequencer)、触发源选择(软件、定时器、PWM事件)以及结果寄存器。在数字电源中,ADC采样与PWM载波同步至关重要,通常由PWM模块产生ADC触发信号,确保在功率管开关的特定时刻(如电流波形的波峰或波谷)进行采样。

配置流程与操作步骤

ADC配置的关键步骤:1) 时钟与分辨率设置:通过ADCCTL2寄存器设置ADC时钟分频和分辨率(12/16位);2) 通道选择与排序:通过ADCSOCxCTL寄存器配置每个SOC(Start of Conversion)对应的通道和触发源;3) 采样窗口设置:通过ADCSOCxCTL的ACQPS字段设置采样窗口时长,需满足信号源阻抗要求;4) 中断配置:通过ADCINTSEL1N2设置转换结束中断,用于触发控制算法。

采样窗口计算:采样窗口时间 = (ACQPS + 1) × SYSCLK周期。例如,系统时钟为100MHz(10ns周期),若信号源阻抗为1kΩ,ADC内部电容为12pF,则所需采样时间约为5×RC = 5×1kΩ×12pF = 60ns。因此ACQPS应设置为(60ns/10ns)-1 = 5,取整后设为6以确保裕量。

案例拆解:与PWM同步的电流采样

在OBC的LLC谐振变换器中,通常需要采样谐振电流或输出电流。为保证采样精度,应在功率管关断瞬间(电流续流阶段)进行采样。我们配置ePWM1模块在周期匹配时产生ADC触发信号,并配置ADC通道A0采样输出电流。

// 配置ADC模块
ADC_setMode(ADCA_BASE, ADC_RESOLUTION_12BIT, ADC_MODE_SINGLE_ENDED);
ADC_setPrescaler(ADCA_BASE, ADC_CLK_DIV_4);   // ADC时钟 = SYSCLK/4 = 25MHz
ADC_setInterruptPulse(ADCA_BASE, ADC_PULSE_END_OF_CONV); // 转换结束产生中断脉冲

// 配置SOC0:通道A0,由ePWM1触发
ADC_setSOCConfig(ADCA_BASE, ADC_SOC_NUMBER0, ADC_CH_ADCIN0, ADC_TRIGGER_EPWM1_SOCA);
ADC_setSOCSampleWindow(ADCA_BASE, ADC_SOC_NUMBER0, ADC_SAMPLE_WINDOW_7_CYCLES); // 7个周期

// 使能ADC中断1
ADC_enableInterrupt(ADCA_BASE, ADC_INT_NUMBER1);
ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
ADC_enableInterruptSignal(ADCA_BASE, ADC_INT_NUMBER1);

// 在ADC中断服务函数中读取结果
__interrupt void adc_isr(void) {
    uint16_t current_raw = ADC_readResult(ADCA_BASE, ADC_SOC_NUMBER0);
    // 转换为实际电流值:current = (current_raw / 4096) * Vref / Gain
    // 更新控制算法变量
    ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
经验之谈:在OBC中,建议将ADC的采样触发与PWM载波同步,并设置一定的延迟(通过PWM模块的TBPHS或AQCTLA),以避开开关噪声。同时,对采样结果进行软件滤波(如移动平均),但需注意滤波带来的相位延迟,在闭环设计中需补偿。

4.3 ePWM模块:数字电源的核心控制单元

核心原理

ePWM模块是数字电源控制的核心,它决定了功率管的开关频率、占空比和死区时间。C2000的ePWM模块包含时基(TB)、比较(CC)、动作限定(AQ)、死区(DB)、斩波(PC)和故障保护(TZ)等子模块。在OBC中,我们常使用ePWM生成互补的PWM对(如移相全桥的上下管),并利用HRPWM(高分辨率PWM)实现微小的占空比调节,以满足输出电压精度要求。

配置流程与关键参数

配置ePWM的核心步骤:1) 时基设置:设置TBPRD(周期值)和TBCLK(时基时钟),确定开关频率;2) 比较值设置:设置CMPA/CMPB,决定占空比;3) 动作限定:配置AQCTLA/AQCTLB,定义在计数匹配时输出高或低;4) 死区设置:配置DBCTL和DBRED/DBFED,设置上升沿和下降沿延迟;5) 故障保护:配置TZSEL和TZCTL,实现硬件级过流保护。

子模块关键寄存器OBC典型配置作用
时基TBTBCTL, TBPRDTBPRD=1000, 向上-向下计数产生100kHz对称PWM
比较CCCMPA, CMPBCMPA=500, CMPB=250设定占空比50%和25%
动作AQAQCTLA, AQCTLBCAU=SET, CAD=CLEAR定义输出逻辑
死区DBDBCTL, DBRED, DBFEDDBRED=50, DBFED=50设置500ns死区时间
故障TZTZSEL, TZCTLTZA=HIGH_Z过流时输出高阻

案例拆解:移相全桥PWM生成

OBC中常用的移相全桥拓扑需要四路PWM信号,其中Q1/Q3互补,Q2/Q4互补,且Q1与Q2之间存在移相角。我们使用ePWM1和ePWM2模块,通过同步机制实现移相。

// ePWM1配置(Q1/Q3桥臂)
EPWM_setTimeBasePeriod(EPWM1_BASE, 1000);   // 100kHz @ 100MHz TBCLK
EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_setPhaseShift(EPWM1_BASE, 0);          // 主模块,移相为0
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setDeadBandDelayPulse(EPWM1_BASE, EPWM_DB_RED_LOAD, 50); // 500ns死区
EPWM_setDeadBandDelayPulse(EPWM1_BASE, EPWM_DB_FED_LOAD, 50);

// ePWM2配置(Q2/Q4桥臂),移相角由CMPA控制
EPWM_setTimeBasePeriod(EPWM2_BASE, 1000);
EPWM_setTimeBaseCounterMode(EPWM2_BASE, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_setPhaseShift(EPWM2_BASE, 0);  // 通过同步后的相位寄存器控制
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
// 移相角通过修改EPWM2的CMPA实现,例如CMPA=750表示25%移相
关键提醒:死区时间设置必须大于功率管关断延迟与驱动芯片延迟之和,否则会导致桥臂直通。在OBC中,SiC MOSFET的关断延迟通常为几十纳秒,建议死区时间设置在200-500ns之间,并通过实际测试验证。同时,故障保护(TZ)必须配置为硬件级联,确保在软件失效时能快速关断PWM。

4.4 CPU定时器与中断系统:实时控制的时间骨架

核心原理

CPU定时器(Timer0/1/2)提供精确的软件时基,用于周期性任务调度(如每100μs执行一次电压环计算)。中断系统(PIE,外设中断扩展)负责管理多个外设中断源,并按照优先级路由至CPU。在OBC控制中,典型的中断优先级设计为:ADC转换结束中断(最高,用于电流内环) > ePWM故障中断(用于保护) > 定时器中断(用于慢速任务) > 通信中断(如CAN)。

配置流程与编程方法

定时器配置步骤:1) 设置周期:通过PRD寄存器设定周期值;2) 设置分频:通过TDDRH:TDDR设定预分频;3) 使能中断:通过TCR寄存器使能定时器中断。中断系统配置步骤:1) 使能PIE模块;2) 在PIE向量表中注册中断服务函数;3) 使能对应PIE组的中断;4) 在ISR中清除中断标志并响应。

中断延迟优化:在OBC控制中,电流环的延迟直接影响控制带宽。为最小化中断延迟,建议:1) 将控制算法代码放置在RAM中运行;2) 避免在ISR中使用耗时的库函数;3) 使用CLA(控制律加速器)处理数学运算,将CPU解放出来处理逻辑。

案例拆解:基于定时器的软件调度器

在OBC中,我们通常需要以不同频率执行不同任务:电流环(100kHz)、电压环(10kHz)、通信处理(1kHz)、状态机(100Hz)。使用CPU定时器0产生1ms中断,在中断中通过软件计数器实现多速率调度。

// 配置定时器0,周期1ms
CPUTimer_setPeriod(CPUTIMER0_BASE, 100000); // 100MHz时钟,100000周期=1ms
CPUTimer_startTimer(CPUTIMER0_BASE);
CPUTimer_enableInterrupt(CPUTIMER0_BASE);

// 定时器中断服务函数
__interrupt void timer0_isr(void) {
    static uint16_t tick_10k = 0, tick_1k = 0, tick_100 = 0;
    
    // 1kHz任务:电压环计算
    if(++tick_1k >= 10) { // 每10ms执行一次
        tick_1k = 0;
        voltage_loop();
    }
    
    // 100Hz任务:状态机处理
    if(++tick_100 >= 100) {
        tick_100 = 0;
        state_machine();
    }
    
    // 1kHz任务:CAN通信发送
    if(++tick_10k >= 1000) {
        tick_10k = 0;
        can_send_status();
    }
    
    CPUTimer_clearInterruptStatus(CPUTIMER0_BASE);
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

常见误区与总结复盘

  • 误区一:ADC采样未与PWM同步。导致采样噪声增大,控制性能下降。应使用PWM事件触发ADC,并调整采样延迟。
  • 误区二:GPIO输入未做滤波。在OBC强电磁环境下,会导致误触发。应使用输入限定器或外部RC滤波。
  • 误区三:死区时间设置不当。过短导致直通,过长导致输出波形畸变。应通过示波器实测开关波形来确定最优死区。
  • 误区四:中断优先级分配不合理。导致电流环响应延迟。应将ADC中断设为最高优先级,并确保ISR执行时间小于开关周期。
  • 误区五:忽视定时器溢出。在长时间运行后,软件计数器溢出导致调度异常。应使用足够宽的数据类型或定期清零。

总结而言,C2000外设的配置需要深入理解OBC的功率级特性和控制需求。GPIO是逻辑控制的基础,ADC是反馈信号的入口,PWM是执行机构,定时器与中断系统则是实时性的保障。在实际开发中,建议先使用TI的SysConfig工具进行图形化配置,生成初始化代码,再根据具体工况进行微调。同时,务必利用DSP的硬件断点和实时调试功能,观察关键变量(如ADC采样值、占空比)在动态过程中的变化,确保每个外设都在正确的时间、以正确的参数工作。只有将外设配置与算法需求紧密结合,才能发挥C2000在数字电源控制中的最大潜力。