CMOS Rolling Shutter是逐行曝光的,这篇博客介绍该曝光模式下根据寄存器控制量和控制信号计算帧率的方法。
行消隐/场消隐
行消隐和场消隐的概念来源于老的电视视频制式NTSC和PAL,NTSC每秒刷新60次,PAL每秒刷新50次。电子枪从左到右画出像素,每次扫描一条线,画下一条之前要先回到左边并做好画下一条扫描线的准备,这之间有一段时间叫做水平消隐(HBlank)。画完全部扫描线后,又回到屏幕左上交准备画下一帧,这一段时间就是垂直消隐(VBlank)。
对于CMOS Sensor来说,也有VBlank和HBlank的概念,Rolling Sensor在曝光时候一次曝光一行,一般CMOS只有一行ADC用于转换电信号,转换好的数字信号逐像素顺序数据,每一行输出结束和下一行输出开始的间隔我们称为行消隐(HBlank),这一帧结束到下一帧开始这段时间称为场消隐(VBlank)。
逐行曝光
我们先理解一下Sensor曝光的时序,有利于我们理解后面的计算。逐行曝光的sensor只有一行ADC,所以曝光顺序保证ADC不被各行同时占用,也就是读出时间不重叠。
一行时间计算
line_time=line_length/pclk
我们这里先介绍几个变量的定义:
PCLK:是控制像素输出的适中,表示单位时间内输出的pixel数量
line_length: 一行的长度(包含HBLANK),可以理解为包含了hblank一行的像素数
line_time: 就是曝光一行需要的时间
曝光时间计算
exposure_time = exposure_line * line_time
exposure_line:曝光时间一般是以line_time为单位的,exposure_line一般是一个寄存器,用来控制曝光时间是多少倍的line_time
exposure_time:曝光时间
line_time: 一行时间
帧率计算
这里一定要理解,sensor是一行一行曝光的,VTS就是两帧读出间隔,等于 行数*每行AD转换的时间。
帧长,隐含一帧的行数,不占用曝光时间
frame_length = Vsync =Dummy Line = Vtotal = VTS = V_Size+V_Blank
行长,隐含一行Pixel个数,占用曝光时间
line_length = Hsync = Dummy Pixel = HTotal = HTS = H_Size+H_Blank
帧率
fps=pclk/(VTS*HTS)=pclk/(frame_length*line_length)=1/(frame_length*line_time)
这里再说一下单位,、 pclk一秒内采样像素的个数,单位是HZ,VTS和HTS都是行数和一行像素个数,没有单位,line_time的单位是s。
一般line_time是一个常数,调节帧率一般是通过修改frame_length来实现。