該項目為2023DigiKey汽車應用創(chuàng)意挑戰(zhàn)賽 開發(fā)的電源管理模塊 該模塊具有上電自檢-過流保護-過功率保護等功能,還可以與主控通信
當模塊離線時自動報警
首先附上項目完整全家福
藍色為本次大賽中使用的STM32顯示器件,用來顯示多種信息在屏幕上
綠色板子為電源模塊,用來統(tǒng)計電源消耗信息
黑色板子為從控,用來和顯示部分交互數據
電源管理模塊:
使用STM32F042作為主控,INA226作為測量元件
具有1電源輸入3可控電源輸出
同時一路電源還有功率測量功能,可以對該路上的電源負載做出統(tǒng)計,通過板載的CAN總線反饋到屏幕終端上,
同時該路電源還具有上電自檢和超功率保護的功能
上電自檢時發(fā)現三個輸出端口有輸出的情況下將會觸發(fā)報警程序
在超過額定功率輸出的情況下也會強制斷開三路電源 進入保護程序
保護邏輯并非為超過功率即保護 而是有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 ,
//判斷錯誤優(yōu)先級, 保存優(yōu)先級最高的錯誤碼
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
//剛剛上線,可能存在數據不穩(wěn)定,只記錄不丟失,
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