该项目为2023DigiKey汽车应用创意挑战赛 开发的电源管理模块 该模块具有上电自检-过流保护-过功率保护等功能,还可以与主控通信
当模块离线时自动报警
首先附上项目完整全家福
蓝色为本次大赛中使用的STM32显示器件,用来显示多种信息在屏幕上
绿色板子为电源模块,用来统计电源消耗信息
黑色板子为从控,用来和显示部分交互数据
电源管理模块:
使用STM32F042作为主控,INA226作为测量元件
具有1电源输入3可控电源输出
同时一路电源还有功率测量功能,可以对该路上的电源负载做出统计,通过板载的CAN总线反馈到屏幕终端上,
同时该路电源还具有上电自检和超功率保护的功能
上电自检时发现三个输出端口有输出的情况下将会触发报警程序
在超过额定功率输出的情况下也会强制断开三路电源 进入保护程序
保护逻辑并非为超过功率即保护 而是有60焦尔的缓冲能量,当60焦耳的缓冲能量使用完之后才会断开输出
主控离线检测代码设计
void detect_task(void const *pvParameters)
{
static uint32_t system_time;
system_time = xTaskGetTickCount();
//init,初始化
detect_init(system_time);
//wait a time.空闲一段时间
vTaskDelay(DETECT_TASK_INIT_TIME);
while (1)
{
static uint8_t error_num_display = 0;
system_time = xTaskGetTickCount();
error_num_display = ERROR_LIST_LENGHT;
error_list[ERROR_LIST_LENGHT].is_lost = 0;
error_list[ERROR_LIST_LENGHT].error_exist = 0;
for (int i = 0; i < ERROR_LIST_LENGHT; i++)
{
//disable, continue
//未使能,跳过
if (error_list[i].enable == 0)
{
continue;
}
//judge offline.判断掉线
if (system_time - error_list[i].new_time > error_list[i].set_offline_time)
{
if (error_list[i].error_exist == 0)
{
//record error and time
//记录错误以及掉线时间
error_list[i].is_lost = 1;
error_list[i].error_exist = 1;
error_list[i].lost_time = system_time;
}
//judge the priority,save the highest priority ,
//判断错误优先级, 保存优先级最高的错误码
if (error_list[i].priority > error_list[error_num_display].priority)
{
error_num_display = i;
}
error_list[ERROR_LIST_LENGHT].is_lost = 1;
error_list[ERROR_LIST_LENGHT].error_exist = 1;
//if solve_lost_fun != NULL, run it
//如果提供解决函数,运行解决函数
if (error_list[i].solve_lost_fun != NULL)
{
error_list[i].solve_lost_fun();
}
}
else if (system_time - error_list[i].work_time < error_list[i].set_online_time)
{
//just online, maybe unstable, only record
//刚刚上线,可能存在数据不稳定,只记录不丢失,
error_list[i].is_lost = 0;
error_list[i].error_exist = 1;
}
else
{
error_list[i].is_lost = 0;
//判断是否存在数据错误
//judge if exist data error
if (error_list[i].data_is_error != NULL)
{
error_list[i].error_exist = 1;
}
else
{
error_list[i].error_exist = 0;
}
//calc frequency
//计算频率
if (error_list[i].new_time > error_list[i].last_time)
{
error_list[i].frequency = configTICK_RATE_HZ / (fp32)(error_list[i].new_time - error_list[i].last_time);
}
}
}
vTaskDelay(DETECT_CONTROL_TIME);
#if INCLUDE_uxTaskGetStackHighWaterMark
detect_task_stack = uxTaskGetStackHighWaterMark(NULL);
#endif
}
}
void detect_hook(uint8_t toe)
{
error_list[toe].last_time = error_list[toe].new_time;
error_list[toe].new_time = xTaskGetTickCount();
if (error_list[toe].is_lost)
{
error_list[toe].is_lost = 0;
error_list[toe].work_time = error_list[toe].new_time;
}
if (error_list[toe].data_is_error_fun != NULL)
{
if (error_list[toe].data_is_error_fun())
{
error_list[toe].error_exist = 1;
error_list[toe].data_is_error = 1;
if (error_list[toe].solve_data_error_fun != NULL)
{
error_list[toe].solve_data_error_fun();
}
}
else
{
error_list[toe].data_is_error = 0;
}
}
else
{
error_list[toe].data_is_error = 0;
}
}
从极端运行FreeRTOS代码,编写一个detect任务,用来检测CAN总线上是否存在离线设备,通过建立临时表存储总线上设备运行时,在can回调函数中运行钩子函数来更新detect任务中的任务在线时间来检测是否有离线设备的存在,同时还会检测设备数据是否有异常
代码部分:
https://gitee.com/duandijun1/2024_-digi-code.git,项目gitee地址
项目演示视频
【digikey】https://www.bilibili.com/video/BV17N4y1J74L/?share_source=copy_web&vd_source=f30c922e047da4be83d06ba1e7589a36