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. 视频演示:
