【EV1WO505B-LVH-00A】自动控制数字电源

【前言】
在前面几篇作品中,我对 【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