现象

当手动增益调节到90多时,图像会有闪烁
当调到100时,增益突然变低,图像突然变好

可能的原因

  1. 增益太高,导致曝光行一行跨度太大,达不到目标亮度
  2. 虽然增益很高,我们是在AE模块的输出截取修改,其实AE会把这个场景当做很亮的场景,曝光行在很小的地方波动,那个时候的曝光行不够平滑
  3. 是否可能增益到100时候超过了IMX327的最大数字增益

排查经过

  • 1/17/2019 13:28:49

烧写最新版本启动不了 –烧写1.4版本
搭好环境,更新代码

  • 2019/1/17 13:43:27

曝光行一直在变化,增益也在变化。

if( output->stats_update.aec_update.sensor_gain > aec->aec_exp_limit.gain_max){
if((output->stats_update.aec_update.linecount < (uint32_t)output->stats_update.aec_update.preview_linesPerFrame/10)
&& (aec->aec_exp_limit.shutter_max_line != aec->aec_exp_limit.shutter_min_line))
output->stats_update.aec_update.sensor_gain *= aec->aec_exp_limit.gain_max;
else
output->stats_update.aec_update.sensor_gain= aec->aec_exp_limit.gain_max;
}
else if( output->stats_update.aec_update.sensor_gain < aec->aec_exp_limit.gain_min){
if((output->stats_update.aec_update.linecount < (uint32_t)output->stats_update.aec_update.preview_linesPerFrame/10) \
&& (aec->aec_exp_limit.shutter_max_line != aec->aec_exp_limit.shutter_min_line))
output->stats_update.aec_update.sensor_gain *= aec->aec_exp_limit.gain_min;
else
output->stats_update.aec_update.sensor_gain = aec->aec_exp_limit.gain_min;
}
else
aec->aec_exp_limit.cur_lux_index = core_output->lux_idx;

问题:调节手动增益为什么不是直接设置固定值?

解释:可能是由于增益比较大,如果想要达到目标亮度,曝光行可能会来回跳动,因此需要将手动增益乘以一个较小的数,也就是原始的输出增益。这里就相当于在原来的AEC基础上加上了一个固定的倍数。

  • 2019/1/17 14:38:34

可能是在之前乘以的倍数比较大?超过了最大值? –可以到达600多倍

  • 2019/1/17 15:38:45

lib中设置了最大增益上限为252,是否是因为超过了最大上限? –在sensor.c中的sensor_set_aec_update函数用persist强制设置

char prop[PROPERTY_VALUE_MAX];
uint32_t Debug_flag = 0;
float real_gain = 0.0;
uint32_t linecount = 0;

property_get("persist.camera.debug.flag", prop, "0");
Debug_flag = atoi(prop);

property_get("persist.camera.debug.real_gain", prop, "0");
real_gain = atof(prop);

property_get("persist.camera.debug.linecount", prop, "0");
linecount = atoi(prop);

if (Debug_flag == 1) {
exposure.real_gain = real_gain;
exposure.linecount = linecount;
SERR("liqinxing: manual_set real_gain: %f,
linecnt = %d", real_gain,linecount);
}

sensor_set_exposure(sctrl, exposure);
  • 2019/1/18 10:40:06

排查99和100效果不同的原因:
注意一个问题:100ms更新一次数据 –理论上不是两帧更新一次么,也就是66ms;由于不是每次都打印,可能会出现这个问题

设置的手动增益是正常的,一直在增大;难道说是超出阈值了
保持图片的当前亮度稳定,那么曝光行和增益的乘积是固定的,也就是当增益增大,固定增益增大,曝光阶会会减小,但是到了100就不对了;为什么之前不会出现这个问题呢?

  • 2019/1/18 13:37:03

尝试修改lib.h文件中的IMX327_MAX_GAIN为1000
发现增益等级设置的手动增益范围也变成了1-1000,当为80时,手动增益为252倍,之后和100相同的情况,而在70-80之间依旧闪烁

  • 2019/1/18 14:10:49

为什么增益到了252就会出问题呢?这个增益恰好是lib中设置的最大增益

  • 2019/1/18 15:00:40

尝试将IMX327_MAX_GAIN改小,发现不再闪烁了,但是并不能解释根本原因

根本原因

写入寄存器是字节型写入的,需要将float型转换成十六进制,它是通过一个查找表reg_value_lookup_table去设置对应的倍数的。但是有个问题,超过查找表的最大值就没有进行赋值。而查找表的最大值只有251倍,我们设置的最大倍数有252倍,所以会出现问题。我们只需要将查找表加长,让每个倍数有对应的写入寄存器的值。

总结

  • 与camera相关参数的设置,注意是以字节形式写入,有时需要进入底层去查看原因。
  • aec_port中的real_gain并不是最终写入寄存器的值,需要经过sensor模块(可能会经过截取等简单操作),还有最后转换成字节型。

备忘录

  • imx327数字增益范围是0.3-42dB;换算一下最大数字增益是125.89;最大增益为71.4dB
  • imx327_lib.h文件中最大增益是252,也就是24dB
  • 增益和倍数的换算是20lg(倍数)=dB