
简介这是一份基于可编程逻辑器件实现线阵CCD动态驱动电路设计的技术文档面向数码相机、非接触测量及工业检测领域的硬件工程师与图像传感器应用开发者。针对传统直接数字电路、单片机及计数分频驱动法在光积分时间调节上的局限文档提出利用EPM7032C44控制光转移脉冲周期在不改变系统主频的前提下随背景光强动态调整积分时间从而避免输出饱和失真并提高测量精度。内容以TCD1206UD型电荷耦合器件为例详细说明其结构、工作原理、驱动信号波形设计要点并给出该方法在带钢纵切机组自动对中系统中的实际应用案例。资源为一个DOC格式文档约120KB已有268人学习适合需要掌握动态控制思路、理解CCD驱动时序或参考可编程逻辑器件工程应用的读者可直接获得关键技术说明与设计流程。1. 新型线阵CCD驱动电路为什么还要自己设计做工业相机、光谱仪或条码扫描的工程师大概率都遇到过这样的局面选用的线阵CCD传感器手册上写着需要四路以上非标准时序脉冲贸然用专用驱动芯片又发现引脚固定、无法调整积分时间或者需要同时采集多片CCD时同步信号根本对不上。这类需求催生了一种更灵活的方案——基于CPLD/FPGA加分立驱动级的线阵CCD驱动电路用可编程逻辑生成精确时序再通过电平转换电路驱动CCD的电极。这种做法近年来越来越流行它既保留了专用芯片的稳定性又给了设计者调整积分时间、帧周期、输出增益的完全自由度。本文面向有一定硬件基础但还没完全趟过CCD驱动坑的工程师讲清楚这种设计方法的原理、参数计算和调试要点。2. 线阵CCD驱动的底层逻辑电荷转移时序与电平转换原理2.1 线阵CCD读出过程从光积分到串行输出的四类脉冲线阵CCD的核心工作过程可以拆成四个阶段。首先是光积分光敏区内由光子激发产生电荷电荷量正比于光强和时间然后由转移栅把光敏区积累的信号电荷并行转移到移位寄存器接着移位寄存器在移位时钟驱动下把电荷串行逐像素输出最后是输出复位在下一个像素到来前把输出节点复位到参考电平。整个过程需要的驱动脉冲至少有四类转移脉冲通常叫ΦGT或SH、移位脉冲ΦP、复位脉冲ΦRS、钳位脉冲ΦCLP。有些器件还有排空栅、输出栅等附加脉冲。这四类脉冲之间必须保持严格的相位关系。以一行读出为例转移脉冲高电平期间光敏区电荷向移位寄存器转移转移脉冲结束后移位寄存器开始一个像素一个像素地移动每个像素的输出周期里复位脉冲先到来把输出二极管复位然后移位脉冲到来把当前像素的电荷送到输出节点随后钳位脉冲采样复位电平再采样信号电平。这两个采样时刻之间的差值就是有效的视频信号。因此任何一个脉冲宽度或延迟不对都会导致输出波形异常。设计驱动电路的第一件事就是读透CCD手册里的时序图。常见线阵CCD的时序图会明确标注各个脉冲之间的建立时间、保持时间最小值和典型脉冲宽度。例如某个256像素线阵CCD可能要求SH高电平宽度不小于10μsΦP周期最小1μs复位脉冲ΦRS宽200ns并且必须在ΦP上升沿之前结束。这些参数直接决定CPLD内部计数器的分频逻辑。2.2 为什么CPLD输出不能直接接CCD电平与带负载能力很多新手在第一步就会翻车——把CPLD引脚直接连到CCD驱动电极上结果波形不是爬不上去就是发热严重。原因有两方面。第一是电平不匹配。常用的CPLD或FPGA在3.3V或2.5V供电下IO高电平只有3.3V而多数线阵CCD需要的驱动高电平是5V、8V甚至12V低电平会直接导致转移不完全或输出噪声抬升。第二是驱动能力。CCD的驱动电极本质上是电容负载例如转移栅电容可能达到几十到几百pF上升时间要求又很苛刻普通IO最大只能提供几毫安电流无法在几百纳秒内完成充放电。所以新型驱动电路的典型架构是CPLD输出3.3V数字时序后级接专门的时钟驱动芯片把3.3V逻辑转换成0V到指定高压的摆动信号。常用做法是选双通道或四通道的MOSFET驱动器这类芯片本身就是为驱动容性负载设计的能提供几百毫安到几安培的峰值电流。驱动器输入端直接接CPLD输出端通过一个10~22Ω的串联电阻接到CCD电极电阻用来抑制振铃。驱动器的电源设计也值得单独说。正的驱动高压通常由电荷泵或低压差线性稳压器产生电流需求不大但瞬态电流很大所以驱动器电源引脚旁边必须放一个0.1μF陶瓷电容加一个10μF钽电容且尽量靠近引脚。负压的情况同理。我一般会在每个驱动器的电源输入端加一个小磁珠隔离数字地和模拟地之间的开关噪声否则CCD输出端很容易看到周期性毛刺。2.3 偏置电压也是驱动电路的一部分OD与VBB的来龙去脉除了脉冲信号线阵CCD通常还需要几个直流偏置输出管漏极电压OD、衬底电压VBB或耗尽电压。这些电压决定了输出晶体管的静态工作点和耗尽区宽度直接影响输出灵敏度和动态范围。很多驱动电路只关注脉冲忽略了偏置的纹波和上电顺序结果图像出现固定竖条纹或暗电流不均匀。以OD为例典型值在10V到15V之间要求纹波小于几个毫伏。因为CCD输出是源跟随器结构漏极电压的微小幅值变化会直接叠加到视频信号上。VBB则一般为几伏到十几伏用于调整耗尽区深度过高的反偏会降低量子效率过低会增大暗电流。所以偏置电源不能直接用电荷泵输出至少要做一级RC滤波我习惯用1kΩ电阻和10μF电容组成低通再配合一个100nF高频电容。在设计电路时需要把所有偏置电压也纳入时序的一部分。上电时应先加偏置、稳定后再给脉冲关机的顺序则相反。有的CCD对偏置上电顺序有明确要求例如必须保证OD先于VBB建立否则可能损坏输出管。这些细节是驱动电路设计的一部分不能只画脉冲发生器。3. 用CPLD替代专用时序发生器新型驱动电路的核心架构3.1 为什么选CPLD而不选单片机或专用芯片单片机生成时序的缺点是精度和抖动。虽然可以用定时器中断翻转引脚但中断延迟、代码执行周期不确定性都会带来纳秒级到百纳秒级的抖动线阵CCD的输出信号是模拟量时钟抖动会直接变成噪声。专用CCD驱动器如传统的多通道时序发生器芯片优点是简单但它把时序固定死了既不能改变像素输出顺序也不能动态调整积分时间更无法满足多片同步。CPLD复杂可编程逻辑器件在这里几乎是共识选择。它的时钟频率可以做到几十到上百MHz内部逻辑是硬件并行执行一旦时钟稳定每个输出引脚的翻转时刻只由时钟和组合逻辑决定抖动可以控制在皮秒级别。而且CPLD上电即工作不需要加载程序适合做硬实时时序源。另一个好处是普通Lattice或Altera的CPLD成本很低几十个宏单元就能满足多数线阵CCD需求。FPGA当然也可以但启动配置慢、成本高在纯驱动场景里没有必要。3.2 用Verilog写一个可配置的CCD时序发生器设计时我习惯用一个顶层模块参数化所有时序宽度方便后续调整。下面是一个简化的可综合Verilog示例产生SH转移脉冲、ΦP移位脉冲、RS复位脉冲和CLP钳位脉冲以像素时钟为基准时钟。module ccd_driver #( parameter PIXELS_PER_LINE 256, // 每行像素数 parameter SH_HIGH_CYCLES 10, // SH高电平持续时钟周期数 parameter RS_LEAD_CYCLES 3, // RS相对ΦP上升沿提前的周期数 parameter RS_WIDTH_CYCLES 2, // RS高电平宽度 parameter CLP_OFFSET 4 // CLP相对ΦP上升沿延迟周期数 )( input wire clk, // 像素时钟例如10MHz input wire rst, // 高有效复位 input wire start, // 行同步触发 output reg sh_out, output reg ph_out, output reg rs_out, output reg clp_out ); reg [11:0] cnt; reg [11:0] pixel_cnt; reg sh_active; // 主计数一行周期为 (PIXELS_PER_LINE * SH_HIGH_CYCLES PIXELS_PER_LINE) // 简化模型SH高电平后每个像素周期一个ΦP always (posedge clk or posedge rst) begin if (rst) begin cnt 0; pixel_cnt 0; sh_active 0; sh_out 0; ph_out 0; rs_out 0; clp_out 0; end else begin if (start !sh_active) begin sh_active 1; cnt 0; pixel_cnt 0; end else if (sh_active) begin cnt cnt 1; if (cnt SH_HIGH_CYCLES - 1) begin cnt 0; sh_active 0; end end else begin // 每像素周期持续计数 if (cnt 0) begin // 一个像素周期内产生ΦP等脉冲 ph_out 1; // RS在ΦP前提前RS_LEAD_CYCLES if (pixel_cnt RS_LEAD_CYCLES pixel_cnt RS_LEAD_CYCLES RS_WIDTH_CYCLES) rs_out 1; else rs_out 0; // CLP在ΦP后延迟 if (pixel_cnt CLP_OFFSET) clp_out 1; else clp_out 0; if (ph_out) begin ph_out 0; if (pixel_cnt PIXELS_PER_LINE - 1) begin pixel_cnt 0; // 一行结束等待下次start end else begin pixel_cnt pixel_cnt 1; end end end end end end endmodule这个例子把时序参数都做成了parameter好处是仿真时可以直接用本地参数改不必重新综合。注意这里的逻辑设计只是示意真实的CCD驱动时序需要根据手册细化尤其是SH拉高期间不能产生ΦP否则会把光电荷和信号电荷混在一起。上面的代码假设SH高电平结束后再开始ΦP实际实现里SH的下降沿与第一个ΦP的上升沿之间必须留一个间隔也就是手册里要求的转移建立时间。3.3 时钟域与同步设计一个时钟源打天下新型驱动电路最容易被忽略的约束是时钟设计。线阵CCD的输出信号频率等于像素时钟频率而模拟前端AFE的采样时钟也必须来自同一个时钟源否则AFE和CCD之间的相对抖动会导致采样点漂移表现为行方向的随机噪声。我通常用一个温补晶振产生主时钟一路送CPLD另一路经过分频/缓冲器后送AFE。CPLD内部所有计数器都用同一时钟边沿触发不要在触发器之间使用异步复位避免产生比时钟还快的毛刺。关于时钟频率的选择要兼顾CCD最大数据率和CPLD的宏单元规模。常见线阵CCD数据率在1~20MHzCPLD跑20MHz完全没有压力。如果CCD支持高速模式例如50MHz像素时钟那就必须选用快的CPLD并且注意输出引脚的输出斜率设置普通IO在低速档可能出现边沿过缓导致驱动器输出的时序偏移。低成本的CPLD一般有专门的高速输出引脚如某个Bank的IO数据手册会标注tCO和最大翻转频率设计时优先分配这些引脚给ΦP和RS。4. 从仿真到原理图驱动电路的关键参数计算与电路实现4.1 电荷转移时间的估算公式与转发条件驱动电路的几个核心时间参数需要根据CCD内部结构和手册推导。对转移过程来说最重要的参数是电荷从一个栅极到下一个栅极所需的时间它由表面沟道或体沟道的迁移率和电场决定。常见经验公式是转移时间常数τ约等于栅极长度的平方除以载流子迁移率的两倍再乘以一个工艺系数。对埋沟CCD系数约为1/2对表面沟道因为界面态影响系数更大。实际工程不会去算这个物理值而是直接看手册给出的转移脉冲最小宽度。我在这类项目中一般按两个约束来设定第一转移栅上的高电平持续时间要大于手册给出的最小值同时留20%~30%余量第二转移脉冲的下降沿到第一个移位脉冲上升沿之间至少留出100ns的间隔这个间隔在手册里往往不直接标注但它决定电荷是否完全进入移位寄存器。如果间隔太短部分电荷残留在光敏区图像上表现为垂直方向的拖尾。仿真中可以用瞬态波形看转移是否稳定但更直白的办法是调长间隔观察图像的尾迹是否消失。另一个经常算错的是CCD输出信号的建立时间。输出节点电容通常在0.1~1pF源跟随器输出电阻约几千欧所以输出信号的RC时间常数在几百纳秒量级。AFE的采样点必须放在信号平坦区而不能放在边沿。因此CLP脉冲和AFE采样时钟都应当比ΦP晚半个像素周期左右具体值最好通过示波器叠加波形来确定。4.2 驱动级电源和限流电阻的计算实例以一个128像素、数据率5MHz的线阵CCD为例其ΦP负载电容约为50pF高电平5V上升时间要求小于50ns。驱动级的充放电电流可以用公式 I C × dV/dt 估算50pF × 5V / 50ns 5mA。这看起来不大但实际上驱动芯片还要同时驱动多路负载且每次翻转都要克服内部死区所以选型时至少按10倍峰值电流选。我这里的方案是用输出峰值电流不小于0.5A的两通道驱动器一个通道驱动ΦP另一通道驱动RS虽然峰值电流富余但能保证边沿不被负载拖缓。限流电阻的取值需要折中。电阻太小会看到波形过冲和振铃电阻太大上升沿变缓影响电荷转移。一般从10Ω开始试用示波器看ΦP的上升沿过冲不超过10%振铃在两个周期内衰减完。对于5V摆动的信号10~22Ω是常用范围。注意电阻要放在驱动器输出和CCD引脚之间而不是驱动器内部。电源方面5V的驱动电压可以由CPLD板上的5V直接供但最好串一个磁珠单独给驱动器供电。若CCD需要8V可以在5V基础上用低压差稳压器升压方案如5V转8V或者用DC-DC。需要注意的是DC-DC的开关噪声频率一旦与像素时钟成整数倍关系图像上会出现固定图案噪声。我测过一款升压方案的纹波是2mV肉眼已无法分辨所以优先选线性电源更稳妥。4.3 PCB布局长走线就是驱动电路的慢性病线阵CCD驱动电路对PCB布局有特定要求。驱动器输出到CCD引脚的连线必须短且宽最好控制在5cm以内否则走线电感与CCD栅极电容会产生LC谐振轻则波形振铃重则误触发电荷转移。常见做法是把驱动器放在CCD连接器正下方走线宽0.5mm以上并在CCD端加一个100Ω串联电阻配合CCD内部的并联电容形成RC阻尼。地平面处理比很多电路更讲究。驱动电路的回流电流和CCD模拟输出电路的地不能直接共用否则驱动脉冲的瞬态电流会在模拟地上产生压降这个压降直接叠加到视频信号上。我通常在PCB上把驱动地单独划一个区域单点连接到模拟电路地并且所有驱动器的GND引脚都走星形汇到这一点。如果条件允许可以在CCD传感器下方挖空地平面减少杂散电容对面阵光敏区对某些特殊应用的影响不过这属于更高阶的手段一般应用不必过度操作。5. 驱动电路调试避坑5个让波形翻车的典型问题5.1 现象ΦP上升沿有明显的台阶驱动管发热原因驱动器输出电阻和负载电容组成的RC充电曲线如果台阶高度是逻辑电平的一半多半是驱动器两个输出管切换时形成死区时间过长或者后级限流电阻过大。解决先把限流电阻改成0Ω测试如果台阶消失说明电阻取值过大如果仍有台阶更换死区更小的驱动器或检查驱动器电源电压是否在输出高电平的波形平顶上跌落。另外一个容易混淆的原因是PCB上的走线过窄导致等效电感和电阻串联分压。把走线加宽到1mm以上并在驱动器输出引脚旁边直接放一个0.1μF电容到地让高频电流就近回流。这个电容的ESR要低推荐用X7R介质。5.2 现象输出视频信号每个像素有一对尖峰但尖峰宽度不一致原因RS和CLP的相位错位。如果复位脉冲还没结束钳位脉冲就开始采样会把复位噪声当作参考电平采集进视频信号。解决用示波器同时看RS和CLP确认CLP的下降沿落在RS高电平的中间位置并且RLS脉冲结束后至少隔一个像素才能采样。具体做法是把CLP_OFFSET参数调大1~2个时钟周期观察尖峰是否合并成平滑的基线。5.3 现象CCD输出暗电流很大且与驱动高电平电压呈正相关原因驱动脉冲的高电平过高导致CCD内部电场增大耗尽层变薄产生隧穿暗电流。这种情况常见于直接使用12V给某些5V逻辑的CCD供电的电路。解决严格按手册供电多余的电压只会带来暗电流损伤。测量实际电压时要量CCD引脚上的电压而不是电源的输出电压因为限流电阻会把部分电压吃掉如果电阻太大CCD引脚实际电压可能低于设计值。5.4 现象多片CCD同一行输出错开半个像素拼接图像不连续原因多片CCD各自以自己的时钟驱动时间基准不同。像连接处像素位置错位实际是两片CCD的ΦP没有对齐到同一个时钟沿。解决这是新型驱动电路最容易踩的坑。必须把同一个CPLD的时钟分配给所有CCD驱动级并且用CPLD输出的SYNC信号统一重置所有计数器。布局上尽量让各驱动分支走线等长偏差控制在1ns以内。5.5 现象用示波器探针触碰驱动输出时图像明显改善拿开后又变差原因探针的接地夹引入了一个低阻抗路径无意中改善了高频回流。这说明驱动输出的回流路径丢失了很可能是因为驱动器IC的地引脚没有就近打孔到连续地平面而是绕了很远。解决不要在驱动输出上依赖探针的接地效果应该把驱动器地引脚周围打至少四个过孔连接地层同时把CCD连接器上的所有地信号用短的0Ω电阻直接汇到地平面。6. 进阶多路线阵CCD同步驱动与高速模式下的技巧当项目扩展到多片线阵CCD拼接时同步问题的本质变成了如何保证所有像素时钟和行触发信号同源同相。我的做法是让一片CPLD作为主设备输出全局像素时钟和复位信号其他CPLD或驱动板作为从设备所有从设备的时钟都锁在主时钟上。这里有一个容易忽略的细节如果从设备的时钟不是由主设备引脚直接输出而是经过PLL倍频或降频那么各片的相位差会被PLL引入的抖动污染最好的办法是使用全局低偏斜时钟网络并把同一源时钟分发给所有逻辑。高速模式下的时序调整往往需要预设几个不同档位的参数。例如当像素时钟从10MHz提高到20MHzSH高电平宽度不变但ΦP周期减半原来设定RS提前3个时钟周期的逻辑可能导致RS高电平覆盖到ΦP之后。因此参数不能直接用倍数关系缩放而要用绝对时间约束。在RTL里把宽度参数写成时钟周期数的整数倍再将每个整数乘以像素时钟频率在顶层做一次约束检查。我习惯把这些参数写进一个单独的头文件每次改频率后重新进行时序仿真确保所有建立时间都满足。最后想分享一个调试习惯无论参数怎么调都要用示波器连续模式观察波形上百次看脉冲抖动是否小于时钟周期的2%。很多调好的参数在样本测试时没问题量产时因为驱动器批次差异和温度变化抖动会变大。如果抖动超标优先检查驱动器的电源去耦电容是否离引脚太远以及CPLD输出的逻辑强度是否被设置成全稳态。这个习惯帮我避免过多次批量返工。希望帮到你。本文还有配套的精品资源点击获取