汽车玻璃防夹手功能是一项重要的安全设计,其背后的核心技术在于防夹手芯片及其工作原理。汽车玻璃防夹手功能主要依赖于电流传感器(如霍尔传感器)或先进的无传感器方案(如基于电机电流检测的方案)来监测车窗电机的运行状态。当车窗在上升过程中遇到障碍物时,电机会因阻力增大而表现出转速减慢或电流增大的现象。防夹手芯片通过检测这些变化来判断是否有障碍物存在,并据此发出指令使车窗停止或反转,从而避免夹伤乘客。AEK-MOT-WINH92无传感器方案通过检测直流电机电流的变化来判断是否有障碍物存在。当车窗遇到障碍物时,电机会因阻力增大而输出更大的转矩,从而导致电流增大。防夹手芯片会实时监测电机电流,并将其与预设的阈值进行比较。如果电流超过阈值,芯片会判断为遇到障碍物,并向ECU发送警报。ECU随后会采取相应的措施使车窗停止或反转。无传感器方案降低了成本,简化了安装过程,并且具有更高的可靠性。它不需要额外的传感器元件,因此减少了故障点。
AEK-MOT-WINH92开发板电路设计:
L99H92芯片框架:L99H92是一款符合AEC-Q100标准的器件,具有可配置的电流检测功能的灵活门极驱动器,以及用于直流电机控制的先进诊断和保护功能。L99H92评估板(AEK-MOT-WINH92)。作为AutoDevkit生态系统的一部分,它包含了有关如何配置L99H92以驱动全H桥配置或双单向半桥配置(用于通过可变PWM占空比信号驱动直流电机)的有用开发者资源。
L99H92具有一个异步、逻辑独立的故障安全输入引脚,该引脚作为所有MOSFET的冗余关断路径。故障安全输入非引脚(FSINB),低电平有效,具有内部下拉电阻RFSINB。一旦FSINB引脚低于VFSINBLTH阈值的时间超过tFSINB_filt,FSINLL状态位和FSIN状态位将被设置,并且设备将进入故障安全模式。在故障安全模式下,OUTE控制位被复位,门极驱动器被强制进入吸收开关模式,以最大可用电流主动关断所有MOSFET,无论编程的门极放电电流(SLEWDx控制位)如何。只要FSINB输入引脚保持低电平,门极驱动器就被强制进入吸收开关模式,并且OUTE控制位被强制置零。出于功能安全的原因,FSINHS1,2和FSINLS1,2状态位指示由于FSINB引脚被拉低,HS1,2和LS1,2门极驱动器是否已成功进入吸收开关模式。一旦FSINB引脚被拉低,为了重新激活被强制进入吸收开关模式的门极驱动器,FSINB引脚必须高于VFSINHTH阈值的时间超过滤波时间。所有FSINHSx和FSINLSx状态位必须回到零(指示所有门极驱动器已退出强制吸收开关模式,并使设备退出故障安全模式),然后通过SPI将OUTE控制位重新设置为1。如果FSINHSx或FSINLSx中的至少一个状态位保持设置,表明至少一个门极驱动器没有退出强制吸收开关模式,则设备将保持在故障安全模式下。当FSINB引脚为高电平且OUTE控制位被复位时,门极驱动器被禁用,每个MOSFET的门极和源极之间仅留下电阻连接。
FSINB输入引脚的状态可以通过FSINLL状态位读取,但不能清除。与全局状态字节故障安全位(FS)相关联的FSIN状态位是以下状态位的逻辑或:FSINLL、FSINHS1、FSINLS1、FSINHS2和FSINLS2。故障安全输入引脚仅作用于门极驱动器和OUTE控制位。
电流检测放大器(CSA1和CSA2)专为汽车应用中的电流检测而设计。它们是独立的、双向的、单电源差分放大器,具有宽输入共模电压范围(VICM)。它们通过两个检测电阻支持高边电流检测、低边电流检测和在线电流检测。每个CSA的增益可独立通过SPI编程设置为100、50、20或10。由于CSA具有跨导输入级,输入串联电阻(用于滤波等)不应超过50Ω,以保持附加增益误差低于1%。CSO输出与VDD电源轨兼容,并具有可通过CSA1OO和CSA2OO控制位设置的可编程偏移量。如果这些位被复位,则输出偏移量设置为VO0,否则设置为VO1。电流检测放大器的输入级由电荷泵供电。当电荷泵被禁用时,CSA也会被禁用。默认情况下,两个电流检测放大器均处于启用状态。为了降低电流消耗,可以通过控制位DCSA1和DCSA2独立禁用它们。
上一篇能进行PWM生成,根于图示进行电路连接:
通过PWM EN DIR可以控制电机转动,下一步关键SPI采集,驱动板是G473:CubeMX配置工程:
SPI关键代码:
SPI_HandleTypeDef hspi4;
/* SPI4 init function */
void MX_SPI4_Init(void)
{
/* USER CODE BEGIN SPI4_Init 0 */
/* USER CODE END SPI4_Init 0 */
/* USER CODE BEGIN SPI4_Init 1 */
/* USER CODE END SPI4_Init 1 */
hspi4.Instance = SPI4;
hspi4.Init.Mode = SPI_MODE_MASTER;
hspi4.Init.Direction = SPI_DIRECTION_2LINES;
hspi4.Init.DataSize = SPI_DATASIZE_8BIT;
hspi4.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi4.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi4.Init.NSS = SPI_NSS_SOFT;
hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi4.Init.TIMode = SPI_TIMODE_DISABLE;
hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi4.Init.CRCPolynomial = 7;
hspi4.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi4.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
if (HAL_SPI_Init(&hspi4) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI4_Init 2 */
/* USER CODE END SPI4_Init 2 */
}
void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(spiHandle->Instance==SPI4)
{
/* USER CODE BEGIN SPI4_MspInit 0 */
/* USER CODE END SPI4_MspInit 0 */
/* SPI4 clock enable */
__HAL_RCC_SPI4_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
/**SPI4 GPIO Configuration
PE2 ------> SPI4_SCK
PE5 ------> SPI4_MISO
PE6 ------> SPI4_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_5|GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI4;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/* USER CODE BEGIN SPI4_MspInit 1 */
/* USER CODE END SPI4_MspInit 1 */
}
}
void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
{
if(spiHandle->Instance==SPI4)
{
/* USER CODE BEGIN SPI4_MspDeInit 0 */
/* USER CODE END SPI4_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_SPI4_CLK_DISABLE();
/**SPI4 GPIO Configuration
PE2 ------> SPI4_SCK
PE5 ------> SPI4_MISO
PE6 ------> SPI4_MOSI
*/
HAL_GPIO_DeInit(GPIOE, GPIO_PIN_2|GPIO_PIN_5|GPIO_PIN_6);
/* USER CODE BEGIN SPI4_MspDeInit 1 */
/* USER CODE END SPI4_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
SPI 读取寄存器参数:L99H92是一款直流电机驱动芯片,其寄存器配置对于实现电机的精确控制至关重要。可以通过SPI(串行外设接口)或其他通信接口来访问和控制这些寄存器。
#include "stm32g4xx_hal.h"
SPI_HandleTypeDef hspi4;
// 读取寄存器的函数
uint8_t SPI_ReadRegister(SPI_HandleTypeDef *hspi, uint8_t regAddr, uint8_t *data, uint16_t size) {
// 发送寄存器地址(如果需要)
uint8_t txBuffer[1] = {regAddr};
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // 拉低CS引脚(假设CS引脚是GPIOA的PIN4)
HAL_SPI_Transmit(hspi, txBuffer, 1, HAL_MAX_DELAY);
// 接收寄存器数据
HAL_SPI_Receive(hspi, data, size, HAL_MAX_DELAY);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // 拉高CS引脚
// 检查传输是否成功
if (HAL_OK == HAL_SPI_GetError(hspi)) {
return HAL_OK;
} else {
return HAL_ERROR;
}
}
int main(void) {
// HAL库初始化
HAL_Init();
// 配置系统时钟(这通常是通过STM32CubeMX生成的代码完成的)
SystemClock_Config();
// 初始化所有配置的外设(这也通常是通过STM32CubeMX生成的代码完成的)
MX_GPIO_Init();
MX_SPI4_Init();
// 读取寄存器的示例
uint8_t registerData;
uint8_t result = SPI_ReadRegister(&hspi4, 0x01, ®isterData, 1); // 读取地址为0x01的寄存器
if (result == HAL_OK) {
// 成功读取数据,可以在这里处理registerData
} else {
// 处理错误
}
// 主循环
while (1) {
}
}
Global Status Byte(GSB)是一个字节(8位)的数据,每一位都代表设备或系统的特定状态信息。通过读取GSB,用户可以了解设备或系统的当前状态,如是否处于正常工作状态、是否有错误发生等。
- 控制寄存器:用于控制L99H92的工作模式、方向、使能状态等。例如,可能有一个寄存器用于控制电机的启动和停止,另一个寄存器用于设置电机的旋转方向。
- 状态寄存器:用于反映L99H92的当前状态,如故障状态、诊断信息等。这些寄存器通常可以被读取以了解驱动器的状态,从而进行相应的处理。
- PWM(脉冲宽度调制)寄存器:用于设置PWM信号的占空比,从而控制电机的速度和功率。PWM寄存器通常允许用户根据需要调整电机的运行速度。
- 配置寄存器:用于配置L99H92的某些特定功能或参数,如SPI通信速率、地址选择等。这些寄存器允许用户根据实际应用需求对驱动器进行定制。
单片机软件SPI配置正常,现在读取数据还是不知道啥意思,寄存器太多,缺少中文说明,需要一个逻辑分析仪。还是需要官方出具一个详细代码参考。期待ST官方更进一步说明。