简介:这份PDF资料聚焦CCD相机系统中驱动电路的设计,面向从事图像采集、嵌入式硬件开发及光电检测的工程师与相关专业学生,帮助解决CCD驱动时序复杂、脉冲同步困难等实际问题。资源共1个PDF文件,压缩包约582KB,内容围绕线阵CCD图像传感器μPD795展开,系统讲解其结构原理、四路驱动脉冲的时序关系,以及由脉冲发生、分频、控制与脉宽调制组成的驱动电路系统。文中还对比了EPROM、单片机、专用IC与CPLD等驱动时序实现方式,重点说明CPLD在集成度、时序控制和可重编程方面的优势,并给出基于EPM7064SLC44-7的硬件设计与实验结果。目前已有473人学习,适合需要掌握CCD驱动电路设计思路、时序分析与CPLD实现方法的读者参考。
1. 为什么 1024 像元的 μPD795 不能直接接单片机
很多做过线阵扫描的工程师都有个误区:CCD 输出的是模拟电压,那我拿个单片机 IO 翻转出几路方波不就行了?真把 μPD795 焊上板子跑起来,图像会直接告诉你答案——条纹错位、暗电平漂移、边缘像元拖影。原因在于 μPD795 内部是两列 525 位电荷转移寄存器,光敏阵列 1024 个像元的光电荷要在传输门时钟 φTGO 的窗口期内并行推入两侧寄存器,再靠 φIO 逐位串出,中间还夹着 φRO 复位和 φSHO 采样保持。四路脉冲的相位、占空比、边沿对齐关系是硬约束,任何一路抖动几十纳秒,电荷包就会串包。用单片机软件延时翻转 IO,中断一进来时序就崩,所以行业里普遍走 CPLD 这条路:全硬件并行、纳秒级确定性、还能反复改逻辑。这篇就把 μPD795 的驱动时序怎么在 CPLD 里落地讲透,从时序参数推导到 Max+PlusⅡ 仿真,再到示波器上怎么判断波形对不对。
2. μPD795 四路驱动时序的参数推导与相位约束
2.1 从电荷转移链路反推时序关系
μPD795 的工作过程可以拆成三步:积分、转移、读出。积分阶段光敏二极管积累电荷;转移阶段 φTGO 拉高,把 1024 个像元的电荷并行推到两侧的 CCD 移位寄存器;读出阶段 φIO 逐位把电荷包搬到输出放大器,每搬一位之前 φRO 要把输出二极管的残余电荷复位掉,φSHO 则在电荷包稳定后打开采样保持开关,把浮空扩散节点的电压采下来。
这四路信号的相位关系不是随便定的。φTGO 的有效窗口必须完全覆盖 φIO 的一个完整周期,否则会有像元电荷没推干净;φRO 的复位脉冲要落在 φIO 相邻两个转移脉冲之间,且不能和 φIO 的跳变沿重叠,否则复位噪声会耦合进信号;φSHO 的采样点要滞后 φIO 跳变一段时间,等输出放大器的建立时间过去再采。常见做法是把 φIO 作为主时钟基准,φRO 和 φSHO 都由它分频、移相得到,φTGO 则用行周期计数器控制,每读满 525 位(含哑元)拉高一次。
2.2 关键时序参数表
下面这张表是我按 μPD795 数据手册的典型工作条件整理的参数约束,实际项目里要拿手册逐条核对,不同批次可能有微调。
| 参数 | 符号 | 典型值 | 约束说明 |
|---|---|---|---|
| 电荷转移时钟频率 | f_φIO | 0.5~2 MHz | 越高读出越快,但转移效率下降 |
| φIO 高/低电平 | V_φIO | 0 / 5 V | 5 V 驱动,与 12 V 电源分开 |
| 复位时钟频率 | f_φRO | 与 φIO 同频 | 每位转移对应一次复位 |
| φRO 与 φIO 相位差 | Δt_RO | 约 1/4 周期 | 避开 φIO 跳变沿 |
| 采样保持时钟频率 | f_φSHO | 与 φIO 同频 | 采样点滞后 φIO 跳变 |
| 传输门时钟周期 | T_φTGO | 525 × T_φIO | 一行读出时间 |
| φTGO 有效宽度 | t_TGO | ≥ 1 个 φIO 周期 | 保证电荷完全转移 |
| 转移效率 | η | 99.996% | 手册标称值 |
提示:φTGO 的有效宽度如果只给半个 φIO 周期,边缘像元的电荷会残留,表现为图像左右两端发暗,这个坑我在早期板子上踩过。
2.3 用状态机描述时序而不是纯组合逻辑
在 CPLD 里实现这组时序,有两种写法:纯组合逻辑用计数器和比较器直接译码,或者用有限状态机。纯组合逻辑在低频下没问题,但一旦 φIO 跑到 2 MHz,组合逻辑的竞争冒险会让输出出现毛刺,毛刺打在 φRO 上就是一次误复位。我一般用状态机加寄存输出的方式,把每路信号的跳变都锁在时钟沿上,毛刺自然消掉。下面这段 Verilog 是 φIO、φRO、φSHO 三路同频信号的生成骨架,用 4 位计数器做相位基准。
// 三路同频驱动时序生成,clk 为 8MHz 主时钟
// 计数器 cnt 循环 0~7,对应 1MHz 的 φIO 周期
reg [3:0] cnt;
always @(posedge clk) begin
if (cnt == 4'd7)
cnt <= 4'd0;
else
cnt <= cnt + 1'b1;
end
// φIO:占空比 50%,cnt 0~3 为高
assign phi_io = (cnt <= 4'd3) ? 1'b1 : 1'b0;
// φRO:在 φIO 下降沿后拉高,cnt 5~6 为高,避开跳变沿
assign phi_ro = (cnt == 4'd5 || cnt == 4'd6) ? 1'b1 : 1'b0;
// φSHO:采样点滞后 φIO 上升沿,cnt 2~3 为高
assign phi_sho = (cnt == 4'd2 || cnt == 4'd3) ? 1'b1 : 1'b0;
这段代码的逻辑说明:主时钟 8 MHz 经 4 位计数器八分频得到 1 MHz 的 φIO 周期基准,cnt 从 0 到 7 循环。φIO 在 cnt 0~3 为高,占空比 50%。φRO 安排在 cnt 5~6,也就是 φIO 下降沿之后,确保复位动作不和电荷转移的跳变沿撞上。φSHO 安排在 cnt 2~3,滞后 φIO 上升沿约 1/4 周期,给输出放大器留建立时间。参数调整时改比较值即可:想让 φSHO 更晚采样,把 2、3 改成 3、4;想改 φIO 频率,改主时钟分频比或计数器位宽。
3. 在 Max+PlusⅡ 里把时序逻辑下载进 EPM7064S
3.1 器件选型与工程建立
选 EPM7064SLC44-7 不是随便挑的。它是 MAX7000S 系列里 64 宏单元、44 脚 PLCC 封装、7 ns 引脚到引脚延时的型号,做 μPD795 这四路时序绰绰有余,而且支持在线编程(ISP),调试时不用反复拔芯片。宏单元数量要算一下:三路同频信号加一路行周期 φTGO,再加分频计数器、行计数器、状态机,大概占 20~30 个宏单元,64 个留了足够余量给后续加功能。
工程建立步骤:打开 Max+PlusⅡ,新建 Graphic Editor 或 Text Editor 工程,器件族选 MAX7000S,具体型号填 EPM7064SLC44-7。把上面的 Verilog 存成 .v 文件加进工程,再写一个顶层文件例化它,分配引脚。引脚分配有个原则:四路驱动输出尽量放在同一组 IO bank,走线长度接近,减少板级 skew。
3.2 编译、仿真与引脚约束
编译前先在 Assignment 里把关键输出引脚锁定,避免每次编译引脚乱跑。然后跑 Compiler,看 Fitter 报告里的宏单元占用和延时。接着用 Waveform Editor 做功能仿真:把 clk 设成 8 MHz 周期信号,观察 phi_io、phi_ro、phi_sho 的相位关系是否和设计一致。仿真波形里重点看三件事——φRO 有没有和 φIO 跳变沿重叠、φSHO 采样点是否落在电荷包稳定区、φTGO 有效宽度是否覆盖完整 φIO 周期。
仿真通过后,用 ByteBlaster 下载线把 .pof 文件烧进 EPM7064S。这里有个常见坑:下载线驱动没装好,Max+PlusⅡ 找不到硬件,报 "JTAG chain error"。解决办法是在设备管理器里确认下载器被识别,再在 Max+PlusⅡ 的 Programmer 里选对硬件类型和端口。
# 编译后检查 Fitter 报告里的关键指标(在 Max+PlusⅡ 报告窗口查看)
# 宏单元占用:应低于 64
# 引脚到引脚延时:应低于 7ns
# 建立/保持时间余量:应为正
上面这几项是判断设计能不能稳定跑起来的硬指标。宏单元占用接近 64 时,Fitter 会开始做激进优化,可能引入额外延时;引脚到引脚延时超过 7 ns,高频下时序余量就没了。如果余量为负,要么降 φIO 频率,要么把组合逻辑改成寄存输出。
3.3 分频与控制电路的配合
系统框图中脉冲发生电路用 7.5 MHz 晶振加 74LS00 起振,分频电路用 74LS163 做可编程计数。在 CPLD 方案里,这部分其实可以全部收进片内:晶振直接进 CPLD 全局时钟脚,片内分频得到各路基准。但保留外部 74LS163 也有好处——调试时可以用拨码开关改分频比,不用重新编译。我一般把粗分频放片外、细分频和相位生成放片内,兼顾灵活性和确定性。
4. 示波器与逻辑分析仪上的波形验证方法
4.1 上电顺序与静态电平检查
板子焊好别急着上图像,先做静态检查。μPD795 是 5 V 驱动脉冲加 12 V 电源的双电源器件,上电顺序有讲究:先给 12 V 还是先给 5 V,手册里有明确要求,搞反了可能闩锁。上电后用万用表量四路驱动输出的静态电平,确认没有悬空、没有对地短路。然后把 CPLD 配置好,不接 CCD,先用示波器看四路输出是不是干净的方波,有没有毛刺和振铃。
4.2 用逻辑分析仪抓相位关系
静态没问题后接上 CCD,用逻辑分析仪同时抓 φIO、φRO、φSHO、φTGO 四路。测量档位设 2 μs,正好覆盖一个 φIO 周期。重点看三组关系:φRO 的上升沿是否落在 φIO 的低电平区中间、φSHO 的采样窗口是否在 φIO 跳变后延迟了足够时间、φTGO 的高电平是否完整包住一个 φIO 周期。原文实验里测到的波形纵坐标低电平 0 V、高电平 5 V,如果实测高电平只有 3 V 多,多半是 CPLD IO 驱动能力不够或者负载电容太大,得查走线和上拉。
# 逻辑分析仪触发设置建议
# 触发源:φIO 上升沿
# 采样率:≥ 50 MSa/s,保证 2MHz 信号有足够采样点
# 触发位置:屏幕左侧 1/4 处,留出观察后续相位的时间
# 测量项:四路信号的周期、占空比、两两相位差
采样率低于信号频率 10 倍时,抓出来的波形会混叠,看着像方波其实相位全错。触发位置放左侧是为了能看到触发之后的完整时序链。测量项里两两相位差最关键,直接对应前面参数表里的 Δt_RO 约束。
4.3 图像层面的间接验证
波形对了不代表图像就对。最终验证要看输出图像:均匀光照下,图像灰度应该平坦,没有周期性条纹;边缘像元亮度和中心一致,说明 φTGO 转移完整;暗场下噪声低,说明 φRO 复位和 φSHO 采样配合得当。如果图像出现每 525 位一个的亮线,那是行周期计数错了;如果整幅图偏暗,查 φSHO 采样点是不是太早,采到了未稳定的电压。
5. 时序余量不足时的三个调整技巧
时序余量是这类设计里最容易被忽视的东西。仿真通过、板子能跑,不代表批量生产每块都稳。我一般留 20% 以上的余量,具体靠三个手段调。
第一招是给关键路径加寄存器打拍。φRO 和 φSHO 如果直接从组合逻辑出,路径延时随温度漂移,高温下可能和 φIO 撞上。把它们改成时钟同步的寄存输出,延时被锁进一个时钟周期,温度影响就小了。代价是相位会整体平移一个周期,改比较值补回来即可。
第二招是降 φIO 频率换余量。μPD795 标称能跑到 2 MHz,但实际板子走线长、负载重时,1 MHz 下图像质量反而更好。转移效率对频率敏感,频率降一半,电荷转移时间翻倍,串包概率大幅下降。扫描速度要求不高的场合,没必要硬冲高频。
第三招是给 φTGO 加保护间隔。φTGO 拉高前后各留几个 φIO 周期的死区,避免和 φIO 的跳变沿竞争。死区期间所有时钟保持稳定,等电荷转移彻底完成再启动读出。这个改动会拉长行周期,但换来的是边缘像元不再发暗。
// φTGO 加死区:行计数器到 520 时拉高,到 524 拉低
// 前后各留 2 个 φIO 周期死区
reg [9:0] row_cnt;
always @(posedge phi_io) begin
if (row_cnt == 10'd524)
row_cnt <= 10'd0;
else
row_cnt <= row_cnt + 1'b1;
end
assign phi_tgo = (row_cnt >= 10'd520 && row_cnt <= 10'd523) ? 1'b1 : 1'b0;
这段代码把 φTGO 的有效窗口限制在行计数的 520~523,前后各留出死区。参数调整时改 520 和 523 两个边界值:死区留得越宽越稳,但行周期越长。实际项目里我会先用宽死区把图像调对,再逐步收窄死区压榨扫描速度,每收一次看一遍图像边缘有没有变暗。
256



被折叠的 条评论
为什么被折叠?



