车载相机(摄像头)诊断 | 您所在的位置:网站首页 › 车载ar摄像头调节 › 车载相机(摄像头)诊断 |
相机作为视觉控制器最重要的传感器之一,并且作为一种可拔插的设备,判断其功能是否正常工作是非常重要的。相机的诊断我认为可以分为以下三种类型: 电源诊断,包括相机开路、短路、过流过压等电源故障的判断图像信号诊断,包括视频流信号是否正常、控制信号是否正常、帧率、分辨率等图像信号故障的判断图像质量诊断,包括相机是否被遮挡、安装位置是否正常等故障的判断 电源诊断我们的控制器使用了Maxim的max20087作为相机PoC的PMIC,按美信的说法是该款芯片是“业界唯一的ASIL级摄像机保护器”,最多支持4通道输出,支持过流过压保护。最重要的是可以通过I2C将诊断信息的读出,可读的信息包括输入输出通道的电压、电流,输出通道的过流过压欠压等信息。相机电源诊断就是通过这些信息判断是否存在电源故障。 max20087官网 https://www.maximintegrated.com/cn/products/analog/analog-switches-multiplexers/MAX20087.html 图1.max20087特性 根据max20087的特性,实现下表中的故障类型。故障码定义不符合ISO14229标准,仅作为例子展示 故障码(hex) 故障描述 判断标准 备注 无 相机工作正常 输入电压、输出电压、输出电流均正常,各异常标志位未置位 400400 相机0未连接 输出电压=输入电压,电流为0 400401 相机1未连接 400402 相机2未连接 400403 相机3未连接 400404 通道0短路 输出电压为0,过流或欠压或过热保护标志位置位 400405 通道1短路 400406 通道2短路 400407 通道3短路 400408 相机0已连接但未开始工作 输出电压正常,但电流小于正常工作电流,相机I2C访问正常 需要提前采样工作正常时的电流,需要主控去访问摄像头 400409 相机1已连接但未开始工作 40040a 相机2已连接但未开始工作 40040b 相机3已连接但未开始工作 40040c 相机0已连接但损坏了 输出电压远小于输入电压,电流远小于或远大于正常工作电流,相机I2C无法访问,但过流和欠压和过热保护标志位均未置位 需要提前采样工作正常时的电流,需要主控去访问摄像头 40040d 相机1已连接但损坏了 40040e 相机2已连接但损坏了 40040f 相机3已连接但损坏了 400410 通道0输入电压过压 过压标志位置位 400411 通道1输入电压过压 400412 通道2输入电压过压 400413 通道3输入电压过压 400414 PMIC无法访问 max20087 i2c无法访问 状态读出要实现故障的判断,需要先把max20087的寄存器通过i2c读出,再通过一系列的逻辑判断出故障类型。需要注意的是,读取该芯片寄存器的时候,需要先把芯片EN引脚拉高。 电压和电流max20087的电压电流是通过8位的ADC采样实现的,需要读出的值有 4个通道的电压+4个通道的电流+输入电压+芯片供电电压,一共10个值,但ADC寄存器只有4个。因此max20087通过设置mux寄存器,将ADC分时复用实现11个值的转换(有一个值没有用到)。 图2. max20087 ADC描述 实现起来也很简单,直接上代码。输入参数index指哪片max20087,因为板子上放置了3颗max20087;mode指ADC对哪部分进行采样,即mux setting;result是输出结果,传入长度为4的uint16_t类型的数组的指针。 int max20087_read_adc(uint8_t index, uint8_t mode, uint16_t* result) { uint8_t val = 0; int ret = 0; uint8_t max20087_addr = max20087_addr_group[index]; uint8_t adc[4]; uint8_t wait_adc_complete_retry = 2; /*set ADC mux to 01 = ADC1–ADC4 registers contain the output-voltage readings of each output*/ ret |= i2c_read_8_8(I2C_BUS, max20087_addr, 0x01, &val, 0); val &= 0x3f; if(mode == VOLTAGE_OUT_MODE) { val |= (1 4) & 1) { break; } } if(!wait_adc_complete_retry) { return -2; } ret |= i2c_read_8_8(I2C_BUS, max20087_addr, 0x06, &adc[0], 0); ret |= i2c_read_8_8(I2C_BUS, max20087_addr, 0x07, &adc[1], 0); ret |= i2c_read_8_8(I2C_BUS, max20087_addr, 0x08, &adc[2], 0); ret |= i2c_read_8_8(I2C_BUS, max20087_addr, 0x09, &adc[3], 0); if(ret) { return ret; } for(val=0; valvoltage_vin) < 140 && current_out < 3 && !ts && !oc && !ov && !uv) { SET_BIT(dtc_handler->status, DTC_STATS_BIT_TEST_FAILED); SET_BIT(dtc_handler->status, DTC_STATS_BIT_PENDING_DTC); if(dtc_handler->cycle > dtc_handler->threshold) { SET_BIT(dtc_handler->status, DTC_STATS_BIT_CONFIRMED_DTC); CLR_BIT(dtc_handler->status, DTC_STATS_BIT_PENDING_DTC); // TODO 根据实际需求决定是否实现将该dtc写入非易失内存 } ++dtc_handler->cycle; } else if (abs(voltage_out - DIA_CAMERA_POWER_STATUS->voltage_vin) < 140 && current_out > 27 && !ts && !ov && !uv && !oc) { CLR_BIT(dtc_handler->status, DTC_STATS_BIT_TEST_FAILED); if(dtc_handler->cycle > 0) --dtc_handler->cycle; } return UDS_SUCCESS; }然后是判断相机通道是否短路,当输出电压等于0,并且欠压和过流标志位置位时认为该通道已经短路到地。 int channel_is_short2gnd(uint16_t voltage_out, uint8_t uv, uint8_t oc, uint32_t dtc) { // 当输出电压=0,欠压标志位和过流标志位置位时认为通道处于短路状态 struct uds_dtc* dtc_handler = get_dtc_handler(dtc); if(!dtc_handler) { return -DTC_NOT_FOUND; } if(voltage_out < 140 && uv && oc) { SET_BIT(dtc_handler->status, DTC_STATS_BIT_TEST_FAILED); SET_BIT(dtc_handler->status, DTC_STATS_BIT_PENDING_DTC); if(dtc_handler->cycle > dtc_handler->threshold) { SET_BIT(dtc_handler->status, DTC_STATS_BIT_CONFIRMED_DTC); CLR_BIT(dtc_handler->status, DTC_STATS_BIT_PENDING_DTC); // TODO 根据实际需求决定是否实现将该dtc写入非易失内存 } ++dtc_handler->cycle; } else if (abs(voltage_out - DIA_CAMERA_POWER_STATUS->voltage_vin) < 140 && !uv && !oc) { // 当输出电压=输入电压,欠压标志位和过流标志位清除的时候认为短路情况已恢复 CLR_BIT(dtc_handler->status, DTC_STATS_BIT_TEST_FAILED); if(dtc_handler->cycle > 0) --dtc_handler->cycle; } return UDS_SUCCESS; }判断通道是否过压(短路到电源),当ov标志位置位时即认该通道短路到电源。 int channel_is_over_voltage(uint8_t ov, uint32_t dtc) { // 当过压标志位置位时认为是过压(短路到电源) struct uds_dtc* dtc_handler = get_dtc_handler(dtc); if(!dtc_handler) { return -DTC_NOT_FOUND; } if(ov) { SET_BIT(dtc_handler->status, DTC_STATS_BIT_TEST_FAILED); SET_BIT(dtc_handler->status, DTC_STATS_BIT_CONFIRMED_DTC); ++dtc_handler->cycle; } else { CLR_BIT(dtc_handler->status, DTC_STATS_BIT_TEST_FAILED); --dtc_handler->cycle; } return UDS_SUCCESS; }至于相机连接了但工作不正常的故障码,需要与相机的诊断相配合,只有电源诊断是无法实现的,后面会再用几篇文章专门介绍。 |
CopyRight 2018-2019 实验室设备网 版权所有 |