CCD驱动程序
摘要:这部分内容便是CCD的开端,写的是这个CCD的驱动程序,按理来说这个的东西的驱动,用FPGA驱动能更好,笔者这边使用的是C8T6,比较亲民的,并且基本大家学嵌入式的入门也是这款,所以使用这个去驱动可以降低部分的门槛
1.CCD1304时序图分析
1.1三大信号的关系
1.按照ØM的典型频率为2MKZ 也就是周期为0.5us
这个的东西你结合我上边放置的具体的电路图,便可以看出来这个ICG的低电平宽度该为这个SH高电平的宽度+5us
SH高电平只要大于这个1us即可,同时其拉高的时间比这个ICG慢500ns
那么在这个时候该如何做呢?
直接先忽视这个SH和ICG的初始,这么假设这个东西是开始都是高电平,同时设这个SH为A信号,ICG为B信号
那么很显然就能列出来他们两个的关系式,如下图所示
A信号:高电平x μs,低电平y μs,y最少为1us B信号:高电平x-0.5 μs,低电平y+5 μs
1.2周期信号的呈现
然后咱们在分析这个波的完整图
前边的波形好说,那么后续的波该如何弄呢?
这个时候就要使用定时器当中的单脉冲模式
咱们使用这个单脉冲模式去输出前边的波,因为他是重复的,那么咱们要把这个的开关,放到这个while当中去
没有所谓的周期的事情,因为使用这个while循环去模拟了这个周期
只需要管这个低电平的持续时间,以及这个延迟即可
也就是图片当中的这个绿色,后续的这个电平,直接用一个Delay去阻塞即可,
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
__HAL_TIM_ENABLE(&htim1); // 等价于 TIM1->CR1 |= TIM_CR1_CEN
__HAL_TIM_ENABLE(&htim3); // 等价于 TIM3->CR1 |= TIM_CR1_CEN
HAL_Delay(35);
}
就是用这个代码,来构成了所需要的周期,因为单脉冲模式下这个,只能被触发一次
1.3整体的分析
然后结合咱们要求的这个 主控板对应的这个时钟频率,以及上边的关系式子,那么咱们直接发给AI,让他去算这个CCR和ARR
条件:STM32定时器时钟72MHz,PSC=0,开启单脉冲OPM,向上计数,PWM1输出模式,输出极性高;初始电平高,0~CCR为高电平,CCR~ARR为低电平,1μs对应72个计数tick。
A信号:高电平x μs,低电平y μs
B信号:高电平x-0.5 μs,低电平y+5 μs
限制:x必须大于0.5,y大于1us,输出CCR_A、ARR_A、CCR_B、ARR_B,并校验两路高低电平实际时长。输入x、y。
结果
A:CCR_A=144,ARR_A=432
B:CCR_B=108,ARR_B=756
校验:A 高 2μs 低 4μs;B 高 1.5μs 低 9μs,全部整数无误差。
2.C8T6的定时器配置
前边算出来这个ARR和CCR,计算的结果是假设是高电平的时候,那么咱们回归本来的,该如何配置?
我的建议就是参考下边的表格选择适合咱们的
2.1前提条件
- 定时器:向上 UP / 向下 DOWN 二选一;输出模式 PWM1 / PWM2;输出极性固定 HIGH(有效电平 = 高,静止初始电平高)
- OPM 单脉冲开启,CNT 走完一次 ARR 后停机
- 有效电平 = 高,无效电平 = 低
- 总计数区间:0 ~ ARR
表格:计数方向(UP/DOWN)× PWM1/PWM2 四组搭配时序
| 序号 | 计数方向 | 输出模式 | 电平判定规则 | 完整波形时序(初始静止:高电平) |
|---|---|---|---|---|
| 1 | UP 向上 | PWM1 | CNT <CCR → 有效 (高)CNT ≥ CCR → 无效 (低) | 0 |
| 2 | UP 向上 | PWM2 | CNT <CCR → 无效 (低)CNT ≥ CCR → 有效 (高) | ARR:高电平结束回到低电平 |
| 3 | DOWN 向下 | PWM1 | CNT > CCR → 有效 (高)CNT ≤ CCR → 无效 (低) | ARR |
| 4 | DOWN 向下 | PWM2 | CNT > CCR → 无效 (低)CNT ≤ CCR → 有效 (高) | ARR |
补充:如果极性改为 LOW(有效电平 = 低,静止初始电平低)
规律整体取反:
- UP+PWM1:0
CCR 低,CCRARR 高,静止低 - UP+PWM2:0
CCR 高,CCRARR 低,静止低 - DOWN+PWM1:ARR
CCR 低,CCR0 高,静止低 - DOWN+PWM2:ARR
CCR 高,CCR0 低,静止低
2.2结合表格分析
2.2.1SH信号
先低xus,然后高yus,结束之后依旧为低,使用通用定时器
PWM2 + 极性高(有效 = 高)+UP
- (CNT < CCR):输出无效电平 = 低
- (CNT \ge CCR):输出有效电平 = 高
- 计数跑完 ARR、OPM 硬件关定时器后,引脚维持无效电平(低)
- CCR_A=144,ARR_A=432
2.2.2ICG信号
先高x-0.5us,然后低这个y+5us,结束之后依旧为高,使用高级定时器
配置:UP + PWM2 + OCPolarity_LOW + OCIdleState_SET + OPM 单脉冲
- 计数中:CNT<CCR 高,CNT≥CCR 低
- 脉冲结束停机:OCIdleState 强制输出高,覆盖默认无效电平
- 表现:延时阻塞全程高,脉冲波形符合需求
也可以使用这个
UP 向上 + PWM 模式 1+极性高
CCR_B=108,ARR_B=756
2.3总结
TIM1/TIM2/TIM3:核心是生成 CCD 传感器的 SH、ICG 等控制脉冲(φM是TIM2,SH是TIM3,ICG是TIM1
while循环当中的Delay就是延时多少时间开始重复,也就是电荷的积累时间