• 3
    回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

【 2025 DigiKey 杯】基于C2000的单相双向ACDC电源

1、项目介绍

平时在调试电机等设备的时候,电机的急加速和急减速会造成电源的大幅波动,而使用电阻性负载又会白白消耗掉这些能量。在此时,如果能有一个双向电源,则能将多出来的电能再回馈回电网,就能避免能源的浪费。

基于此,我设想研发了一款双向acdc电源,在保证安全的前提下,使用了220转24Vac的变压器进行电压转换,再使用一级双向ACDC与一级双向DCDC构成一个输出电压电流均可调节的双向ACDC电源。

2、项目构成

1)硬件部分

图腾柱拓扑如下图

DCDC级则使用正向降压,反向升压的结构,其结构如下图

电路的主干设计好后,则考虑采集与控制和辅助电源等部分,

· 电流采集部分使用霍尔电流传感器,型号为CC6903-10A,具有采样输出隔离,线性度好,外围简单等优点。

· 交流电压采集使用运算放大器LMV358,在价格低廉的同时,能保证输出电压的线性。使用一个单元输出偏置电压,一个单元输出可供单片机进行采样的,输出0-3.3V范围的带偏置且缩小后的直流电压。

· 直流电压采样部分则使用最简单的电阻分压即可满足其功能。

驱动部分使用的是FD6288,有三个半桥驱动,可以驱动我这六个mosfet。

· 控制部分则使用德州仪器的TMS320F280049C,其以高性能,高实时与丰富接口著称,广泛地应用于各种光伏逆变器、电机控制器、数字开关电源等领域,这里使用的是单独的,我之前开源的核心板(开源链接),在之后其他项目的开发中可以随意的切换与移植。

辅助电源部分则需要将母线直流电压变成可供驱动器、运放、mcu供电,这里使用的是LM5164与TPS542201进行两级降压,LM5164将母线电压变为12V稳定直流电供驱动器使用。tps562201进行二级降压到5V,给核心板供电,LP5907则将5V降压至3.3V给运放和霍尔电流传感器进行供电。

硬件部分最后是pcb贴图部分,核心板在之前的开源链接里已经展示,在这里不做赘述。这里仅展示底板部分:

2)软件部分

使用ePWM触发adc-soc采样,完成采样后触发中断,再使用adc中断来触发状态机,软件状态机只有控制量与流程。可以在adc中断后完成赋值,即实现解耦。这里贴上部分源码。如下为参数定义:

/*
 * ACDC_Defines.h
 *
 *      Author: _海
 *
 *  @brief 双向AC/DC控制相关的阈值与通用宏定义
 *
 *  本文件主要用于集中管理AC/DC控制模块中使用的各种阈值、采样通道、
 *  以及控制周期等基础参数,保证主控制模块(bidiracdc.c)逻辑更加清晰。
 */

#ifndef APP_INC_ACDC_DEFINES_H_
#define APP_INC_ACDC_DEFINES_H_


#define PI            3.1415926f
#define SQRT_2        1.4142135f
#define ADC_TO_VOLT   0.00080586f  //即3.3f / 4096.0f



#define ISR_Ts                       0.00002f
#define SAMPLE_NUM                   1000
#define SAMPLE_NUM_INV               0.001f

/******************* ACDC侧参数定义 *********************************/

#define AC_OVERVOLTAGE_VRMS      30.0f
#define AC_UNDERVOLTAGE_VRMS     20.0f
#define AC_OVERCURRENT_ARMS      2.5f
#define DC_OVERVOLTAGE_V         48.0f
#define DC_UNDERVOLTAGE_V        30.0f

#define DC_OVERVOLTAGE_THRESHOLD     48.0f
#define DC_UNDERVOLTAGE_THRESHOLD    25.0f


#define BIDIRACDC_ADC_UDC_CHANNEL        0
#define BIDIRACDC_ADC_UAC_CHANNEL        1
#define BIDIRACDC_ADC_IAC_CHANNEL        2
#define BIDIRACDC_ADC_TEMP_CHANNEL       3


#define DeadZone_IN            5.0f
#define DeadZone_OUT     (1.05f * DeadZone_IN)

#define RMS_ALPHA           0.2f            // 一阶低通系数,可调(0.1~0.3都很好)
#define RMS_BETA            (1.0f - RMS_ALPHA)
//
#define UAC_SCALE 30.1f
#define IAC_SCALE 5.02f
#define VDC_SCALE 19.825f
//Notch_filter Parameters
#define NOTCH_W0   (200.0f * PI)
#define NOTCH_BW   (200.0f * PI)
//PR controller Parameters
#define IPR_KP     0.5f
#define IPR_KR     5.0f
#define IPR_W0     (100.0f * PI)
#define IPR_BW     (0.5f * 2.0f * PI)
//PI controller Parameters
#define VPID_KP       0.01f
#define VPID_KI       0.1f
#define VPID_UPLIM    15.0f
#define VPID_DOWNLIM  -15.0f
//偏置测量与保护阈值
#define SELF_CHECK_FAIL_MAX         8
#define OFFSET_UAC_MIN              1.35f      // 1.65V ± 300mV(根据实际硬件调整)
#define OFFSET_UAC_MAX              1.95f
#define OFFSET_IAC_MIN              1.35f
#define OFFSET_IAC_MAX              1.95f
//adc阈值保护
#define ADC_MIN_VALID 30
#define ADC_MAX_VALID 4070

/******************** DCDC侧参数定义 *************************/

#define VOUT_OVERVOLT_V    60.0f
#define VOUT_UNDERVOLT_V   30.0f
#define IOUT_OC_A          10.0f
#define IOUT_SC_A          50.0f

/******************** 调试开关 *************************/
// 取消注释可打开调试代码(例如串口打印、固定占空比测试等)
#define SW_DEBUG

#endif /* APP_INC_ACDC_DEFINES_H_ */

接着是主结构体,即整个系统运行的变量都存储在这里,首先是ACDC部分:

/* ============================================================
 *             双向 ACDC 主控制结构体(核心参数)
 * ============================================================ */
typedef struct {

  /* ---------- 实时采样值 ---------- */
  float AC_Voltage;          // AC 输入电压(瞬时)
  float AC_Current;          // AC 输入电流(瞬时)
  float DCLink_Voltage;      // 母线电压 Udc

  /* ---------- 采样偏置 ---------- */
  float Uac_offset;          // 电压采样零点偏置
  float Iac_offset;          // 电流采样零点偏置

  /* ---------- 电压/电流参考辅助变量 ---------- */
  float Vin_div_Vrms;        // Uac / Vrms(单位幅值正弦波 ≈1.414)
  float Inv_Vrms2;           // 电压环输出→电流参考比例因子

  /* ---------- 状态与故障 ---------- */
  ErrorCode_t  ErrorCode;    // 当前故障码
  ACDCState_t  PowerState;   // 当前状态机状态
  AC_State_t   AC_State;     //交流电所处位置
  /* ---------- RMS 计算对象 ---------- */
  RMS_Calc_t AC_Vrms;        // AC 电压 RMS
  RMS_Calc_t AC_Irms;        // AC 电流 RMS

  /* ---------- 控制器 & 滤波器 ---------- */
  NotchFilter Notch;         // 陷波滤波器,用于电压环谐振抑制
  PidObject   vPID;          // 电压 PI 环(外环)
  PRObject    iPR;           // 电流 PR 环(内环)
  ACDC_Mode_t WorkMode;      // 模式:整流/逆变

  /* ---------- PWM / GPIO 输出 ---------- */
  Output_t Ctrl_OutPut;      // 状态机最终输出(写入硬件)

} AC_BidiLink_t;

其次是DCDC部分

typedef enum {
    STATE_INIT,
    STATE_RAMP_UP,       // 软起动
    STATE_STANDBY,       // 待机关闭输出状态
    STATE_RUNNING,       // 正常运行
    STATE_FAULT,         // 故障停机
} DCDCState_t;

typedef struct {

  /* ---------- 实时采样值 ---------- */
  float OUTPUT_Voltage;          // 输出电压
  float OUTPUT_Current;          // 输出电流

  /* ---------- 保护设定值 ---------- */
  float output_ovp;
  float output_ucp;
  float output_ocp;

  /* ---------- 采样偏置 ---------- */
  float Idc_offset;          // 电流采样零点偏置

  /* ---------- 状态与故障 ---------- */
  ErrorCode_t  ErrorCode;    // 当前故障码
  DCDCState_t  PowerState;   // 当前状态机状态
  run_mode_t   RUN_MODE;     //当前工作模式

  /* ---------- 控制器 & 滤波器 ---------- */
  PidObject vPID,iPID;       // 电压电流 PI 环

  /* ---------- PWM / GPIO 输出 ---------- */
  float Duty;
  bool  output;//output enable or not

} DC_BidiLink_t;

然后是状态机部分,这里仅展示交流ACDC状态机切换部分,由于源码过长就不贴上了。

void BidiACDC_StateMachine(AC_BidiLink_t *p, uint16_t *AdcData)
{
    switch(p->PowerState)
    {
        case STATE_INIT://初始化参数
            p->PowerState = BiDiACDC_ParaConfig(p);
            break;

        case STATE_SELF_CHECK://自检、含偏置检测
            p->PowerState = BiDiACDC_SelfCheck(p, AdcData);
            break;

        case STATE_PRECHARGE://直流母线预充电
            p->PowerState = BiDiACDC_Precharge(p, AdcData);
            break;

        case STATE_STANDBY://就绪
            p->PowerState = BiDiACDC_StandBy(p, AdcData);
            break;
        case STATE_ACDC_RUN://主控制代码
            p->PowerState = BiDiACDC_Run(p, AdcData);
            break;
        case STATE_FAULT://故障
            p->PowerState = BiDiACDC_Fault(p, AdcData);
            break;
    }
}

3、存在问题的地方

现在已经能完成的部分包括:状态机的正确转移与变量处理,数据的测量等。

还有控制的归一化与比例积分PI控制、比例谐振PR算法和100Hz-Notch陷波器算法的集成。但电流采样位置有巨大噪声,如图所示

个人估计是严重的pcb布局问题,所以对于这个完整的项目来说,只完成了部分,如果后续有机会的话会继续优化。

4、优化方向

优化pcb布局,减小测量上的噪声,使控制可以正常和准确的运行。

算法可以继续优化,尽量贴近工业级的保护与控制水准。

提及可以继续缩小,可以成为pocket那种。

5. 视频演示:

全部回复(3)
正序查看
倒序查看
01-19 14:33

原来是烂尾工程。

0
回复
446727704
LV.3
3
03-04 22:04

【DigiKey杯点评】+

0
回复
446727704
LV.3
4
03-04 22:05

【DigiKey杯点评】+本作品基于TI C2000系列控制器设计单相双向AC/DC电源,方案成熟、控制思路清晰。实现能量双向流动、功率因数校正与稳定闭环控制,算法与硬件匹配合理,具备并网与储能应用潜力。电路拓扑规范、驱动与采样设计可靠,动态响应与稳态精度表现良好。整体专业性强,是一份工程价值较高的电力电子实训作品,仅在效率与EMC方面可继续优化。

0
回复