一、项目介绍
本项目的目的是设计并实现一个可调降压电源,其输出电压可以根据需要进行调节。该系统适用于需要不同电压供电的电子设备,并且能够快速响应负载变化。
1.1 硬件介绍
本项目采用的核心硬件是 Microchip 的 dsPIC33CK64MC105 Curiosity Nano 评估板。该板是以 dsPIC33CK64MC105 数字信号控制器为核心,提供了丰富的外设和接口,非常适合电源控制、信号处理和电机控制等应用。主要硬件组成如下:
- 主控制器:dsPIC33CK64MC105 (100 MHz dsPIC DSC)
- 功率拓扑:同步降压转换器(Buck Converter)
- 输入电源:锂电池 3.7V
- 负载:300电机
- 关键外设:
- ADC模块:采集输出电压与目标设定电压。
- PWM模块:控制功率MOSFET开关。
- 定时器:精确控制采样周期。
- GPIO:用户按键采集。
- UART模块: 调试日志输出。
- 用户接口:
- 电位器:调节目标电压。
- 按键:模式切换。
- 串口:调试。
1.2 功能概览
- 输入电压:DC 4V–12V(兼容锂电池、直流电源)。
- 电压调节:输出电压 0 - 3.3V 无级可调.
- 闭环控制:基于PID算法的电压稳压控制。
- 串口监控:通过串口每秒输出当前调节电位器采样电压与输出电压。
1.3 设计思路
利用 dsPIC33CK64MC105 的高速 PWM 和 ADC 功能实现对降压电源的精准控制。通过ADC检测输出电压并与设定值比较,然后通过 PID 算法调节 PWM 占空比来稳定输出电压。
- 数字化控制:利用评估板的ADC实时采样输出电压,通过PID算法动态调整PWM占空比,实现闭环反馈。
- 模块化设计:
- 功率级与控制电路分离,减少高频噪声干扰。
- 通过GPIO扩展连接外部电位器调整输出电压。
- 电压调整:利用评估板的ADC实时采样电位器电压,将电位器电压设置为输出的目标电压值。
- 效率优化:PWM频率设置为10kHz,平衡效率与元器件尺寸及手上的测试设备。
二、功能实现
2.1 软件流程图
系统初始化后完成外设配置与参数加载,进入主循环执行按键检测,触发模式切换。每秒更新LED状态并记录日志。定时器中断驱动ADC采样,经PID算法计算后动态调整PWM占空比,实现电压闭环控制,同时支持模式切换与实时状态反馈。
2.2 实现过程
硬件连接:
- 将MOS管栅极连接至评估板的PWM输出引脚(RB15)
- 输出电压通过分压电阻接入ADC通道(RB2)
- 电位器中间端接ADC通道(RA0)用于设定电压
参考面包板接线示意图如下:
软件配置:
- 初始化PWM频率为10kHz。
- 配置ADC采样率为10ksps,使用软件控制触发转换。
- 配置串口输出
- 配置用户按键输入
- 配置LED控制输出
关键代码片段:
- 编写PID控制函数(比例系数Kp=100,积分Ki=1)
// PID参数结构体
typedef struct {
float Kp; // 比例系数
float Ki; // 积分系数
float Kd; // 微分系数
float integral; // 积分项累积值
float prev_error; // 上一次误差值
float output_min; // 输出最小值
float output_max; // 输出最大值
} PID_Controller;
// 初始化PID控制器
void PID_Init(PID_Controller *pid, float Kp, float Ki, float Kd, float min, float max) {
pid->Kp = Kp;
pid->Ki = Ki;
pid->Kd = Kd;
pid->integral = 0.0f;
pid->prev_error = 0.0f;
pid->output_min = min;
pid->output_max = max;
}
// 计算PID输出
float PID_Compute(PID_Controller *pid, float setpoint, float input) {
// 计算当前误差
float error = setpoint - input;
// 比例项
float proportional = pid->Kp * error;
// 积分项 (带抗饱和)
pid->integral += error;
// 积分限幅防止积分饱和
if (pid->integral > pid->output_max) pid->integral = pid->output_max;
else if (pid->integral < pid->output_min) pid->integral = pid->output_min;
float integral = pid->Ki * pid->integral;
// 微分项 (使用输入微分减少设定值突变的影响)
float derivative = pid->Kd * (input - pid->prev_error);
pid->prev_error = input; // 保存当前输入值用于下次计算
// 计算总输出
float output = proportional + integral - derivative;
// 输出限幅
if (output > pid->output_max) output = pid->output_max;
else if (output < pid->output_min) output = pid->output_min;
return output;
}
// 初始化PID控制器
PID_Init(&pid, 100.0f, 1.0f, 10.0f, 0.0f, CCP1PRL*1.0f); // Kp, Ki, Kd, min, max
- 按键检测与消抖实现
// 按键检测函数
KeyEvent check_key_event(bool current_state, uint32_t *last_time, KeyState *key_state) {
uint32_t current_time = currTick; // 当前时间(毫秒)
switch (*key_state) {
case KEY_STATE_IDLE:
if (!current_state) { // 检测到按键按下(假设按下为低电平)
*last_time = current_time; // 记录当前时间
*key_state = KEY_STATE_DEBOUNCE; // 进入消抖状态
}
break;
case KEY_STATE_DEBOUNCE:
// 检查是否达到消抖时间
if (current_time - *last_time >= DEBOUNCE_DELAY_MS) {
if (!current_state) { // 再次确认按键仍处于按下状态
*key_state = KEY_STATE_PRESSED;
return KEY_EVENT_PRESSED; // 返回按键按下事件
} else {
*key_state = KEY_STATE_IDLE; // 抖动,返回空闲状态
}
}
break;
case KEY_STATE_PRESSED:
if (current_state) { // 按键已释放
*key_state = KEY_STATE_IDLE; // 返回空闲状态
}
break;
}
return KEY_EVENT_NONE;
}
- 定时器回调实现
static void Timer_Callback(void)
{
currTick++;
target_voltage = adc->ConversionResultGet(Channel_AN0); // TODO: Replace with the ADC Channel you selected in the Pin Grid View
current_voltage = adc->ConversionResultGet(Channel_AN1);
if(automaticAdjustment) {
uint16_t dutyCycle = PID_Compute(&pid, target_voltage, current_voltage * 2.0);
UpdateDutyCycle(dutyCycle);
} else {
uint16_t dutyCycle = ((double) target_voltage / (double) MAXIMUM_INPUT_VALUE) * CCP1PRL;
UpdateDutyCycle(dutyCycle);
}
adc->SoftwareTriggerEnable(); // Trigger the ADC conversion via software
}
三、功能展示
调压
带载测试
反馈补偿
四、总结
遇到的问题
- 首先要吐槽的就是IDE,应该是很多人反馈过了,资源服务器都在国外,国内用户访问没有梯子不是慢就是各种报错。
- 本来是打算做可调升压电源的,可惜由于没有电源方面的经验,制作的电路板没有限流保护,导致升压时很容易过流导致MOS烧毁。好在制作的电路板是支持 Buck - Boost 模式的。故只焊接 Buck 部分电路改为制作可调降压电源。
心得体会
本项目成功实现了基于dsPIC33CK64MC105的数字可调降压电源,展示了dsPIC33CK系列在数字电源控制中的强大能力,为开发高效、智能的电源系统提供了完整解决方案。通过灵活的数字控制算法,系统实现了传统模拟电源难以达到的精度和功能多样性。
虽然成功实现了可调降压及稳压功能,并通过反馈回路与PID算法实现输出电压的稳定控制。但未做额外的防护(例如:过流、过温等)、负载调整率测试、转换效率测试等。对于一个业余选手来着这些参数听着就头大,就留待以后慢慢探索吧!
最后感谢电子森林与得捷电子联合推出的 《Funpack》 系列活动,对于我来说是个很好的学习机会,理论结合实践。我们下期活动再见!