Bootstrap

电动变焦镜头的控制

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=VPWMMODE23VPWMRESfOSCIN
  • 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禁止
1303.4us
25577.4ms
nnx8192/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禁止
1303.4us
25577.4ms
nnx8192/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/(VPWMMODE8)
  • x ∈ A , B , C , D x \in {A, B, C, D} xA,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=VPWMMODE232VPWMRESfOSCIN
  • 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
  • 第二步:计算转动次数(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/(fspin768)=27MHz/(100Hz768)=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_FZ24INTCTxx[15:0])=27MHz/(60Hz24352)=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_FZPSUMxx[7:0]24)=27MHz/(60Hz5324)=353.77=353

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间隔时间,否则最后一步还没有运动完又开始新的一步导致丢步。

;