电动变焦镜头的控制
1. 简介
- 电动变焦镜头的驱动控制器:
- AN41908A (Panansonic,参考代码)
- MS41xx (其MS41908M与AN41908A完全兼容)
- VD_FZ:Focus zoom sync. signal input (调焦变焦同步信号输入, 马达控制开始信号)
- VD_IS: Iris video sync. signal input (光圈控制图像同步信号输入, 光圈控制开始信号)
- PLS1: Pulse 1 output (脉冲1 输出)
- PLS2: Pulse 2 output (脉冲2 输出)
- INTCTxx[15:0]:设置每一步的时间(相应的,即转动速度)
- PSUMxx[7:0]:每个VD_FZ 时段内转动总步数
- 1-2相是半步:每个正弦周期分成8步
- 2-2相是整步:整步步数是半步的一半, 即每个正弦周期分成4步
- 无论2-2相,还是1-2相,PSUMxx的值 每8对应电机的一个整步, 比如 PSUM=16 走完后就刚好是电机的2个整步角
1.1 VD_FZ
1.1.1 VD_FZ的功能
- VD_FZ 是 MS419XX 芯片的马达驱动控制部分的开始控制信号(一般上升沿触发表示开始,使用普通 IO 控制即可),当 VD_FZ 上升沿到来时,芯片会根据寄存器的配置来驱动电机走相应的步数。
- 要将写入马达驱动控制部分的寄存器的值生效,都要用 VD_FZ 信号来触发。这个信号关系到与设置的电机转动时间匹配问题,所以要保证信号的稳定、准确。
- VD_FZ信号的周期不能比设置电机转动时间短,否则会出现电机没转完设置走的步数就重新开始走下一个 VD_FZ 触发的设置走的步数了,电机没走的步数就被取消了,这样就“丢步”了;
- VD_FZ 信号的周期也不要比电机转动时间长太多,间隔太长会影响转速较高的情况下的转动效果,会有较明显的停顿感,电机转动的相电流波形也会比较差。建议 VD_FZ 信号周期时间比设置的电机转动时间长 10 到 20us,这样在高速下也会有好的转动效果。
1.1.2 VD_FZ的频率 (50Hz/60Hz与视频帧同步)
- 如果 MS41 系列是用来驱动镜头做对焦建议 VD_FZ 信号和视频帧频同步, 如果不同步可能在一帧视频中间位置电机在两个 VD 间停止时间比较长时可能会引起视频卡顿现象。
- VD 周期最小是多少? 由于每次 VD 后都要延时 DT1+DT2 的时间, DT1+DT2 在27MHz 时钟下设置成 1 的最小延时都是 303.4uS DT1+DT2=303.4+303.4=606.8us , 如果时钟频率低此延时还会更大,理论上 VD 间隔 607us 就可以正常工作,但实际测试对加减速要求比较高的一般设置 2-5ms 已经足够,一般情况下10-20ms 加减速都可以,具体情况要根据系统负载等参数计算。
1.2 控制电机的速度
- 通过 INTCTxx[15:0] 寄存器设置每 STEP 走动的时间来控制电机的速度。
1.3 64 细分 128 细分 256 细分的区别
- 一个正弦波分成 64 步走和分成 256 步走效果是有差异的,分成 256 步走更加精准和平稳。
1.3 MS41xx的输入频率(OSCIN)
- MS41xx 系列输入的频率范围 15MHz-30MHz 都可以,输入不同的时钟时计算好内部寄存
器值是同样的效果。 频率不能太高不建议超过 30MHZ,也不能太低建议不要低于 15MHZ,
时钟来源可以是有源晶振,可以是主芯片的时钟输出,只要保证 50%的占空比时钟频率在
这范围都可以正常工作。
1.4 SPI的通信速度
- MS41 系列的 SPI 通信速度是 1MHz-5MHz,按照 2MHz 的通信速度计算操作一个寄存器大
概需要 12uS 的时间。不建议低于 1MHz,理论上也可以工作,但更新数据速度较慢。
2. MS41928M
2.1 关键寄存器
- α \alpha α电机寄存器:22H~25H
- β \beta β电机寄存器:27H~2AH
2.1.1 微型步进输出PWM的频率(分频)
- PWMMODE=0与PWMMODE=1的输出值一样
- OSCIN:系统时钟
- PWM频率的计算公式:
f P W M = f O S C I N V P W M M O D E ∗ 2 3 ∗ V P W M R E S f_{PWM} = \frac {f_{OSCIN}} {V_{PWMMODE} * 2^3 * V_{PWMRES}} fPWM=VPWMMODE∗23∗VPWMRESfOSCIN - 当
f
O
S
C
I
N
f_{OSCIN}
fOSCIN=27MHz时,输出的PWM的频率如下表(其单位为kHz):
2.1.2 起始点等待时间
- DT1[7:0]设置数据写入系统的延时时间(起始点等待时间)
- 电机可以精确地在起始点等待时间从“1”到“0”翻转后被激活。启示点等待时间从视频同步信号(VD_FZ)的上升沿开始计算。
- 下表基于 f O S C I N f_{OSCIN} fOSCIN=27Mhz
DT1[7:0] | 起始点等待时间 |
---|---|
0 | 禁止 |
1 | 303.4us |
255 | 77.4ms |
n | nx8192/27MHz |
2.1.3 起始点激励等待时间
- DT2A[7:0]和DT2B[7:0]设置α电机和β电机开始转动前的等待延迟时间。
- 电机在起始点激励等待时间从“1”到“0”翻转后开始转动。等待延迟时间从视频同步信号(VD_FZ)的上升沿开始计算。
- 下表基于 f O S C I N f_{OSCIN} fOSCIN=27Mhz
DT2A[7:0] / DT2B[7:0] | 起始点激励等待时间 |
---|---|
0 | 禁止 |
1 | 303.4us |
255 | 77.4ms |
n | nx8192/27MHz |
- 等待时间与VD_FZ的关系
- 1 个VD 的时间间隔内的电机的转动次数设置PSUMAB[7:0]步进电机步进数。
- 每次VD 脉冲输入时,电机转动所设置的次数。因此,设置次数为“0”是可以停止电机的转动。
- 当设置的转动次数总额超过了1 个VD 脉冲的时间,超出部分会被取消。
2.1.3 相位矫正
- α电机和β电机电流的相位差分别由PHMODAB[5:0]和PHMODCD[5:0]设置。默认为90°设置1 个
单位为0.7°同时数据可以取正反偏差
- 步进电机线圈之间的相位差一般为90°。但是,因为电机的不同,或者工艺偏差,相位差也会偏
移出90°。因此,即使驱动波形电流的相位差90°,但是电机本身不是相差90°,也会产生转矩纹波,噪声还是存在的。 - 这个设置主要是减少由于电机变化时产生的转矩纹波。
2.1.4 设置驱动能力(最大占空比、峰值脉冲宽度、电流大小)
- PPWA[7:0]到PPWD[7:0]设置PWM 波的最大占空比,决定了驱动器A 到D 输出电流峰值的位置。
- 最大占空比(MDC:MaxDutyCycle)由下式进行计算:
M D C x = P P W x / ( V P W M M O D E ∗ 8 ) MDC_x = PPW_x / (V_{PWMMODE} * 8) MDCx=PPWx/(VPWMMODE∗8) - x ∈ A , B , C , D x \in {A, B, C, D} x∈A,B,C,D
- 当 P P W x PPW_x PPWx = 时,驱动电流为0,即电机静止
- 当 M D C x MDC_x MDCx超过100%时,正弦波峰值点会被削去
- 举例:
- 当PWMMODE = 10,PPWx = 96
- M D C x MDC_x MDCx= 96/(10 × 8)= 120%
- 目标电流的波形如下显示
2.1.5 电机转动方向
- 方向定义:
2.1.6 电机刹车状态
- 刹车状态下H 桥上臂桥两个PMOS 管全部打开。刹车模式在正常操作不能被使用,在紧急关断时
才能使用。推荐在反常的状态下使用。
2.1.7 电机Enable/Disable
- ENDISAB 和ENDISCD 分别设置α电机和β电机的输出控制。
- 当ENDISxx = 0 时输出高阻态。然而,内部的激励位置计数器在ENDISxx = 0 仍然保持计数。
- 因此,当在正常状态下想要停止电机,设置PSUMxx[7:0] = 0,而不是设置ENDISxx = 0.
2.1.8 电机正弦波分频数
- MICROAB 和MICROCD 分别设置α电机和β电机的正弦波分频数。
- 64 分频的波形如下图所示(下图中的Stap No.应为Step No.):
2.1.9 电机运动总步数
- PSUMAB[7:0]和PSUMCD[7:0]分别设置α电机和β电机的总步数 (是细分的步数)
- 只要PWM 波最大占空比设置不为“0”,当PSUMxx[7:0]=0 时,电机都可以保持在释放时状态。
- 如果要停止电机转动,设置PSUMXX[7:0]=0.
- 物理意义:当PSUMAB[7:0]=8 被设定,在64 细分模式下运行16 步,即16/64=1/4 个正弦波周期。同理,在128 与256 细分模式下,同样是1/4 个正弦波周期。
2.1.10 一步的时长
- INTCTAB[15:0]和INTCTCD[15:0]分别设置α电机和β电机的一个步进的周期。
- 通过 INTCTxx[15:0] 寄存器设置每 STEP 走动的时间来控制电机的速度
- 当INTCTAB[15:0]=0,只要pwm 最大占空比不为0,电机就保持在释放时状态。
- 下图中的总步数应该为:每一步所需时间
3. 计算马达驱动参数
- 系统初始化完成之后,主要控制以下3个寄存器:
- CCWCWxx:控制旋转方向(0:正,1:反)
- PSUMxx[7:0]:控制运动步数
- INTCTxx[15:0]:控制每步运动时间(即控制速度)
3.1 计算PWM频率
- OSCIN:系统时钟
- PWM频率的计算公式:
f P W M = f O S C I N V P W M M O D E ∗ 2 3 ∗ 2 V P W M R E S f_{PWM} = \frac {f_{OSCIN}} {V_{PWMMODE} * 2^3 * 2^{V_{PWMRES}}} fPWM=VPWMMODE∗23∗2VPWMRESfOSCIN - PWM 频率建议 50-200KHz ,如果频率低于 50KHz 容易进入音频范围人耳可能听到噪音。
3.2 计算运动步数和运动速度
- 相关公式:
3.2.1 前提设定
- PPS:Pulse Per Second,即每秒的脉冲数
- 200PPS 是只每秒发送 200 个驱动脉冲。800PPS 是每秒发送 800 个驱动脉冲
- 1-2相位:半步驱动
- 励磁方式是A->AB->B->BC->C->CD->D->DA->A->AB如此循环
- MS41xx芯片把这8步当成一个正弦波周期也就是 1Hz
- 所以800PPS/8=100Hz 也就是 100 个正弦波
- 环境设置为:
- f O S C I N f_{OSCIN} fOSCIN = 27MHz
- f V D _ F Z f_{VD\_FZ} fVD_FZ = 60Hz
- VD_FZ = 60Hz = (1/60)*1000 = 16.6667ms
- 计算INTCTxx[15:0]
3.2.2 计算转动次数和转动速度
- 第一步:计算电机一步时间(INTCTxx[15:0])
-
f
s
p
i
n
f_{spin}
fspin:转动频率
I N T C T x x [ 15 : 0 ] × 768 = f O S C I N / f s p i n INTCTxx[15:0] × 768 = f_{OSCIN}/ f_{spin} INTCTxx[15:0]×768=fOSCIN/fspin
-
f
s
p
i
n
f_{spin}
fspin:转动频率
- 第二步:计算转动次数(PSUMxx[7:0])
- 由INCTxx[15:0]计算PSUMxx[7:0],不能单单看PSUMxx[7:0]的值。
- 下面的等式成立时,持续转动时间和VD 时间相同,电机才可实现均匀转动
I N T C T x x [ 15 : 0 ] × P S U M x x [ 7 : 0 ] × 24 = f O S C I N / f V D _ F Z INTCTxx[15:0] × PSUMxx[7:0] × 24 = f_{OSCIN}/ f_{VD\_FZ} INTCTxx[15:0]×PSUMxx[7:0]×24=fOSCIN/fVD_FZ - 若等式左边比右侧小,转动时间比VD 时段小会引起不连续的转动
- 若等式左边比右侧大,超过VD 时段的转动会被取消
- 第三步:PSUMxx[7:0]设置完成后,由上式重新计算INTCTxx[15:0]
3.2.3 实例 ( 计算PSUMxx[7:0]和INTCTxx[15:0])
- 计算PSUMxx[7:0]和INTCTxx[15:0]使电机在800pps(1-2 相位)转动100Hz
- 计算INTCTxx[15:0]
I N T C T x x [ 15 : 0 ] = f O S C I N / ( f s p i n ∗ 768 ) = 27 M H z / ( 100 H z ∗ 768 ) = 352 INTCTxx[15:0] = f_{OSCIN}/ (f_{spin} * 768) \\ = 27MHz/(100Hz*768) =352 INTCTxx[15:0]=fOSCIN/(fspin∗768)=27MHz/(100Hz∗768)=352 - 计算PSUMxx[7:0]
P S U M x x [ 7 : 0 ] = f O S C I N / ( f V D _ F Z ∗ 24 ∗ I N T C T x x [ 15 : 0 ] ) = 27 M H z / ( 60 H z ∗ 24 ∗ 352 ) = 53 PSUMxx[7:0] = f_{OSCIN}/ (f_{VD\_FZ} * 24 * INTCTxx[15:0]) \\ = 27MHz/(60Hz * 24 * 352) = 53 PSUMxx[7:0]=fOSCIN/(fVD_FZ∗24∗INTCTxx[15:0])=27MHz/(60Hz∗24∗352)=53 - 重新计算INTCTxx[15:0]
I N T C T x x [ 15 : 0 ] = f O S C I N / ( f V D _ F Z ∗ P S U M x x [ 7 : 0 ] ∗ 24 ) = 27 M H z / ( 60 H z ∗ 53 ∗ 24 ) = 353.77 = 353 INTCTxx[15:0] = f_{OSCIN}/( f_{VD\_FZ} * PSUMxx[7:0] * 24 ) \\ = 27MHz / (60Hz * 53 * 24) = 353.77=353 INTCTxx[15:0]=fOSCIN/(fVD_FZ∗PSUMxx[7:0]∗24)=27MHz/(60Hz∗53∗24)=353.77=353
- 计算INTCTxx[15:0]
3.2.4 细分总步数及每一步所需时间
-
INTCTxx[15:0]=353:则每一步的时间为:
- 64细分:12*353/27MHz = 156.8888us
- 128细分:6*353/27MHz = 78.4444us
- 256细分:3*353/27MHz = 39.2222us
-
PSUMxx[7:0]=53:则总步数为:
- 64细分:实际运动了 (53*2)=106步, 总共运动时间为:106*156.8888=16.630ms
- 128细分:实际运动了 (53*4)=212步,总共运动时间为:212*78.4444=16.630ms
- 256细分:实际运动了 (53*8)=424步,总共运动时间为:424*39.2222=16.630ms
-
虽然在不同细分模式下运动的步数不同,但他们运行的距离是相同的,电机转动的角度相同,且运动时间也相同。
-
INTCTxx[15:0] PSUMxx[7:0] 两个参数最后计算出来的时间一定要小于VD_FZ间隔时间,否则最后一步还没有运动完又开始新的一步导致丢步。