【前言】
在前面几篇作品中,我对 【EV1WO505B-LVH-00A】开发板做详细的测试,并根据原理图,设计自动转换电路进行了验证。这一篇,我将分享如何制一个自动控制数字电源。
【硬件准备】
1、【EV1WO505B-LVH-00A】评估板。
2、四路继电器
3、STM32F769I-DISC评估板。
4、TFTLCD触摸屏。
【软件开发环境】
1、STM32CubeMX 主要对STM32F769的基础环境进行创建。
2、Vscocde代码编译器。
3、LVGL开源GUI图形界面。
4、Gui-Guider设计工具。
【原理图设计】
【程序设计】
根据原理图以及上面的设计图:
1、我使用一组继电器来控制电源输入的关开,编写函数如下:
// 电源开关控制函数
void power_switch_control(PowerStatus status)
{
if (status == POWER_ON)
{
// 高电平开启电源
HAL_GPIO_WritePin(ON_OFF_GPIO_Port, ON_OFF_Pin, GPIO_PIN_RESET);
}
else if (status == POWER_OFF)
{
// 低电平关闭电源
HAL_GPIO_WritePin(ON_OFF_GPIO_Port, ON_OFF_Pin, GPIO_PIN_SET);
}
}
2、控制电压切换的逻辑为EN(通过100K电阻】桥接到GND1后,延时100ms,VSEL可以通过CN1切换到高低电平,也就是输出的VIN或者GND2,连接到Vout即输出5V,我这里使用了两组继电器进行切换,通过继电器模块的两个INT角连接到STM32F769的控制IO上。他们的转换程序如下:
// 电压转换功能函数
void voltage_switch(Voltage target_voltage)
{
// 第一步:切换CH引脚
if (target_voltage == VOLTAGE_5V)
{
// 高电平为5V
HAL_GPIO_WritePin(CH_GPIO_Port, CH_Pin, GPIO_PIN_SET);
}
else if (target_voltage == VOLTAGE_3V3)
{
// 低电平为3.3V
HAL_GPIO_WritePin(CH_GPIO_Port, CH_Pin, GPIO_PIN_RESET);
}
// 第二步:SWICTH_V拉高10ms再拉低
HAL_GPIO_WritePin(SWICTH_V_GPIO_Port, SWICTH_V_Pin, GPIO_PIN_RESET);
HAL_Delay(100); // 延时10ms
HAL_GPIO_WritePin(SWICTH_V_GPIO_Port, SWICTH_V_Pin, GPIO_PIN_SET);
}
3、电压采集,通过STM32F769的ADC1_CH6进行电压采集,由于ADC参考电压为3.3V,我使用了分压电路后,进行采集,其程序如下:
uint32_t adc_voltage_conversion(void)
{
uint32_t adc_value;
// 启动ADC转换
if (HAL_ADC_Start(&hadc1) != HAL_OK)
{
printf("ADC conversion failed.\n");
// 处理启动失败的情况
return 0;
}
// 等待ADC转换完成
if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) != HAL_OK)
{
printf("ADC conversion timeout.\n");
// 处理转换失败的情况
HAL_ADC_Stop(&hadc1);
return 0;
}
// 等待ADC转换完成
adc_value = HAL_ADC_GetValue(&hadc1);
printf("ADC value: %d\n", adc_value);
return adc_value;
}
【上位机界面设计】
我采用GUI_GUIDER进行了界面设计,效果图如下:
【电压实时显示】
采集到电压后,通过对电压值标签进行更新:
// 更新标签显示ADC采集电压值的函数
void update_label_with_voltage(void)
{
uint32_t value = adc_voltage_conversion();
float voltage = (float)value * 2 * REFERENCE_VOLTAGE / ADC_RESOLUTION ;
char voltage_str[6];
// 将电压值格式化为保留一位小数的字符串
snprintf(voltage_str, sizeof(voltage_str), "%d.%02d", (int)voltage, (int)(voltage*100)%100);
printf("ADC voltage: %s\n", voltage_str);
// 更新标签文本
lv_label_set_text(gui_guider_ui.screen_label_5, voltage_str);
lv_obj_invalidate(gui_guider_ui.screen_label_5); // 标记控件需要重绘
}
【实效果图】
通开关按键可以实现电源的开关,电压转换的按键可以实电压的在线转换。
【作品介绍】
MPS隔离数字电源_哔哩哔哩_bilibili



