当前位置: 首页 > news >正文

【面试笔记】单片机软件工程师,工业控制方向(储能)

在这里插入图片描述

文章目录

  • 1. 基础知识
    • 1.1 C语言笔试题
      • 1.1.1 用宏定义得到一个数组所含的元素个数
      • 1.1.2 定义函数指针从程序固定地址(0)开始执行
      • 1.1.3 volatile的含义及作用
      • 1.1.4 32位系统,整数7和-7,分别以大端和小端存储,请示意说明
    • 1.2 嵌入式基础
      • 1.2.1 简述单片机的启动过程
      • 1.2.2 简述I2C、SPI、UART、CAN这个几种通讯方式的异同
      • 1.2.3 RS485
      • 1.2.4 Modbus
  • 2. MISRA2012标准
  • 3. FreeRTOS
  • 4. BMS开发概述
    • 4.1 法规解读
    • 4.2 模块介绍
      • 4.2.1 从控模块
      • 4.2.2 主控模块
      • 4.2.3 总控模块
  • 5. Microchip单片机


1. 基础知识

1.1 C语言笔试题

1.1.1 用宏定义得到一个数组所含的元素个数

char array[30];
#define ARRAY_SIZE(a) (sizeof((a))/sizeof((a[0])))

参考:预处理、const、static与sizeof-使用宏定义得到一个数组所含的元素个数


1.1.2 定义函数指针从程序固定地址(0)开始执行

int main(void)
{void (* func)(void);func = (void (*)()) (0x0000);func();
}

参考:C语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行的技巧


1.1.3 volatile的含义及作用

直接存取原始内存地址

  1. 易变的。并不是直接指示该变量可以任意改变。而是告诉编译器,该变量(绑定内存中的值)时可能随时改变的,要注意随时更新,更新的办法是直接从内存读取该值。
  2. 线程中变量的同步:在本次线程内,当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值。

如果变量为未声明为volatile的变量,对于线程中共享的变量,将导致第一个线程改变了该变量的值,并保存在内存地址中(即该段内存的值被改变,程序却继续从寄存器中读取改变之前的值),其他的线程使用的仍然是改变之前的变量值。

volatile的使用:共享内存时,该内存单元可能随时修改,如状态寄存器,中断访问的非自动变量(全局变量)多线程条件变量;

参考:C语言中volatile关键字的作用


1.1.4 32位系统,整数7和-7,分别以大端和小端存储,请示意说明

// 地址:| 低 ---------------------> 高 |
// 大端: 7>  00  00  00  07
//       -7>  FF  FF  FF  F9
// 小端: 7>  07  00  00  00
//       -7>  F9  FF  FF  FF


1.2 嵌入式基础

1.2.1 简述单片机的启动过程

  1. 上电复位,硬件设置(初始化)堆栈指针 SP=_initial_sp、计数指针 PC= Reset_Handler的值;
  2. 找到了 Reset_Handler 的地址后,CPU 就从这里开始取指令运行程序,初始化中断向量表;
  3. 调用 SystemInit 函数,设置系统时钟;
  4. 调用 __main 函数,软件对 SP 寄存器赋值,完成数据段的重定位、清除 bss 段,初始化栈空间等工作;
  5. 最终 __main 函数会调用用户的 main 函数,进入到用户程序。

参考:STM32启动过程分析
参考:STM32第二章-启动过程详解


1.2.2 简述I2C、SPI、UART、CAN这个几种通讯方式的异同

参考:I2C总线和通信协议详解
参考:SPI原理超详细讲解—值得一看
参考:【车辆CAN通讯系列】1 CAN通讯基础——物理层概述
参考:【车辆CAN通讯系列】2 CAN通讯基础——数据链路层概述


1.2.3 RS485

  • 半双工,多机通信
  • 两线制,双绞线
  • 低电压,压差 ±(2~6)V
  • 理论距离3000m

参考:终于讲透了,史上最详细的RS485串口通讯!


1.2.4 Modbus

  • ModBus网络只有一个主机,所有通信都由他发出。
  • Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验,但TCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。
  • Modbus采用主从方式定时收发数据,在实际使用中如果某Slave站点断开后(如故障或关机),Master端可以诊断出来,而当故障修复后,网络又可自动接通。因此,Modbus协议的可靠性较好。

帧结构:
初始结构 = ≥4字节的时间
地址码 = 1 字节
功能码 = 1 字节
数据区 = N 字节
错误校检 = 16位CRC码
结束结构 = ≥4字节的时间


2. MISRA2012标准

TBD.


3. FreeRTOS

  • FreeRTOS中的任务永远处于这几个状态中的某一个:运行态、就绪态、阻塞态和挂起态;
  • “队列”是用来完成任务与任务、任务与中断之间的消息传递的;
  • 清楚二值信号量、计数型信号量、优先级翻转、互斥信号量等概念;
  • 抢占式调度:中断任务、高优先级任务、低优先级任务、空闲任务;

参考:安富莱_STM32-V6开发板_FreeRTOS教程(V1.1).pdf

国产单片机移植FreeRTOS
参考:freertos学习01-移植到gd32


4. BMS开发概述

4.1 法规解读

国标要求:
6.1.1 电池管理系统应具有数据采集、通信、报警和保护、控制、状态估算、参数设置、数据存储、计算和统计等功能,宜具有显示功能,锂离子电池、钠离子电池和铅酸(炭)电池管理系统还应具有均衡和绝缘电阻检测功能。

6.1.2 电池管理系统应具有通用性、兼容性、可维护性和可扩展性,宜实现即插即用。

6.1.3 电池管理系统各功能应在逻辑上相互独立,控制策略、执行周期相互匹配。

6.1.4 电池管理系统应设置接地端子,接地电阻不应大于0.1Ω,连接接地线的螺钉和接地点不应用作任何其他机械紧固用途。

6.1.5 电池管理系统线束应采用阻燃材料,电气接口宜采用防呆设计。

6.2.1 锂离子电池、钠离子电池和铅酸(炭)电池管理系统应采集电池单体电压、电池单体温度、电池模
块正负极端子温度、电池簇电压、电池簇电流等参数。


通信
6.3.1 电池管理系统应具有与监控系统、储能变流器、其他管理层级电池管理系统等设备进行信息交互的功能,并宜具有与消防系统、供暖通风与空气调节系统等设备进行信息交互的功能。

6.3.2 电池管理系统与监控系统可采用以太网通信接口,支持Modbus、DI/T634.5104、DL/T860(所有部分)通信协议,宜采用双网冗余通信。

6.3.3 电池管理系统与储能变流器可采用控制器局域网(CAN)、RS485、以太网等通信接口,支持CAN2.0B、Modbus、DL/T860(所有部分)通信协议,且具有一个输出硬接点接口。

6.3.4 不同管理层级电池管理系统之间可采用CAN、RS485、以太网等通信接口,支持CAN2.0B、Modbus等通信协议。

6.3.5 电池管理系统和消防系统、供暖通风与空气调节系统可采用RS485、以太网等通信接口,支持Modbus通信协议。

扩展:一文弄懂电力系统101、103、104、modbus和61850规约


报警分级和处理
6.4.1.1 电池管理系统报警信息应根据严重程度分为一级、二级和三级。其中:

  • 一级报警信息为需要立即停机或停电处理的报警信息;
  • 二级报警信息为需要立即采取应急处理措施的报警信息;
  • 三级报警信息为需要加强监视及一、二级报警复归的报警信息。

6.4.1.2 电池管理系统应在设备状态异常或故障时发出报警信息并上传,报警信息见附录A。

6.4.1.3 在发生一级和二级报警时,电池管理系统应对报警信息前后各10s的模拟量和状态量进行记录。

6.4.2 报警内容
6.4.2.1 锂离子电池、钠离子电池和铅酸(炭)电池管理系统的报警内容应包含:电压越限、电压极差越限、簇电流越限、温度越限、簇内电池单体温度极差越限、绝缘电阻越限、电压采集线异常、温度采集线异常、电池簇充放电回路异常、通信异常等。对于两簇以上电池直流端并联的锂离子电池、钠离子电池和铅酸(炭)电池管理系统还应具有电池簇间环流越限报警。


保护
6.4.3.1 电池管理系统应在一级报警发出后300ms内发出停机指令,并在5s内断开电池簇或电池列充放电回路。
6.4.3.2电池管理系统应在二级报警发出后300ms内发出降低电池运行功率指令。


控制
6.5.1 锂离子电池、钠离子电池和铅酸(炭)电池管理系统应控制电池簇和电池阵列投入和退出。
6.5.2 电池管理系统宜具有通过冷却或加热系统调节电池温度的能力。
6.5.3 液流电池管理系统应控制电解液循环泵的泵速和阀门通断。


能量状态估算
6.6.1 电池管理系统应实时估算电池能量状态(SOE)。
6.6.2 电池管理系统能量状态估算最大允许误差应为土5%。


均衡
锂离子电池、钠离子电池和铅酸(炭)电池管理系统应具有均衡功能,均衡方式可采用主动均衡方式和被动均衡方式中的一种或两种。


绝缘电阻检测

参数设置
6.9.1 电池管理系统应具有对电池系统配置参数、电池正常运行截止参数、异常状态的报警阈值和保护阈值等参数进行设置功能。
6.9.2 电池管理系统应具有参数设置权限功能。
6.9.3 电池管理系统应具有就地参数设置功能,并宜具有远程参数设置功能。

数据存储
6.10.1 电池管理系统应实时存储电池运行状态信息、运行参数信息、报警信息、保护动作信息等数据信息。
6.10.2 电池管理系统应在本地存储不少于120d的数据信息,宜采用队列存储方式。

计算和统计
6.11.1 电池管理系统应具有电池模块电压计算功能。
6.11.2 电池管理系统应具有对累计充放电量、单次充放电量等电量数据统计功能。
6.11.3 电池管理系统应具有电压越限次数、温度越限次数、故障保护事件次数等数据统计功能。

显示
电池管理系统宜具有对电池运行状态、电池运行参数、事件记录等基本信息的显示功能。


4.2 模块介绍

4.2.1 从控模块

从控模块是储能系统电池包的控制和管理核心,支持对电池包进行管理,
采集电池包内单体电池电压、单体温度,对电池运行状态进行分析,单体均衡控制,热管理风扇控制风扇故障检测等
从控模块全部信息通过非隔离 CAN 与主控模块通信,数据上报、指令接受、参数更改、故障上报等
主要功能:

  1. 支持 24 路单体电压采集,采集范围为 0-5V;
  2. 支持 24 路单体温度采集,采集范围 -40~+125°C,
  3. 具备 24 路被动均衡功能,
  4. 支持 1 路干接点控制:
  5. 支持 2 路 485 接口,配合主控模块实现对全部从控模块的自动地址编码;
  6. 支持 1 路非隔离CAN通信(通信频率250kbs),支持CAN2.0协议,符合1SO11898-22016标准和主控模块通信;
  7. 支持硬件看门狗功能;
  8. 支持系统运行数据的本地存储;
  9. 支持在线程序升级;
  10. 具备本地数据分析能力。
  11. 产品状态可视化

硬件框图
在这里插入图片描述

扩展:AFE芯片做什么用的?AFE(Analog Front End) 模拟前端


软件框图
在这里插入图片描述


4.2.2 主控模块

主控模块是储能系统电池簇的控制和管理核心,支持对从控模块管理,包括通信、供电、自动地址编码,获取电池簇内全部单体电压、单体温度值,单体均衡管理,热管理风扇故障检测等。
主控模块内部电路检测电池簇组电压,组对地绝缘电阻,组充/放电电流,内置多维度算法对电池的状态(SOC、SOH等)进行计第和监测;当电池簇内出现告警时,主控模块通过内部电路控制断路器、继电器切断保护,并可通过D1、温度检测电路判断断路器、继电器粘连状态和温度,实现对高压箱内开关预警和保护。
主控模块全部信息通过隔离CAN和总控模块通信,进行数据上报、指令接受、参数更改、故障上报等。

主要功能:

  1. 支持 2 路总电压(总压和预充电压)采集,采集范围为 0~1500V;
  2. 支持双量程霍尔传感器采集或 CAN 通讯电流传感器两种电流采集方案,采集范围由霍尔传感器量程决定;
  3. 支持绝缘采集,检测总正、总负对 PE(机箱或大地)的绝缘值,采集范围为 0~65MΩ;
  4. 支持 4 路温度采集,其中 1 路箱体温度、3 路继电器温度,采集范围为 -40+125°C;
  5. 支持 4 路高边驱动输出、4 路低边驱动输出、2 路干接点输出;
  6. 支持 8 路数字信号输入检测( 4 路高电平、3 路低电平、1 路无源)
  7. 支持 1 路非隔离 CAN通信(通信频率 250kbs), 支持 CAN2.0协议,符合 IS011898 - 22016标准,和多个从控模块级联通信;
  8. 支持 1 路隔离 CAN通信(通信频率 250kbs),支持 CAN2.0协议,符合IS011898-22016标准,和总控模块通信;
  9. 支持 2 路隔离 RS485通信(通信频率9600bps),支持M0DBUS/RTU协议,1路和辅助模块通信,1路进行自动编址;
  10. 支持板载时钟电源RTC,保存运行时间;
  11. 支持系统运行数据的本地存储;
  12. 具备电池(单体、模组、簇)过压、欠压、压差、过流、欠流、过温、低温、温差、短路、绝缘、继电器诊断等告警及保护;
  13. 内置S0C/S0H多维度算法模型,有效追踪电池真实状态;
  14. 具备本地数据分析能力、本地告警功能:
  15. 支持在线程序升级;
  16. 1个主控模块最大可管理32个从控模块。
  17. 支持1路RJ45标准网口,预留和总控模块通信

软件框图
在这里插入图片描述


在这里插入图片描述


4.2.3 总控模块

总控模块是储能系统电池堆的控制和管理核心,对电池堆中所有电池簇的电池信息(电压、温度、电流等参数)收集、分析、判断
存储可快速对电池堆数据进行分析、转换,同时可通过RS485、RS232、DO、DI接口对动环环境(空调、消防、水浸等)数据进行
监控和分析。

主要功能:

  1. 支持 3 路隔离LAN通信(通信频率10M/100M),支持MODBUS/TCP、DL/860等协议,和EMS系统通信;
  2. 支持 3 路隔离CAN通信(通信频率250kbs),支持CAN2.0协议,符合1SO11898-22016标准。其中2路和主控模块通信,1路(预留)
    和PCS设备通信;
  3. 支持 4 路隔离RS485通信(通信频率9600bps),和环境监测/控制模块通信;
  4. 支持 1 路隔离RS232通信(通信频率9600bps),和UPS电源通信;
  5. 支持 4 路隔离干接点,其中1路和PCS设备联动,其中3路控制指示灯;
  6. 支持 4 路DO高边Relay输出,其中3路控制电操(断路器)合闸、分闸、分离脱扣其中1路预留;
  7. 支持 8 路D电平检测,检测环境设备和传感器信号,电操控制状态;
  8. 支持 1 路TF卡外扩存储介质接入,
  9. 支持 1 路USB接口,支持程序读取升级与数据导出;
  10. 支持系统运行数据的本地存储:
  11. 具备电池(单体、模组、簇、堆)过压、欠压、压差、过流、欠流、过温、低温、温差、短路、绝缘、继电器诊断等告警及保护;
  12. 内置 SOC/SOH 多维度算法模型,有效追踪电池真实状态,
  13. 具备本地数据分析能力、本地声光告警功能;
  14. 支持在线程序升级或U盘升级;
  15. 1 个总控模块最大可管理 30 个主控模块。

5. Microchip单片机

突破性的创新功能和解决方案
• 超低功耗:工作模式下小于35 µA/MHz;休眠模式下小于200 nA
• 高性能:最高600 DMIPS性能(支持双精度硬件浮点)以及最大2 MB双分区闪存和512 KB SRAM
• 外设触摸控制器(PTC):专用硬件外设,提供稳健的电容式触摸解决方案,具备高耐湿性和抗噪性
• 梦游(SleepWalking)技术:外设具有在CPU处于休眠状态时执行预期任务的功能
• 事件系统:支持外设间通信并高效卸载CPU
• 低成本无控制器图形(LCCG)解决方案
• 紧凑型封装选项:芯片级封装,尺寸小至1.9 x 2.4 mm
• 高级模拟和连接外设
• microMIPS™指令集架构(ISA),提高了代码密度
• 双分区闪存选项,支持在线更新

参考:32位单片机系列,业界最广泛且最具创新的32位MCU产品线

相关文章:

  • Windows下载安装RabbitMQ客户端(2024最新篇)
  • 【CMake系列】09-cmake install 一般文件 文件夹 源代码
  • 必应bing国内广告怎样开户投放呢?
  • dotenv 配置踩坑-显示undefined
  • gitlab-jh的docker容器自动退出/gitlab镜像版本/升级问题
  • 安卓手机APP开发_____通过设备管理政策增强安全性
  • python中的预编译正则表达式
  • 03--nginx架构实战
  • Matlab解决矩阵微分方程建模(代码开源)
  • elasticsearch安装与使用(2)-基于term匹配的简单搜索引擎搭建
  • debian常用命令
  • 一键开启:盲盒小程序里的梦幻奇遇
  • The 18th Northeast Collegiate Programming Contest(5/9/13)
  • 【ARM Cache 及 MMU 系列文章 6 -- Cache 寄存器 CTR | CLIDR | CCSIDR | CSSELR 使用详解 1】
  • 记忆化搜索汇总
  • 4个实用的微服务测试策略
  • es的写入过程
  • hadoop集群管理系统搭建规划说明
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • leetcode386. Lexicographical Numbers
  • Octave 入门
  • TCP拥塞控制
  • Vue.js-Day01
  • 笨办法学C 练习34:动态数组
  • 大主子表关联的性能优化方法
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 算法---两个栈实现一个队列
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​你们这样子,耽误我的工作进度怎么办?
  • #100天计划# 2013年9月29日
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $.ajax()
  • (ZT)一个美国文科博士的YardLife
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 使用配置文件
  • .NET处理HTTP请求
  • .skip() 和 .only() 的使用
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @软考考生,这份软考高分攻略你须知道
  • [Android View] 可绘制形状 (Shape Xml)
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [CLR via C#]11. 事件
  • [codeforces] 25E Test || hash
  • [fsevents@^2.1.2] optional install error: Package require os(darwin) not compatible with your platfo
  • [JS入门到进阶] 7条关于 async await 的使用口诀,新学 async await?背10遍,以后要考!快收藏
  • [Mysql] 的基础知识和sql 语句.教你速成(上)——逻辑清晰,涵盖完整