一、dsPIC33 系列选型建议
数字电源专用型号推荐
| 系列 | 型号示例 | 特点 | 适用场景 |
|---|---|---|---|
| dsPIC33CK | dsPIC33CK256MP506 | 100MHz, 5V 容忍, 高分辨率 PWM | 工业电源、服务器电源 |
| dsPIC33EP GS | dsPIC33EP512GM710 | 70MHz, 增强型 PWM, 高速 ADC | 消费电子、LED 驱动 |
| dsPIC33CH | dsPIC33CH128MP508 | 双核架构, 主核+从核 | 复杂多路电源系统 |
首选推荐 :dsPIC33CK 系列,专为数字电源优化,支持 250ps PWM 分辨率
二、数字电源系统架构
┌─────────────────────────────────────────────────────────┐
│ dsPIC33 数字电源系统 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 模拟前端 │ │ 数字控制核 │ │ 功率驱动 │ │
│ │ │ │ │ │ │ │
│ │ • 电压采样 │───▶│ • PID/2P2Z │───▶│ • PWM 输出 │ │
│ │ • 电流采样 │ │ • 状态机 │ │ • 死区控制 │ │
│ │ • 温度监测 │ │ • 软启动 │ │ • 故障保护 │ │
│ │ • 输入欠压 │ │ • 通信协议 │ │ • 同步整流 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 功率级拓扑 (Buck/Boost/LLC) │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
三、核心外设配置详解
1. 高分辨率 PWM 配置
c
// PWM 初始化 - 用于 Buck 变换器
void PWM_Buck_Initialize(void)
{
// 配置 PWM 时钟
PCLKCONbits.MCLKSEL = 0; // 主时钟
PCLKCONbits.DIVSEL = 0; // 不分频
// 配置 PWM1(主开关管)
PWMCON1bits.CAM = 0; // 边沿对齐模式
PWMCON1bits.POL = 0; // 高有效
PWMCON1bits.DTC = 0; // 死区禁用(Buck 不需要)
// 设置 PWM 频率 500kHz
PHASE1 = 2000; // 周期 = 2000 个 PWM 时钟
SPHASE1 = 2000; // 辅助相位
// 初始占空比 50%
PDC1 = 1000; // 主占空比
SDC1 = 1000; // 辅助占空比
// 触发 ADC 采样(在 PWM 周期中间)
TRGCON1bits.DTM = 0; // 触发选择
TRIG1 = 1500; // 触发点(75% 位置)
// 使能 PWM
PWMKEY = 0xABCD; // 解锁
PWMKEY = 0x4321;
PWMCON1bits.MTBS = 0; // 立即更新
PTENbits.PTEN = 1; // 使能 PWM 定时器
}
2. 高速 ADC 配置
c
// ADC 初始化 - 用于电压和电流采样
void ADC_Power_Initialize(void)
{
// 配置 ADC 时钟
ADCON1bits.FORM = 0; // 整数格式
ADCON1bits.SSRC = 2; // 定时器触发
ADCON1bits.ASAM = 1; // 自动采样
// 配置 ADC 通道
ADCHS0bits.CH0SA = 0; // AN0 - 输出电压采样
ADCHS0bits.CH0SB = 1; // AN1 - 输出电流采样
// 配置转换触发源(PWM1 触发)
ADTRIG0bits.TRGSRC0 = 0b01000; // PWM1 触发 ADC0
// 配置中断
ADIELbits.IE0 = 1; // 使能 AN0 中断
ADIELbits.IE1 = 1; // 使能 AN1 中断
// 使能 ADC
ADCON1bits.ADON = 1;
}
// ADC 中断服务程序
void __attribute__((interrupt, auto_psv)) _ADCI0Interrupt(void)
{
static uint16_t adc_count = 0;
// 读取采样值
voltage_sample = ADCBUF0; // 输出电压
current_sample = ADCBUF1; // 输出电流
// 清除中断标志
IFS0bits.ADCI0IF = 0;
adc_count++;
if (adc_count >= 10) { // 每 10 次采样执行一次控制
adc_count = 0;
control_flag = 1; // 置位控制标志
}
}
3. 数字补偿器实现
c
// 2P2Z 数字补偿器结构体
typedef struct {
int32_t b0, b1, b2; // 前向系数
int32_t a1, a2; // 反馈系数
int16_t shift; // 右移位数(Q 格式)
int16_t min, max; // 输出限幅
int32_t e_n1, e_n2; // 误差历史
int32_t y_n1, y_n2; // 输出历史
} COMP_2P2Z_t;
// 2P2Z 补偿器执行函数
int16_t Comp_2P2Z_Execute(COMP_2P2Z_t *comp, int16_t error)
{
int64_t acc = 0;
// 差分方程: y[n] = b0*e[n] + b1*e[n-1] + b2*e[n-2]
// - a1*y[n-1] - a2*y[n-2]
acc = ((int64_t)comp->b0 * error) >> comp->shift;
acc += ((int64_t)comp->b1 * comp->e_n1) >> comp->shift;
acc += ((int64_t)comp->b2 * comp->e_n2) >> comp->shift;
acc -= ((int64_t)comp->a1 * comp->y_n1) >> comp->shift;
acc -= ((int64_t)comp->a2 * comp->y_n2) >> comp->shift;
// 限幅保护
if (acc > comp->max) acc = comp->max;
if (acc < comp->min) acc = comp->min;
// 更新历史数据
comp->e_n2 = comp->e_n1;
comp->e_n1 = error;
comp->y_n2 = comp->y_n1;
comp->y_n1 = (int16_t)acc;
return (int16_t)acc;
}
四、完整 Buck 变换器示例
主程序框架
c
/*
* 基于 dsPIC33CK 的同步 Buck 数字电源
* 输入电压: 12-24V
* 输出电压: 5V
* 输出电流: 0-10A
* 开关频率: 500kHz
*/
#include "xc.h"
#include "power_config.h"
// 全局变量
BUCK_CONVERTER_t buck;
COMP_2P2Z_t voltage_comp;
COMP_2P2Z_t current_comp;
int main(void)
{
// 系统初始化
System_Initialize();
Clock_Initialize();
GPIO_Initialize();
PWM_Buck_Initialize();
ADC_Power_Initialize();
// 补偿器参数初始化(由 PowerSmart DCLD 生成)
Comp_2P2Z_Init(&voltage_comp);
Comp_2P2Z_Init(¤t_comp);
// 电源状态机初始化
Buck_StateMachine_Init(&buck);
// 使能全局中断
INTCON2bits.GIE = 1;
while(1) {
// 主循环 - 处理非实时任务
if (control_flag) {
control_flag = 0;
// 电压环计算
int16_t v_error = buck.v_ref - voltage_sample;
int16_t v_output = Comp_2P2Z_Execute(&voltage_comp, v_error);
// 电流环前馈(可选)
int16_t i_error = v_output - current_sample;
int16_t duty = Comp_2P2Z_Execute(¤t_comp, i_error);
// 更新 PWM 占空比
PWM_Update_Duty(duty);
}
// 故障检测
Fault_Monitor();
// 通信处理(I2C/SPI/UART)
Communication_Handler();
}
}
参考代码 基于dsP33系列单片机的数字电源源代码 www.youwenfan.com/contentcsv/72585.html
五、调试与测试建议
关键调试点
| 测试项 | 方法 | 预期结果 |
|---|---|---|
| PWM 输出 | 示波器观察 PWM1H/PWM1L | 互补输出,无重叠 |
| ADC 采样 | 监控 ADCBUFx 寄存器 | 电压比例正确 |
| 软启动 | 观察输出电压上升曲线 | 平滑上升,无过冲 |
| 负载调整率 | 0A→10A 阶跃变化 | 电压偏差 < 2% |
| 效率测试 | 输入输出功率测量 | 满载效率 > 90% |
常用调试工具
c
// 调试输出宏
#define DEBUG_PRINT_ADC
#ifdef DEBUG_PRINT_ADC
void Debug_Print_Samples(void)
{
printf("Vout=%dmV, Iout=%dmA, Duty=%d\r\n",
voltage_sample * VOLTAGE_SCALE,
current_sample * CURRENT_SCALE,
PDC1);
}
#endif