加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入

基于CAN总线设计的HMI车载外设控制器

05/15 09:20
3133
服务支持:
技术交流群

完成交易后在“购买成功”页面扫码入群,即可与技术大咖们分享疑惑和经验、收获成长和认同、领取优惠和红包等。

虚拟商品不可退

当前内容为数字版权作品,购买后不支持退换且无法转移使用。

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
电路板图(3)
  • 方案介绍
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

该项目为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

 

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
ADG1419BRMZ 1 Rochester Electronics LLC 1-CHANNEL, SGL POLE DOUBLE THROW SWITCH, PDSO8, ROHS COMPLIANT, MO-187AA, MSOP-8
$4.65 查看
VEML6030 1 Vishay Intertechnologies Analog Circuit,

ECAD模型

下载ECAD模型
$3.01 查看
FNB41560B2 1 onsemi Motion SPM&reg; 45 Series Longer Pins, 72-TUBE
$13.86 查看

相关推荐

电子产业图谱