1. 项目概述与核心挑战
在嵌入式电机控制,尤其是汽车仪表盘指针驱动这类对精度和可靠性要求极高的场景里,步进电机的失速检测是个经典难题。想象一下,你的指针需要从0刻度平滑转动到满刻度,但机械结构决定了它在两端会碰到物理限位——也就是“堵转”或“失速”。如果控制系统不知道电机已经失速,还会继续发送驱动脉冲,轻则电机嗡嗡作响、耗电增加,重则可能烧毁线圈或驱动芯片。因此,精准、实时地检测到失速点,是确保系统长期稳定运行的关键。
传统的检测方法,比如监测电机电流,在低转速、小扭矩的微步进驱动场景下往往不够灵敏。一种更优雅的思路是利用电机本身的特性:当步进电机在自由旋转时,未被驱动的线圈会因转子磁铁切割磁感线而产生一个微弱的反向电动势;一旦电机失速停转,这个反向电动势就会消失。所以,检测这个反向电动势的存在与否,就成了判断电机是否失速的“金标准”。
然而,问题来了。这个反向电动势信号极其微弱,通常是毫伏级别,并且混杂在各种噪声里。更棘手的是,我们的信号链——从模拟前端到Σ-Δ调制器——并非理想器件。模拟电源的微小偏差、运放的输入失调电压、PCB布局引入的共模干扰,都会在信号中引入一个固定的直流偏移。这个偏移电压如果不去除,它会和真正的反向电动势信号一起被后面的积分器累加。结果就是,积分器的输出值不仅反映了信号强度,还包含了一个随时间线性增长的误差项。这个误差会严重干扰我们的判断:你可能因为一个正的直流偏移,误以为电机还在转动(积分值在增长),而实际上它早就卡死了;或者因为负的偏移,在电机正常转动时却误报了失速。
我手头这份Freescale(现NXP)PXD10微控制器的参考手册,其SSD模块的文档,就详细描述了一套硬件级的解决方案。它没有采用复杂的软件滤波算法,而是在模拟域和数字域的结合处,设计了一套巧妙的“直流偏移消除”机制。这套机制的核心思想非常巧妙:既然偏移是固定的,那么我通过周期性地反转测量极性,让偏移电压在积分过程中自己“打擂台”,正负抵消,而真正的交流信号(反向电动势)则会因为极性同步反转而被正确累加。这就像用一把本身不准的秤去称东西,你先把东西放左边称一次,再连东西带砝码对调位置称一次,两次结果取平均,就能消除秤本身不准带来的误差。
接下来,我将结合手册内容和我多年的嵌入式电机驱动调试经验,为你彻底拆解这套机制的实现原理、具体配置步骤,以及在实际项目中如何避开那些手册里没写的“坑”。
2. 核心原理深度解析:直流偏移从何而来,又如何消除
要理解解决方案,必须先透彻理解问题本身。直流偏移并非单一原因造成,它是一个系统性的误差。
2.1 直流偏移的根源剖析
在PXD10的SSD模块信号链中,偏移主要来自两个层面:
- 模拟电源中点偏差:理想的模拟供电(比如VDDM/2)是信号测量的参考地。但在实际PCB上,由于电源纹波、负载瞬变、地线阻抗等因素,这个“中点”电压会漂移。Σ-Δ调制器测量的是线圈两端相对于这个中点的电压差,中点一偏,测出的“零信号”基准自然就偏了。
- 模拟前端硬件非理想性:包括运算放大器的输入失调电压、PCB漏电流、以及开关MOSFET的导通电阻差异等。这些因素会在信号通路中引入一个固定的电压偏置。
这些偏移最终会作为一个固定的电压(或电流)分量,叠加在真正的反向电动势信号上,一起送入Σ-Δ调制器。Σ-Δ调制器本质上是一个1位ADC,它输出一串比特流,其中“1”和“0”的密度比代表了输入电压的正负和大小。如果输入有一个正偏移,那么即使真实信号为0,比特流中“1”的密度也会略高于“0”。
2.2 Σ-Δ调制器与积分累加器的工作机制
SSD模块的核心测量单元是一个积分累加器。在测量阶段(积分阶段),Σ-Δ调制器的每一位输出(1或0)都会根据一个预设的“积分方向”被累加或累减到ITGACC寄存器中。
- 如果ITGDIR位设置为正向积分,那么调制器输出为1时,ITGACC加1;输出为0时,ITGACC减1(或不变,取决于具体实现)。
- 如果设置为反向积分,则逻辑相反。
在电机匀速转动时,反向电动势是一个近似正弦的交流信号。在一个完整的电周期内,它对ITGACC的净贡献理论上应该接近于零(因为正负半周对称)。但如果存在直流偏移,偏移电压会使得调制器输出持续偏向一方,导致ITGACC寄存器值随着积分时间线性增长或下降。这个线性变化的“斜坡”会完全淹没掉微弱的反向电动势交流信号,使得我们无法通过ITGACC的最终值来判断电机状态。
2.3 动态极性反转:以毒攻毒的消除策略
手册中描述的直流偏移消除机制,其精妙之处在于它是在积分过程中动态进行极性反转,而不是事后用软件去减一个校准值。具体操作如下:
同步反转两个环节:在积分阶段的特定时刻,硬件会自动触发一次“翻转”。这次翻转同时作用于两个地方:
- 模拟前端开关条件:改变接入Σ-Δ调制器的线圈两端的极性。原本接正输入端的引脚现在接负输入端,反之亦然。这相当于把测量的反向电动势信号乘以了-1。
- 数字累加逻辑:同时反转Σ-Δ调制器输出位(1或0)对ITGACC寄存器的解释。原本输出1导致加1,翻转后,输出1导致减1。
误差抵消的原理:让我们用数字来演算一下。假设直流偏移电压导致调制器输出在单位时间内产生+5个计数的净偏移(即1比0多5个)。
- 翻转前:在时间T内,ITGACC增加了
+5 * T。 - 触发翻转:模拟极性反转,直流偏移电压现在对调制器的影响变成了产生-5个计数的净偏移。同时,数字累加逻辑反转,原本-5的计数效果,经过逻辑反转后,对ITGACC的影响又变成了
+5。 - 翻转后:在下一个时间T内,ITGACC又增加了
+5 * T。
看,问题出现了!两次都是增加,偏移根本没消除。这是因为我们只反转了模拟极性,但数字累加逻辑的反转抵消了模拟反转的效果,导致偏移在两个阶段表现为同向累积。这显然不对。
仔细研读手册原文,我发现关键点在于对“数字累加逻辑反转”的理解。它的目的不是抵消模拟反转,而是维持积分方向的连续性。真正的过程应该是:
- 翻转前:假设正向积分(ITGDIR=正),偏移导致+5/单位时间。ITGACC累加。
- 触发翻转: a. 模拟极性反转,偏移电压现在会产生-5/单位时间的效应。 b.数字累加逻辑同步反转,这意味着现在系统将调制器输出“视为”已经经过了反向。为了维持我们想要的积分方向(比如始终监测正向累计值),硬件会自动将反转后的输出再“纠正”回来。实际上,这通常通过一个异或门实现:翻转信号与调制器输出进行异或,再送入累加器。当翻转信号为0时,输出原样送入;当翻转信号为1时,输出取反后送入。
- 翻转后:模拟偏移产生-5的效果,但经过数字取反,送入累加器��效果又变成了+5。因此,在整个积分周期内,直流偏移产生的效应被恒定地累加,而真正的反向电动势信号,因为其交流特性,在极性翻转前后会被正确定向累加。
等等,这听起来偏移还是存在啊?没错,如果只翻转一次,偏移确实还在。但手册中的机制是周期性多次翻转。关键在于,每次翻转,模拟极性和数字解释都同时改变。在一个包含偶数次翻转的完整积分周期内,由于偏移电压是直流的,它在每个“半周期”内对累加器的贡献符号是相同的(经过数字纠正后),因此会累积。但是,如果我们能在积分周期结束时,让累加器再额外做一次与翻转次数相关的修正,或者在配置上使得翻转前后的积分时间不完全对称,就可以实现抵消。手册中提到的“OFFCNC”位和“ITGCNTLD”寄存器右移操作,正是用于控制翻转的次数和时序,其目标是让正向和反向的积分区间尽可能均衡,从而在积分结果上抵消掉直流偏移的长期影响。最理想的情况是,偏移在正负极性下产生的计数误差绝对值相等,在累加时正负相消。
- 翻转前:在时间T内,ITGACC增加了
2.4 核心寄存器:OFFCNC与ITGCNTLD
实现上述周期性翻转的控制核心是两个寄存器:
- ITGCNTLD:这是一个16位的寄存器,用于设置积分阶段的下行计数器(DCNT)的初始值。积分时间 = (ITGCNTLD + 1) * DCNT更新周期。DCNT更新周期由ITGDIV分频器决定。
- OFFCNC:这是一个2位的控制字段,用于控制偏移消除的翻转次数。
00:禁用偏移消除。01:在积分阶段执行1次极性翻转(即分成2段)。10:执行3次翻转(分成4段)。11:执行7次翻转(分成8段)。
翻转发生的时刻由硬件自动计算。它会根据OFFCNC的设置,将ITGCNTLD的值右移0、1、2或3位(分别对应分成1、2、4、8段),得到一个“段长度”基准。硬件内部有一个额外的计数器,以这个“段长度”为周期,在积分过程中触发极性翻转。
例如,设置ITGCNTLD = 0x1FFF(十进制8191),OFFCNC = 2‘b10(分成4段)。则段长度 = 0x1FFF >> 2 = 0x7FF(十进制2047)。积分过程将被分成4个等长的段,在第0、2047、4094、6141个DCNT计数时发生极性翻转。如果ITGCNTLD的值不能被2的OFFCNC次方整除,余数部分会形成一个稍短或稍长的最终段,以确保整个积分时间准确。
实操心得:OFFCNC的选择选择更多的翻转次数(OFFCNC=11)理论上能更好地平均化偏移,因为它将偏移误差打散到更多的时间片段里。但是,每一次翻转后,Σ-Δ调制器都需要一个稳定时间(手册建议最多10μs)来建立稳定的输出。在这段稳定时间内,积分累加器采集的数据可能是无效的。因此,如果积分总时间较短,而翻转次数过多,会导致有效积分时间占比下降,信噪比变差。我的经验是,在电机高速运行(积分时间短)时,使用
OFFCNC=01(一次翻转)甚至禁用;在低速或静态精细测量时,可以使用OFFCNC=11以获得更优的偏移抑制性能。务必根据实际的电机电气时间常数(主要取决于线圈电感)来评估稳定时间是否可接受。
3. 步进电机失速检测(SSD)完整工作流程拆解
理解了偏移消除,我们再来看SSD模块的完整工作流程。手册将其描述为一个“Blank-Integrate Sequence”,即消隐-积分序列。
3.1 BIS的两个阶段:为何需要消隐?
一个完整的BIS包含两个阶段:
消隐阶段:当SSD模块准备测量某一相线圈的反向电动势时,该线圈在上一时刻可能是被驱动的状态。驱动MOSFET关断的瞬间,由于线圈电感的存在,会产生一个很大的电压尖峰(开关瞬态)。这个尖峰会完全淹没微弱的反向电动势信号。因此,在开始测量前,需要先将该线圈的两端短接到电源(VDDM或VSSM,由RCIR位选择),为感应电流提供一个续流回路,让这个瞬态电流迅速衰减。这个阶段就是消隐阶段,其时长由BLNCNTLD寄存器控制。
积分阶段:消隐结束后,线圈与驱动电源断开,接入Σ-Δ调制器的高阻抗测量端。此时,线圈中感应的反向电动势信号被调制器量化,并依据设定的积分方向(ITGDIR)和偏移消除逻辑(OFFCNC)累加到ITGACC寄存器中。这个阶段的时长由ITGCNTLD寄存器控制。
3.2 详尽的九步操作流程
手册中的图36-12和章节36.4.2.2给出了一个非常清晰的9步状态流程。我将结合代码配置的视角来解读:
第1步:测量开始
- 操作:确保SSD模块对步进电机的线圈拥有独占控制权(通常意味着要关闭其他电机驱动外设对该线圈引脚的控制)。然后,设置CONTROL寄存器中的RTZE位为1,使能SSD模块。
- 关键配置:在此刻,需要设定整个测量流程中保持不变的参数:
ITGDIR:积分方向。这需要根据电机旋转方向和线圈连接方式来确定,目的是让正常转动时的反向电动势产生正向累加。PRESCALE:预分频寄存器,用于设置DCNT递减的时钟基准。IRQ:中断使能寄存器,配置在消隐结束或积分结束时是否产生中断。
第2步:初始化SSD
- 操作:根据步进电机当前的绝对位置(步数),设置CONTROL寄存器中的STEP位(2位,表示0-3四个步进状态)。然后,设置SDCPU位为1,使能模拟前端模块。
- 注意:手册36.5.3节特别强调,为了避免SSD启动时的电流毛刺,应先设置好STEP位,再使能SDCPU位。
第3步:启动消隐
- 操作:设置TRIG位为1,同时(通常在同一寄存器写操作中)更新STEP位到下一个步进状态。这将启动一个完整的BIS。
- 细节:如果BLNDCL位为1,此步骤也会启动电机运动(即驱动另一相线圈)。消隐期间,被测线圈被连接到VDDM或VSSM(由RCIR位决定)进行续流。BLNST状态位被置1。
第4步:消隐结束?
- 硬件自动处理:DCNT计数器从BLNCNTLD值开始递减,到0时,消隐阶段结束。硬件自动清除BLNST位,并根据BLNIE位的设置决定是否产生中断。
第5步:启动积分
- 硬件自动切换:消隐结束后,硬件自动进入积分阶段。DCNT计数器被重新装载为ITGCNTLD值,并开始递减。
- 关键动作:如果ITGDCL位为1,则驱动线圈继续通电,电机继续步进。同时,根据OFFCNC位的设置,偏移消除的周期性极性翻转开始进行。ITGST状态位置1。
第6步:积分结束?
- 硬件自动处理:DCNT递减到0,积分阶段结束。硬件清除ITGST位,并根据ITGIE位设置决定是否产生中断。
第7步:停止积分
- 操作:积分阶段结束时,硬件自动停止积分累加器,禁用Σ-Δ调制器,并冻结ITGACC寄存器的值。
- 重要提示:此时,如果ITGDCL位仍为1,驱动线圈会保持通电状态,以锁住电机转子在当前步进位置,防止其因外力回弹。
第8步:读取积分结果
- 操作:从ITGACC寄存器中读取最终的积分值。这个值是在整个积分时间内,经过偏移消除处理后的净累加值。
- 结果解读:
- 如果电机��常转动,反向电动势信号存在,ITGACC的绝对值会累积到一个较大的值(正或负,取决于ITGDIR)。
- 如果电机失速停转,反向电动势消失,只有噪声和残余偏移(已被大部分消除),ITGACC的绝对值会非常小,接近零。
- 应用程序需要设定一个阈值。当|ITGACC| < 阈值时,判定为失速。
第9步:测量结束
- 决策:根据第8步的结果,决定下一步操作:
- 如果检测到失速,则清除RTZE位,停止SSD测量流程,电机停止。
- 如果未检测到失速,则返回第2步,更新STEP位,触发下一个BIS,继续驱动电机并检测。
3.3 寄存器配置速查与计算
为了让配置更直观,我整理了一个关键寄存器配置表,并附上计算示例:
| 寄存器/位域 | 功能描述 | 配置要点与计算公式 |
|---|---|---|
| CONTROL.RTZE | SSD模块总使能 | 开始测量前置1,整个流程中保持为1。 |
| CONTROL.STEP[1:0] | 步进状态 | 00, 01, 10, 11 对应四步进电机的四个励磁状态。必须与电机实际物理连接对应。 |
| CONTROL.ITGDIR | 积分方向 | 根据电机转向和线圈极性设定。通常正向转动对应正向积分。需实验验证。 |
| CONTROL.BLNDCL | 消隐期间驱动 | 1=在消隐阶段驱动另一相线圈,电机连续运动。0=消隐阶段不驱动,电机停顿。 |
| CONTROL.RCIR | 消隐续流方向 | 选择被测线圈在消隐时短接到VDDM(0)还是VSSM(1)。影响续流路径,一般根据电路设计固定。 |
| CONTROL.ITGDCL | 积分期间驱动 | 1=在积分阶段驱动线圈,电机继续步进。必须为1才能进行有效的失速检测。 |
| CONTROL.OFFCNC[1:0] | 偏移消除控制 | 00:禁用,01:1次翻转,10:3次翻转,11:7次翻转。根据积分时间选择。 |
| CONTROL.TRIG | BIS触发 | 写1启动一个新的BIS。通常与STEP更新同时进行。 |
| BLNCNTLD | 消隐时间装载值 | 消隐时间 = (BLNCNTLD + 1) * (1 / f_BUS) * (2^BLNDIV)。需大于电机续流时间常数。 |
| ITGCNTLD | 积分时间装载值 | 积分时间 = (ITGCNTLD + 1) * (1 / f_BUS) * (2^ITGDIV)。需覆盖几乎一个完整的步进周期。 |
| PRESCALE.ACDIV | Σ-Δ调制器时钟分频 | 设置ITGACC更新时钟。原则:在总线时钟允许下,设为最小分频,以获得最高采样频率和精度。参见手册表36-15。 |
| PRESCALE.BLNDIV | 消隐时钟分频 | 设置消隐阶段DCNT更新时钟。原则:设为最小分频,获得最精细的时间分辨率,以准确匹配续流时间。 |
| PRESCALE.ITGDIV | 积分时钟分频 | 设置积分阶段DCNT更新时钟。在保证ITGCNTLD不溢出的前提下,尽量设小,以提高偏移消除翻转的时间分辨率。 |
| IRQ.BLNIE | 消隐结束中断使能 | 通常使能,用于在中断服务程序中启动积分或处理状态。 |
| IRQ.ITGIE | 积分结束中断使能 | 必须使能,用于在中断中读取ITGACC结果并做出失速判断。 |
| IRQ.ACOVIE | 累加器溢出中断使能 | 建议使能,用于检测配置错误(如增益过大,信号过强)。 |
计算示例: 假设总线时钟f_BUS = 64 MHz。
- 我们希望消隐时间为50μs。选择
BLNDIV=3‘b011(分频因子64,见表36-15)。则DCNT更新周期 T_update_blnk = 64 / 64MHz = 1μs。- 需要的DCNT计数值 N_blnk = 50μs / 1μs = 50。
- 因此,
BLNCNTLD = 50 - 1 = 49(0x31)。
- 我们希望积分时间为800μs。选择
ITGDIV=3‘b100(分频因子128)。则DCNT更新周期 T_update_itg = 128 / 64MHz = 2μs。- 需要的DCNT计数值 N_itg = 800μs / 2μs = 400。
- 因此,
ITGCNTLD = 400 - 1 = 399(0x18F)。
- 检查ITGACC更新频率:根据表36-15,当
ACDIV=3‘b011时,ITGACC更新频率为1MHz(周期1μs)。在800μs的积分时间内,ITGACC会累加800次。这对于分辨微弱的反向电动势变化是足够的。
4. 高级应用模式与实战避坑指南
手册的后半部分包含了许多宝贵的应用提示和特殊模式,这些往往是项目成败的关键。
4.1 非驱动模式的应用场景
手册36.4.3节提到了两种“非常规”模式:
- 消隐无驱动模式:设置
BLNDCL=0。在消隐阶段,两个线圈都不驱动。这会导致电机运动在消隐期间暂停。这种模式不适用于SSD,因为电机停转会影响反向电动势的连续性,但可以用于某些特定的测试场景,比如单独测量开关瞬态。 - 积分无驱动模式:设置
ITGDCL=0。在积分阶段,驱动线圈不通电,电机不运动。这完全失去了失速检测的意义,因为电机本来就没动。但这个模式非常有用!它可以用于校准和诊断。在这种模式下,你可以测量纯直流偏移和电路噪声,将得到的ITGACC值作为“零位基准”,在后续的正常测量中将其减去,实现软件层面的二次校准,与硬件偏移消除形成互补。
4.2 平滑切换与状态管理
在真实的仪表指针控制中,电机通常由主驱动模块(如PWM定时器)控制快速运动到目标位置附近,然后才交给SSD模块进行精细的末端失速检测。这就涉及到驱动控制权的无缝切换。
切入SSD(Phase-In):
- 在主驱动模块控制时,记录下最后一刻的线圈驱动状态(即STEP值和电流方向)。
- 在切换控制权给SSD模块的瞬间,将SSD的CONTROL寄存器中的STEP和ITGDCL位配置成与主驱动模块完全一致的状态。
- 然后才将线圈的引脚控制权从主驱动模块切换到SSD模块。
- 最后,使能SSD的SDCPU位和RTZE位,开始BIS流程。
这样操作可以确保电机在切换瞬间没有电流突变,指针不会抖动。
切出SSD(Phase-Out): 当SSD检测到失速后,如果需要切换回主驱动模块(例如进入低功耗保持状态),过程类似:
- 记录SSD最后一个BIS结束时的STEP和ITGDCL状态。
- 将主驱动模块配置为相同的状态。
- 切换引脚控制权回主驱动模块。
- 禁用SSD模块。
4.3 关键时序与稳定性考量
模拟模块启动时间:手册36.5.1指出,硬复位或使能SSD模块后,需要等待至少20μs的模拟模块启动时间,以消除开关瞬态。务必在初始化代码中加入这个延时,否则最初的几次测量会极不稳定。
极性切换稳定时间:这是偏移消除功能带来的额外开销。手册36.5.2指出,每次极性翻转后,Σ-Δ调制器需要最多10μs来稳定输出。这意味着,如果你设置了
OFFCNC=11(7次翻转),在每次翻转后的10μs内,ITGACC累加的数据可能是无效的。因此,总的积分时间必须远大于 (翻转次数 * 10μs),否则有效测量时间占比太低,信噪比严重下降。我的经验法则是:有效积分时间至少占总积分时间的80%以上。避免轮询,善用中断:手册36.6.3强烈建议使用中断(BLNIE, ITGIE)来通知阶段完成,而不是去轮询DCNT寄存器是否为0。轮询不仅增加CPU负载,更重要的是会引入时间不确定性。中断响应是更精确、更高效的方式。
溢出检测:务必使能ACOVIE中断。如果ITGACC在积分过程中发生上溢或下溢,说明当前的配置(增益、积分时间)对于输入信号来说太“敏感”了,结果不可信。在中断服务程序中,应丢弃本次结果,并调整PRESCALE或ITGCNTLD配置。
4.4 常见问题排查实录
在实际项目中,SSD调试可能会遇到各种问题。以下是我总结的排查清单:
| 现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| ITGACC值始终为0或接近0 | 1. 模拟前端未使能。 2. 线圈未正确连接到SSD模块引脚。 3. 积分时间太短。 4. OFFCNC翻转过于频繁,有效积分时间不足。 | 1. 检查SDCPU位是否已置1。 2. 检查芯片数据手册,确认SSD相关的SINP/SINM/COSP/COSM引脚是否已正确映射到电机线圈。 3. 增加ITGCNTLD值,延长积分时间。 4. 减少OFFCNC翻转次数(如改为01或00),或大幅增加积分时间。 |
| ITGACC值巨大且溢出 | 1. 直流偏移极大,且偏移消除未生效或配置错误。 2. 电机反向电动势信号过强(如电机转速极快)。 3. 积分方向ITGDIR设置错误,导致信号被正反馈累加。 | 1. 首先在ITGDCL=0(积分无驱动)模式下测量,获取零位偏移值。检查OFFCNC是否使能,ITGCNTLD是否可被2^OFFCNC整除。2. 降低电机步进速度,或增大PRESCALE.ACDIV分频比以降低ITGACC更新频率(降低增益)。 3. 尝试反转ITGDIR位。 |
| 失速检测不稳定,时而触发时而不触发 | 1. 检测阈值设置不合理。 2. 机械振动或指针抖动产生虚假反向电动势。 3. 电源噪声干扰大。 4. 消隐时间不足,开关瞬态未完全衰减。 | 1. 在电机自由转动和强制堵转两种状态下,多次采样ITGACC值,统计分布,设置一个合理的中间阈值(如自由转动最小值的50%)。 2. 在机械结构上增加阻尼,或在软件上对多次检测结果进行滤波(如连续3次检测到失速才判定)。 3. 检查PCB的电源和地线布局,确保模拟部分供电干净,必要时增加滤波电容。 4. 逐步增加BLNCNTLD值,观察ITGACC稳定性变化,找到一个稳定点。 |
| 电机在切换至SSD模式时发生抖动 | 1. SSD切入时机不对,线圈电流状态不连续。 2. 未遵循“先配置STEP,后使能SDCPU”的顺序。 | 1. 严格按照4.2节的“平滑切换”流程操作,确保状态同步。 2. 在切入SSD的代码中,确认是先写STEP位,再写SDCPU位。 |
| 偏移消除效果不佳 | 1. ITGCNTLD值设置不当,导致翻转点落在信号变化剧烈区域。 2. 积分时间不是翻转周期的整数倍,导致正负区间不对称。 | 1. 尝试微调ITGCNTLD的值,观察ITGACC在无信号(ITGDCL=0)时的波动是否最小。 2. 确保 (ITGCNTLD + 1)是2^OFFCNC的整数倍。例如,OFFCNC=10(4段)时,ITGCNTLD+1最好是4的倍数。 |
最后,分享一个调试小技巧:可视化ITGACC的变化过程。如果你有调试器,可以编写一个简单的循环,让电机单步运行,并在每个BIS的积分结束后,通过调试接口实时读取ITGACC值并绘制成曲线。在电机自由转动时,你应该能看到ITGACC值围绕一个较大的正值或负值周期性波动;当电机失速时,这个值会迅速衰减到零附近。这张图能最直观地告诉你整个SSD系统是否工作在最佳状态。