AN-1265 应用笔记 One Technology Way • P.O. Box 9106 • Norwood, MA 02062-9106, U.S.A. • Tel: 781.329.4700 • Fax: 781.461.3113 • www.analog.com 使用ADSP-CM402F/ADSP-CM403F/ADSP-CM407F/ADSP-CM408F SINC 滤波器和AD7401A实现隔离式电机控制反馈 作者:Dara O’Sullivan、Jens Sorensen和Aengus Murray 简介 号)、SINC滤波器(解码位流并将结果发送至控制器)。本应 本 应 用 笔 记 介 绍 ADSP-CM402F/ADSP-CM403F/ADSP- 用笔记描述如何设置SINC滤波器。 CM407F/ADSP-CM408F SINC滤波器的主要特性,重点讨论 电机电流控制应用 高性能电机控制应用。 图1显示变频电机驱动器的隔离式电流反馈系统的简化原 本文的目的是强调SINC滤波器模块的重要功能,并提供 理图。该系统克服了将分流器产生的模拟信号与开关电源 ADI公司SINC滤波器驱动程序的使用指南。有关全系列 逆变器产生的高压通用信号相隔离的难题。该电路使用隔 SINC滤波器特性和配置寄存器的更多信息,请参见ADSP- 离式Σ-Δ型调制器转换信号,然后将数字信号跨越隔离栅 CM40x混合信号控制处理器(含ARM Cortex-M4硬件参考手 进行传输,解决这一难题。 册)以及ADSP-CM40x Enablement软件包中的文档。 Σ-Δ型调制器产生与输入电压成函数关系的调制位流,然 每款ADSP-CM402F/ADSP-CM403F/ADSP-CM407F/ADSP- 后将信号越过隔离栅传输至低压侧的滤波器电路。SINC滤 CM408F SINC滤波器均为完整电机电流反馈子系统的一部 波器过滤来自二阶调制器(如AD7401A)的位流,以便恢复 分;该子系统包含分流器、调制器(用于数字化和隔离信 表示电机绕组电流的16位数字信号。 ISOLATING GATE DRIVERS U RS RS V AC MOTOR W ISOLATION BARRIER AD7401A DW PWN CLK TRIP CTL SINC3 FILTER CPU IRQ DMA IV, IW DV Σ-Δ CTL 11801-001 SRAM Σ-Δ ADSP-CM40x 图1. 使用AD7401A的隔离式电流反馈 Rev. A | Page 1 of 16 AN-1265 目录 简介...................................................................................................... 1 次级滤波器定标和过载配置..................................................... 7 电机电流控制应用 ........................................................................... 1 SINC模块故障检测功能............................................................. 9 修订历史 ............................................................................................. 2 SINC滤波器设置和软件驱动功能 .............................................. 10 SINC滤波器模块概述 ...................................................................... 3 引脚多路复用配置 .................................................................... 10 电流反馈系统概述 ........................................................................... 4 数据缓冲器存储器分配 ........................................................... 10 分流选择........................................................................................ 4 中断和触发路由......................................................................... 11 调制器时钟、主滤波器抽取和数据中断速率选择 ............. 5 主滤波器和次级滤波器配置................................................... 12 主滤波器定标 ............................................................................... 7 SINC滤波器软件支持............................................................... 13 修订历史 2013年11月—修订版0至修订版A 更改图1 ............................................................................................... 1 更改图4 ............................................................................................... 4 更改表1 ............................................................................................... 5 2013年9月—修订版0:初始版 Rev. A | Page 2 of 16 AN-1265 SINC滤波器模块概述 SINC滤波器模块执行两个功能:为电机控制算法提供高保 至两组配置寄存器的其中之一,以便设置滤波器参数。电 真反馈信号,并提供故障条件下的过载电流快速检测。将 机驱动器要求多个电流或电压滤波器采用相同的配置。 过载故障信号连接至PWM调制器模块可不通过软件干预 SINC滤波器模块针对每个电机分配一组(两个)滤波器对, 来关断PWM逆变器。SINC滤波器使用DMA直接将数据传 支持对两个电机进行控制。主滤波器的设置包括:滤波器 输至存储器,当达到预设的样本数量时便产生处理器中 阶数、抽取率、失调偏置和增益调整。次级滤波器的设置 断。这样可以最大限度地减轻SINC滤波器完成配置后的软 包括:滤波器阶数、抽取率、过载跳闸电平和毛刺滤波器 件服务负担。同样的反馈电路适用于隔离式直流总线电压 设置。 反馈或直流总线电流测量。 其他配置功能包括:调制器时钟频率、中断屏蔽和DMA数 图2显示SINC滤波器模块的框图。SINC滤波器模块由四对 据传输。设置SINC滤波器需要的其他控制外设为端口控制 SINC滤波器组成,可对连接至输入的数字位流反馈信号实 器(将外部引脚连接至SINC滤波器输入)和触发路由单元(即 现滤波与过载检测。滤波器使能功能将SINC滤波器对分配 TRU,将SINC输出信号连接至适当外设)。 SINC PAIR 0 PRIMARY FROM GPIO DMA LIMIT TO TRU OVERLOAD INDICATOR LIMIT TO TRU OVERLOAD INDICATOR SECONDARY SINC PAIR 1 PRIMARY FROM GPIO SECONDARY TO MEMORY AXI MASTER INTERFACE SINC PAIR 2 PRIMARY FROM GPIO LIMIT TO TRU OVERLOAD INDICATOR LIMIT TO TRU OVERLOAD INDICATOR SECONDARY SINC PAIR 3 PRIMARY FROM GPIO SECONDARY CONTROL FOR GROUP 0 CONTROL FOR GROUP 1 TO GPIO FROM PROCESSOR MMR ACCESS APB SLAVE MODULATOR CLOCK 0 SINC MODULE MODULATOR CLOCK 1 图2. SINC滤波器模块概述 Rev. A | Page 3 of 16 TO PROCESSOR INTERRUPT REQUEST 11801-002 TO GPIO AN-1265 电流反馈系统概述 图4显示电流反馈系统的重要元件。分流器检测绕组电 最大电压范围,在其范围内调制器规格数据有效。该值低 流,将其作为与分流电阻成比例关系的电压信号处理。 于调制器的±320 mV满量程范围(VFS),因为满量程输入附近 AD7401A调制器产生隔离式位流,其脉冲密度与满量程输 的线性度和信噪比性能下降非常严重。分流电阻值必须低 入电压范围成比例。SINC滤波器根据滤波器阶数和抽取率 于Vmod(p)/Icc(p)以满足这些限制条件;此处选择最接近的 来提取脉冲密度信息。主滤波器参数优化滤波器的精度和 标称分流电阻值。对于图3中的示例而言,若电源级峰值 额外偏置,定标模块将数据转换为16位带符号整数,然后 电流额定值为8.5 A,则最大分流电阻值为23.5 mΩ。最接近 传输至存储器。次级参数优化滤波器的速度,将输出信号 该条件的分流电阻标称值为20 mΩ,额定最大电流为10 A。 传输至数字比较器,检测过载条件。上限和下限比较器检 MDAT 测电流过载,毛刺滤波器在指定窗口(LWIN)内等待最小过 VS IS FULL-SCALE INPUT 100% +320mV 16A p-p 载次数(LCNT),然后产生过载触发信号。过载触发是 PWM调制器驱动电机逆变器的一个跳闸输入信号。当存 81.25% +200mV SPECIFIED MAX INPUT 10.0A p-p 储器内的绕组电流数据就绪时,DMA传输引擎产生中断信 号,触发算法执行。 50% 0V 18.75% –200mV 0% –320mV 分流选择 的额定最大输入电压Vmod(max)。电源逆变器的峰值电流能 力通常定义控制电流范围,但可能需要考虑其他因素。 AD7401A调制器的额定最大工作电压为±200 mV,该数值为 11801-004 定义反馈所需的系统规格是峰值控制电流Icc(p)以及调制器 图3. 反馈电流工作范围 LMAX LCNT, LWIN OVERLOAD TRIGGER GLITCH FILTER SORD, SDEC SECONDARY LMIN mdatWxD'O' CPU mdatW DATA INTERRUPT IV CURRENT FEEDBACK Σ-Δ 22Ω VS 47pF IW RS BIAS IW RAM AD7401A DMA SCALE PORD, PDEC ÷2S PRIMARY OTHER CHANNEL mdatWxDO 图4. SINC滤波器电流反馈路径 Rev. A | Page 4 of 16 CTL 22Ω FULL-SCALE RANGE: ±320mV 11801-003 PWM AN-1265 调制器时钟、主滤波器抽取和数据中断速率选择 SINC FILTER NOISE PERFORMANCE 100 滤波器阶数(O)通常比前端调制器高一阶。因此,使用 AD7401A时,滤波器阶数为3。滤波器频率响应和群组延 迟的计算式如下所示。哪怕频率为抽取频率(f M /D)的数 PWM开关频率匹配可显著降低PWM开关谐波。其他考虑 GROUP DELAY (µs) 取限值。 i f H e fM O GAIN (dB) 20 10 MCLK = 10MHz, O = 3 0 50 100 150 200 250 DECIMATION RATE 300 图6. 次级滤波器SNR 表1. 不同抽取率下的SNR、ENOB和群组延迟1 抽取率 85 113 154 210 FREQUENCY RESPONSE FOR 10MHz MODULATION D = 125 −50 SNR (dB) 68 74 80 86 ENOB(位) 11 12 13 14 群组延迟(µs) 12.6 16.8 23.0 31.4 −100 1 −150 在电机驱动器中,不可能将SINC滤波器抽取率与典型 −200 PWM开关频率相匹配。匹配16 kHz开关频率所需的抽取率 −250 0 测试条件:±200 mV正弦波,1.22kHz。 为625,而滤波器群组延迟为94 µs。该抽取率远高于可提供 的数值,而群组延迟将限制电流环路带宽。相反,抽取率 −10 设为PWM频率的倍数,以便降低群组延迟并依然获得目 标滤波器SNR。控制算法在抽取频率的约数位置进行数据 −20 采样,而抽取频率匹配PWM开关频率。该软件抽取过程 −30 0 50 100 150 200 FREQUENCY (kHz) 250 300 包括:将多个数据样本传输至存储器的循环缓冲器中,以 11801-005 PHASE (Radians) 30 0 D −1 0 τ d = 2 fM 0 SINC FILTER DELAY 40 因素包括随抽取率上升的群组延迟,以及滤波器的最大抽 MCLK = 10MHz, O = 3 0 倍,图5所示的频率响应依然为0秒。因此,将抽取频率与 πf sin D πf 1 f M × e − j( D −1) f M = × D πf sin fM 50 11801-006 SNR (dB) SINC滤波器性能由调制器时钟(fM)和抽取率(D)参数确定。 及读取最近的数据样本,以便响应缓冲器填满时产生的中 图5. SINC滤波器频率响应 断。DMA引擎将数据从主SINC滤波器传输至数据存储 对于给定的滤波器阶数,抽取率和滤波器阶数是决定滤波 器,而SINC控制单元每次传输固定数量的样本后便产生一 器性噪比(SNR)和群组延迟的滤波器参数。图6和表1显示 次触发动作。 三阶滤波器以及10 MHz调制器时钟的不同SNR、有效位数 (ENOB)和群组延迟与抽取率的关系。抽取率必须位于85至 210范围内,以获得11位至14位ENOB(以及67 dB至86 dB的 SNR);该范围是电流反馈所需的滤波器性能范围。在该抽 取率范围内,群组延迟为12 µs至32 µs。 图7显示PWM开关、调制器、抽取和数据采样之间的对 齐。PWM调制器发出的同步脉冲(PWM0_SYNC)将调制器 的启动时钟与PWM频率对齐。抽取频率等于调制器时钟 的约数和PWM频率的倍数。SINC0_DAT0触发速率等于 PWM频率。 Rev. A | Page 5 of 16 AN-1265 表2中的信息显示选择抽取率和PWM开关频率的过程。表 硬件和软件抽取率必须为整数。SINC滤波器中的PCNT场 格中的前三条数据是内核和外设时钟的芯片级设置。内核 寄存器值确定软件抽取率。载入SINC滤波器控制寄存器中 时钟速率最大值为240 MHz,通常等于系统(外设)时钟频率 的PCNT值比产生中断前的采样延迟数小1。PWM_TM0寄 的偶数倍。SINC滤波器调制器的时钟(MCLK)来自系统时 存器确定PWM开关频率,从而确定采样时序。 钟,数值基于MDIV场寄存器值,且在5 MHz至20 MHz范围 表2. 抽取率选择 内有一组有限值。主抽取率(PDEC)为125,该值将滤波器 参数 内核时钟 系统时钟分频器 系统时钟 调制器时钟分频器 调制器时钟(1/TM) 抽取率 滤波器SNR 滤波器ENOB 抽取频率 滤波器群组延迟 软件抽取率 数据传输次数 PWM频率(1/TS) PWM周期数 的SNR设为76 dB(高于12位ENOB),且群组延迟为18.6 µs。 在1.25 kHz典型电流控制环路带宽下,延迟对应的相位滞后 仅为8°。调制器时钟为10 MHz;因此,主抽取时钟频率为 80 kHz,且数值为5的软件抽取率(SWDEC)将采样速率与16 kHz PWM频率(PWM)同步。调整SINC滤波器抽取率可调节 PWM频率。 决定调制器时钟、PWM频率和软硬件抽取率的等式为: MCLK = PDEC × SWDEC PWM 其中: PDEC表示硬件抽取率。 符号 CCLK SYSSEL SYSCLK MDIV MCLK PDEC SNR ENOB DCLK τd SWDEC PCNT PWM PWMTM 数值 240 3 80 8 10 125 76.0 12.3 80.0 18.6 5 4 16.00 2500 SWDEC表示软件抽取率。 TS PWNO_AH PWNO_SYNC TM MCLK τ d DEC*T M DECIMATION CLOCK TS/PCNT D(4) D(3) D(2) D(1) D(0) 11801-007 PRIMARY DATA TRANSFER SINC0_DATA0_TRIGGER 图7. 调制器和抽取时钟时序 Rev. A | Page 6 of 16 单位 MHz MHz MHz dB 位 kHz µs kHz AN-1265 主滤波器定标 SINC滤波器直流增益为DO;因此,原始输出与输入电压的 SINC滤波器阶数(O)和抽取率(D)确定主滤波器直流增益, 函数关系为: 表达如下: SINC = Gdc = DO 该单元具有输出定标和偏置功能,可将数据转换为16位带 符号整数,然后将其传输至存储器。取决于不同的表述, 数据格式在±1.0范围内作为16位分数整数(S.15)有效,或在 ±215范围内作为带符号16位整数有效。 该直流定标适用于次级滤波器输出,最大次级抽取率将原 始输出数据范围限制为16位无符号整数。负满量程输入时 的次级输出为0,正满量程输入时的次级输出为DO。 主输出路径上的偏置和定标功能可消除SINC数据偏置,并 原始滤波器输出为0至DO范围内的整数,其中DO/2与50%脉 冲密度(相当于0 A)对齐。在输出端加入−DO/2的偏置值可设 置正确的零电平。将结果除以DO/2可将满量程分数整数输 将 数 据 重 新 定 标 为 16位 带 符 号 整 数 。 偏 置 值 必 须 等 于 –DO/2以消除SINC输出失调,并用于双极性输入范围调制 器。重新定标功能从SINC输出字中选择适当的位范围。 出定标至±1,但为了简便起见,该单元具有简单的二进制 IW = 比例因子,用户可选择S,设置1.0附近的增益。无论如何 定标,DMA引擎仅传输输出数据的16个最低有效位,因此 必须正确定标,避免损失精度。输出数据饱和,防止数据 溢出;如果比例因子选择不当,则数据溢出可能会使输出 只需反转分流增益用于定标并调节滤波器直流增益和比例 因子之间的失配,即可将数据转换为浮点数。 时该目的可实现: 存储器中分流电流至数据字的最终系统增益由系统中所有 15 ×2 这种情况下,与实际绕组电流(iw)成函数关系的电流读数为: SINC BIAS SCALE VS Σ-Δ MDAT 1-BIT SINC Do 32-BIT UNSIGNED INTEGER ÷2S–1 IW 215 S.15 SIGNED FRACTION 次级SINC滤波器数据输出直接连接过载比较器和毛刺滤波 IW 16-BIT SIGNED INTEGER 图8. SINC主输出数据定标 为一个低得多的值,以便针对故障条件提供更快的响应。 制器的关断输入端,清除故障。TRU还可将过载信号连接 至其他源,如用于关断其他重要电路元件的外部GPIO。 vS = iW × RS 隔离式调制器的预期输入为双极性输入,0 V输入的情况下 具有50%脉冲密度。脉冲密度与输入电压(vs)和正满量程输 v MDAT = 0.5 S + 1 V FS 对于AD7401A,正满量程电压为320 mV,额定最大电压为 200 mV时1的密度为81.25%。 器,如图4所示。相比主滤波器,次级滤波器的抽取率设 处理器触发路由单元(TRU)将过载跳闸信号连接至PWM调 调制器得到的分流电压为: 入(VFS)之比成函数关系: 15 × 2 次级滤波器定标和过载配置 –Do/2 11801-008 RS S/W DO vS 2 S VFS O R D IW = iW × S S 0.32 2 制器为AD7401A。 AD7401A ( ) 读取带符号整数数据时,SINC输出等式加入215比例因子。 元器件的增益确定,如图8所示。本例中使用的隔离式调 IW DO ln D O << ∴ S >> 1 2S ln 2 IW = 反馈定标计算 DO O 2 = D v S 2S − 1 2 S VFS SINC − 比例因子(S)必须将最大分数整数输出设为1.0;当满足下式 信号的极性反转。发生饱和时,滤波器置位溢出故障标志。 SHUNT DO vS + 1 2 VFS 典型电源逆变器开关可耐受几微秒的短路;因此,过载电 路必须具有相对较窄的检测窗口。由于SINC滤波器能够响 应三个抽取周期内的步进输入,因此使用抽取率10可实现 3 μs以内的响应,如图9所示。SINC滤波器还可滤除逆变器 开关噪声,如图10所示。在该图中,将16 A噪声脉冲注入 10 A峰值测试波形中,持续1.5 µs;并注入持续时间为40 µs 的16 A过载脉冲。滤波器抑制短噪声脉冲,但电路检测16 A 过载脉冲。该测试中的最大和最小跳闸电平位于次级SINC 输出端,对应±16 A。 Rev. A | Page 7 of 16 AN-1265 TEST CURRENT WAVEFORM 在较低的抽取率下可达到更快的响应;但如图11所示,哪 16 会超过跳闸电平。抽取率为5时,较高的SINC滤波器噪声 产生多个伪跳闸信号。图12显示高(10)和低(5)抽取率下的 AMP 怕在±10 A的简单正弦波测试电流下,次级SINC输出电压都 SNR以及跳闸信号的噪声裕量。 0 MCLK = 10MHz, D = 10, O = 3 –16 次级输出毛刺滤波器采用跳闸计数窗口(WCNT),以低于 SECONDARY SINC DATA 1000 闸。图13显示毛刺滤波器如何消除抽取率为5时触发的杂 散过载;但响应时间具有额外三个周期的延迟。因此,较 COUNT 最小次数(LCNT)的持续时间消除跳闸,从而抑制短过载跳 500 低的抽取率不会降低响应时间。图中显示滤波器抑制模拟 输入短噪声脉冲的能力。在该示例中,噪声脉冲持续时间 0 DATA EXCEEDS MAX OR MIN LIMITS 为1.5 µs。 1.0 8个最新的数据样本,以供诊断。可通过器件外设存储器 TRIP 次级SINC滤波器包含一组历史缓冲器,用于在跳闸前存储 0.5 架构直接访问历史寄存器中的数据。 0 16 2 4 6 8 10 12 TIME (ms) 11801-010 0 TEST CURRENT WAVEFORM AMP 图10. 以抽取率10执行过载检测 0 TEST CURRENT WAVEFORM 16 0.095 0.100 AMP MCLK = 10MHz, D = 10, O = 3 –16 0.105 OVERLOAD TRIP SIGNAL 0 1.0 MCLK = 10MHz, D = 5, O = 3 SECONDARY SINC DATA 0.5 0.095 0.096 0.097 0.098 0.099 0.100 0.101 0.102 0.103 0.104 0.105 TIME (ms) COUNT 100 0 11801-009 50 图9. 次级滤波器过载检测 0 DATA EXCEEDS MAX OR MIN LIMITS 1.0 TRIP 0.5 0 0 2 4 6 8 10 TIME (ms) 图11. 以抽取率5执行伪过载检测 Rev. A | Page 8 of 16 12 11801-011 TRIP –16 AN-1265 TRANSFER FUNCTION COUNT 125 次级滤波器定标和跳闸电平 100 次级滤波器无额外输出定标,但有效的最小和最大值范围 75 为0至DO。负满量程电流映射至0,正满量程电流映射至 50 DO。将最小和最大跳闸电平设为1和DO – 1可让跳闸功能具 25 10,分流电阻为20 mΩ)显示10 A输入的噪声峰值位于滤波 TRANSFER FUNCTION 1000 COUNT 有最大范围。图12中,底部图形所示的传递函数(抽取率为 MCLK = 10MHz, D = 5, O = 3 0 器最大(1000次)和最小(0次)输出范围内。将LMIN和LMAX 750 跳闸电平设为1次计数和999次计数可避免10 A峰值电流杂散 500 跳闸信号。触发跳闸的实际电流范围为11 A至16 A满量程电 平。电流越接近满量程限值,跳闸的可能性就越大。 250 MCLK = 10MHz, D = 10, O = 3 –10 –5 0 5 10 AMP 过载电路在额定调制器输入范围内的工作精度略高。在精 11801-012 0 图12. 抽取率为5和10时的次级滤波器增益曲线 AMP 6.4 A。因此,可将跳闸设为在5 A至6.4 A范围内工作。这种 情况下的LMAX和LMIN设置分别为700次和300次计数。采 TEST CURRENT WAVEFORM 16 用较低的抽取率获得精确跳闸设置较为困难。 SINC模块故障检测功能 0 “次级滤波器定标和过载配置”部分描述了达到所需主和次 MCLK = 10MHz, D = 5, O = 3 –16 级滤波器性能的各种滤波器参数设置要求。除过载故障 外,SINC模块还检测由于异常滤波器设置导致的数据故 OVERLOAD TRIP SIGNAL 障,该故障会使芯片特定的模块过载。 1.0 存在输出偏置和定标异常时,主滤波器会检测输出数据饱 0.5 和。若滤波器DMA引擎无法在滤波器写入新数据前传输数 据,则它会检测FIFO故障。发生饱和以及FIFO故障时, 0 0 2 4 6 8 10 12 TIME (ms) 11801-013 TRIP 度较高的情况下,5 A输入的峰值噪声为700次计数,等效于 SINC_CTL寄存器中的ESATx和EFOVFx位屏蔽SINC0_STAT 产生的中断。 图13. 抽取率为5时的过载检测以及WCNT = 4且 LCNT = 4时的毛刺滤波器 Rev. A | Page 9 of 16 AN-1265 SINC滤波器设置和软件驱动程序功能 使用滤波器前,应执行数个步骤,设置SINC滤波器模块以 及信号路由和数据缓冲器。完成配置后,DMA引擎便可自 动将主滤波器数据流传输至存储器,并且次级限制功能在 发生过载时可关断PWM模块。数据就绪时,系统产生中 断,以便处理器执行控制算法,更新PWM调制器寄存 器。图14显示SINC滤波器模块和CPU、SRAM、PWM以及 外部引脚之间的互连布局,用以捕获电机电流反馈信号。 使用SINC滤波器设置电流反馈需执行四个步骤: 1. 配置引脚多路复用器。 2. 分配数据缓冲器存储器。 11801-015 3. 连接中断并触发路由。 4. 配置主滤波器和次级滤波器。 图15. 引脚多路复用器选择工具 本小节进一步讨论这些步骤,详细说明设置过程以及ADI 器件的驱动程序功能,以便设置系统和SINC滤波器控制寄 数据缓冲器存储器分配 存器。 必须定义主滤波器数据缓冲器,并为其分配存储器空间, 以便允许控制算法使用数据。软件抽取率和反馈通道数确 SYNC SINC DATA INTERRUPT D0 IV, IW D1 DV BUFFER ADDRESS BUFFER DATA SINC_PHEADx SINC_OUTx_0[3] DW DMA SRAM BUFFER CPU 由”部分描述的器件驱动程序可管理缓冲器和指针。 SINC_OUTx_1[3] 图14. SINC滤波器系统配置 SINC_PPTRx 引脚多路复用器配置 SINC_OUTx_0[0] 引脚多路复用器将前端调制器时钟和数据引脚连接至SINC SINC_OUTx_1[0] 模 块 。 有 两 个 可 用 的 调 制 器 时 钟 输 出 (SINC0_CLK0和 SINC_OUTx_0[1] SINC0_CLK1), 以 及 四 个 可 用 的 SINC数 据 输 入 引 脚 SINC_OUTx_1[1] (SINC0_D0、 SINC0_D1、 SINC0_D2和 SINC0_D3)。 SINC_OUTx_0[2] PORT_MUX寄存器控制这些引脚的选择,可针对每个多路 复用引脚从四个交替输入或输出信号中作出选择。 PinMux64.jar和PinMux32.jar Java应用程序随ADSP-CM40x Enablement软件包提供,可自动生成C语言代码,使能用 户端口选择。图15是PinMux64.jar应用软件窗口快照。 Rev. A | Page 10 of 16 SINC_TAILx SINC_OUTx_1[2] 图16. 数据缓冲器结构图 11801-016 STATUS INTERRUPT 据组的指针存储在SINC_PPTRx寄存器中。“中断和触发路 11801-014 OVERLOAD TRIGGER 定存储器尺寸。通道序列中的数据按组排列。指向最近数 CLK CLK0 TRIP PIN MULTIPLEXER PWM0 AN-1265 中断和触发路由 器数据传输触发信号与控制软件中断信号相连,开始执行 图17描述使用中断和触发信号将SINC滤波器与其他外设功 控制算法。 能互连的情况。SINC_STAT是SINC滤波器模块的单次处理 TRU将两个SINC过载触发连接至PWM调制器TRIP1输入, 器中断信号。触发路由单元(TRU)将其他触发信号连接至 SINC滤波器模块的外设和处理器中断。在TRU中将触发主 使能过流保护。TRIP0输入仅连接外部跳闸信号。必须配 置PWM调制器、TRIP0以及TRIP1输入,以便接受这些触 机地址载入触发从机寄存器可连接路由。 发信号。过载故障可产生两种中断:SINC_STAT中断直接 TRU将SINC滤波器调制器和抽取时钟与PWM调制器频率 连接CPU,而SINC过载触发产生PWM_TRIP1中断。“SINC 同步,以满足图7中定义的时序要求。TRU还将SINC滤波 滤波器软件支持”结尾部分的代码段包含器件驱动程序的 调用,可实现这些连接。 PWM0 SYNC0 TRU TRIP STAT P0_OV P1_OV TR_T1 SINC CONTROL GROUP0 OV0 SEC0 OV1 SEC1 OV2 SEC2 OV3 IRQ0 DAT0 CPU IV, IW DMA SRAM 图17. SINC滤波器触发路由 Rev. A | Page 11 of 16 CLK0 CONTROL GROUP1 SEC3 PRIM0 DO PRIM1 D1 PRIM2 PRIM3 11801-017 SYNC AN-1265 主和次级滤波器配置 SINC_LEVEL0和SINC_LEVEL1确定主和次级滤波器阶数 对滤波器通道进行分组管理,因为通常2或3个反馈信号需 (PORD、SORD)以及主滤波器定标(PSCALE)。BIAS0和 要使用同一个滤波器参数。SINC模块有两组配置寄存器。 BIAS1确 定 主 滤 波 器 数 据 失 调 。 SINC_CLK寄 存 器 确 定 任意组的通道具有相同的时钟和滤波器参数,如滤波器阶 CLK0和CLK1调制器时钟频率,可通过外部触发使能同 数、抽取率、定标和偏置。例外情况是过载限值和历史寄 步。需要的话,该寄存器还可调节时钟相位。 存器,它们具有独立的通道结构。使能某一滤波器通道即 每组3个寄存器支持主滤波器DMA通道。SINC_PHEAD0和 可将其分配至某一配置组。配置寄存器确定调制器时钟、 SINC_TAIL0确定群组0主滤波器输出数据缓冲器的存储器 滤波器参数、DMA数据传输和过载检测。 地址。SINC_PPTR0寄存器将指向最新数据的指针保存在 图18描述群组0寄存器的滤波器和系统参数分配。群组1寄 缓冲器中。SINC_LEVEL0寄存器的PCNT位确定每个数据 存器的结构与之类似。SINC_CTL寄存器使能每个通道, 中断的数据传输数量,从而设置软件抽取率(PCNT + 1)。 并分配控制组。建议过程为:先配置滤波器组,然后在群 每通道由5个寄存器支持次级过载检测功能。SEC_LIMIT0 组 中 使 能 通 道 。 SINC_CTL寄 存 器 同 样 可 以 屏 蔽 确 定 最 大 和 最 小 过 载 阈 值 , 且 P0SEC_HIST0、 SINC_STAT中断。系统状态寄存器SINC_STAT汇报故障和 P0SEC_HIST1、P0SEC_HIST2和P0SEC_HIST3在过载跳闸 数据触发计数状态。 前 存 储 最 后 8个 次 级 滤 波 器 输 出 。 SINC_LEVEL0和 每组3个寄存器以及时钟寄存器确定主和次级滤波器参 SINC_LEVEL1寄存器设置相关群组中通道的次级滤波器毛 数。SINC_RATE0和SINC_RATE1设置主和次级滤波器抽取 刺参数(LWIN、LCNT)。 率 (PDEC、 SDEC)以 及 主 滤 波 器 相 位 (通 常 为 0°)。 CTL STAT CHANNEL 0 OUT_0_0 LEVEL0: PSCALE PRIMARY RATE0: SDEC LEVEL0: SORD ÷2S BIAS0 LIMIT1: LMAX LIMIT1: LMIN CLK DAT0 LEVEL0: LWIN LEVEL0: CNT P1_OVLD HIS_STAT HISTORY BUFFER CLOCK SYNC0 OUT_0_1 PPTR0 PHEAD0 PTAIL0 LEVEL0: PCNT GLITCH FILTER SECONDARY MCLK STAT DMA RATE0: PDEC LEVEL0: PORD DATA1 CONTROL (0,1) P1SEC_HIST0 P1SEC_HIST1 P1SEC_HIST1 P1SEC_HIST3 SYSCLK 图18. SINC寄存器映射 Rev. A | Page 12 of 16 11801-018 DATA0 AN-1265 SINC滤波器软件支持 SetupSINC代码段(行[75:106])配置SINC滤波器参数。行 下文代码片段给出一个如何设置双通道电流反馈中主滤波 [78:80]打开器件驱动程序并设置回调函数。行[81:85]设置 器和次级滤波器的示例。这些代码片段从工作代码中提 各种群组参数,包括阶数和抽取率。行[87:89]控制过载限 取,并在闭环电机控制评估平台上测试。器件驱动程序增 值的初始设置,将其设为整个范围以避免滤波器启动时的 加了一些开销,但极大简化了SINC模块寄存器的编程。该 杂散跳闸信号。第86行设置循环缓冲器,用于主SINC数 函数调用与本文所用参数名相匹配的常量名,因此大部分 据;第94行和第95行分配数据通道到缓冲器。第91行和第 代码无需注释。 92行设置调制器时钟。第91行驱动程序计算系统时钟和调 第一段代码(行[1:21])定义一系列参数常量。第9行和第10 行定义主SINC数据的数据缓冲器尺寸。下一段代码(行 [22:36])设置原型功能并分配存储器。第28行和第29行定义 的SINC回调函数处理SINC_DATA0和SINC_STAT中断。 S e tup T RU 代 码 段 ( 行 [ 3 7 : 4 6 ] ) 包 含 所 有 触 发 路 由 。 SetupPWM代码段(行[47:74])包含PWM定时器频率、同步 脉冲和跳闸功能设置。外部硬件跳闸信号连接TRIP0,内 部SINC_Px_OVLD触发连接TRIP1。TRIP1中断是SINC过 载产生的中断之一。过载还产生SINC_STAT中断。 制器频率的分频比。第92行调用驱动程序使能时钟并设置 同步模式。第97行使能SINC_STAT中断屏蔽。第98行和第 99行使能分配至群组0的滤波器通道0和滤波器通道1。第 100行和第101行在指定SINC中断屏蔽(第103行)之前引入短 延迟,并设置次级滤波器过载限值(第104行和第105行)。 最后一段代码(行[106:129])包含回调函数,用于SINC数据 和过载中断。SincDataCallback函数将缓冲器的数据复制到 电机控制变量中,并调用控制函数。SincStatusCallback调 用故障处理程序。 Rev. A | Page 13 of 16 AN-1265 2. SINC FILTER SETUP CODE SNIPPETS 35. static int16_t sincCircBuffer[CIRC_BUF_SIZE]; 3. ****************************************/ 36. /************************************/ 1. /**************************************** 4. /**** Include file #define code ***/ 37. void SetupTRU(void){ 5. /* SINC definitions */ 6. #define SINC_DEV 38. /***** Function: SetupTRU snippet for SINC related setup) 0 7. #define SINC_NUM_SAMPLES 4 /* this determines how often a data interrupt is generated */ 8. #define SINC_NUM_PAIRS 39. ADI_TRU_RESULT result; 40. result = adi_tru_Open (TRU_DEV_NUM, &TruDevMemory[0], ADI_TRU_REQ_MEMORY, &hTru); 2 9. #define SINC_DATA_SIZE (SINC_NUM_PAIRS * SINC_NUM_SAMPLES) 41. // Setup TRU for SINC. Slave is SINC0 SYNC0, master is PWM0 sync pulse 10. #define CIRC_BUF_SIZE (SINC_NUM_SAMPLES*20) /* size for the device circular buffer */ 11. #define SINC_MODCLK /* modulator clock freq */ (5000000) 12. #define PDEC /* primary decimation */ 125 13. #define PSCALE /* Primary scale */ 24 4 43. result = adi_tru_TriggerRoute (hTru, TRGS_PWM0_TRIP_TRIG1, TRGM_SINC0_P0_OVLD); /* connect SINC_Px_OVLD trigger to PWM0_TRIP_TRIG1. slave, master */ 45. result = adi_tru_Enable (hTru, true); // Enable TRU */ 16. #define LCNT /* Glitch count */ 42. result = adi_tru_TriggerRoute (hTru, TRGS_SINC0_SYNC0, TRGM_PWM0_SYNC); // TRU device, slave, master 44. result = adi_tru_TriggerRoute (hTru, TRGS_PWM0_TRIP_TRIG1, TRGM_SINC0_P1_OVLD); /* Both overload detection on TRIP1. TRIP0 used by HW */ 14. #define SDEC 5 /* secondary decimation */ 15. #define LWIN /* Glitch window (code *******/ 4 46. } 17. #define LMAX 124 /* Overload max limit */ 47. void SetupPWM(void){ 18. #define LMIN 1 /* Overload min limit */ 48. /**** Function: SetupPWM (code snippet for SINC related setup) *******/ 19. /* TRU definitions*/ 49. static ADI_PWM_RESULT result; 20. #define TRU_DEV_NUM 0 21. #define ADI_TRU_REQ_MEMORY 4u 22. /* SINC related P R O T O T Y P E S memory allocation */ 50. uint32_t temp = 0; and 51. result = adi_pwm_Open(PWM_DEV, &PwmMemory, ADI_PWM_MEMORY_SIZE, &hPWM, PwmCallback, NULL); // Open driver 23. /* Function prototypes */ 52. temp = (uint32_t)(fsysclk / (2u * FPWM)); // Calculate switching period as number of sys clocks (up-down counter) 24. void SetupPWM(void); 25. void SetupTRU(void); 26. void SetupSINC(void); 53. result = adi_pwm_SetReferencePeriod(hPWM, temp); 27. /* Prototype for callback functions */ 28. static void SincDataCallback(void *pHandle, uint32_t event, void *pArg); 30. /* SINC handler and data buffers */ 54. temp = (uint32_t)(fsysclk * SYNC_PULSE_WIDTH); // Calculate sync pulse width as number of sys clocks (up-down counter) 31. static uint8_t SincMemory[ADI_SINC_MEMORY_SIZE]; 55. result = adi_pwm_SetSyncWidth(hPWM, temp); 32. static ADI_SINC_HANDLE hSINC; 56. result = adi_pwm_ExtSyncEnable(hPWM, false, false); // Internal sync used 29. static void SincStatusCallback(void* pHandle, uint32_t event, void* pArg); 33. static int16_t sincData1[SINC_DATA_SIZE]; 34. static int16_t sincData2[SINC_DATA_SIZE]; Rev. A | Page 14 of 16 AN-1265 57. result = adi_pwm_SetIntSyncTimerMode(hPWM, ADI_PWM_TIMER0); // Use timer 0 to generate sync. 74. } 75. void SetupSINC(void){ 58. result = adi_pwm_SetTripEnable(hPWM, ADI_PWM_CHANNEL_A, ADI_PWM_TRIP0_SRC, true); // Enable Trip0 and trip on all channels 59. result = adi_pwm_SetTripEnable(hPWM, ADI_PWM_CHANNEL_B, ADI_PWM_TRIP0_SRC, true); 61. result = adi_pwm_SetTripEnable(hPWM, ADI_PWM_CHANNEL_A, ADI_PWM_TRIP1_SRC, true); // Enable Trip1 and trip on all channels 62. result = adi_pwm_SetTripEnable(hPWM, ADI_PWM_CHANNEL_B, ADI_PWM_TRIP1_SRC, true); 68. result = adi_pwm_SetTripMode(hPWM, ADI_PWM_CHANNEL_B, ADI_PWM_TRIP1_SRC, false); 69. result = adi_pwm_SetTripMode(hPWM, ADI_PWM_CHANNEL_C, ADI_PWM_TRIP1_SRC, false); 70. result = adi_pwm_InterruptEnable(hPWM, ADI_PWM_INTERRUPT_TIMER0, true); // Enable sync irq 71. result = adi_pwm_InterruptEnable(hPWM, ADI_PWM_INTERRUPT_TRIP0, true); // Enable trip0 irq 72. result = adi_pwm_InterruptEnable(hPWM, ADI_PWM_INTERRUPT_TRIP1, true); // Enable trip1 irq 73. /*** other PWM setup code **/ 79. result = adi_sinc_RegisterDataCallback (hSINC, SincDataCallback, 0); 80. result = adi_sinc_RegisterStatusCallback (hSINC, SincStatusCallback, 0); 82. result = adi_sinc_SetRateControl (hSINC, ADI_SINC_GROUP_0, ADI_SINC_FILTER_PRIMARY, PDEC, 0); 64. result = adi_pwm_SetTripMode(hPWM, ADI_PWM_CHANNEL_A, ADI_PWM_TRIP0_SRC, false); // Stop PWM and report fault at trip. Do not restart 67. result = adi_pwm_SetTripMode(hPWM, ADI_PWM_CHANNEL_A, ADI_PWM_TRIP1_SRC, false); 77. static ADI_SINC_RESULT result; 81. /* Specify Group Parameters */ 63. result = adi_pwm_SetTripEnable(hPWM, ADI_PWM_CHANNEL_C, ADI_PWM_TRIP1_SRC, true); 66. result = adi_pwm_SetTripMode(hPWM, ADI_PWM_CHANNEL_C, ADI_PWM_TRIP0_SRC, false); Function: SetupSINC 78. result = adi_sinc_Open(SINC_DEV, SincMemory, ADI_SINC_MEMORY_SIZE, &hSINC); 60. result = adi_pwm_SetTripEnable(hPWM, ADI_PWM_CHANNEL_C, ADI_PWM_TRIP0_SRC, true); 65. result = adi_pwm_SetTripMode(hPWM, ADI_PWM_CHANNEL_B, ADI_PWM_TRIP0_SRC, false); 76. /*** ******/ 83. result = adi_sinc_SetRateControl (hSINC, ADI_SINC_GROUP_0, ADI_SINC_FILTER_SECONDARY, SDEC, 0); 84. result = adi_sinc_SetLevelControl (hSINC, ADI_SINC_GROUP_0, LWIN, LCNT, SINC_NUM_SAMPLES, PSCALE); 85. result = adi_sinc_SetFilterOrder (hSINC, ADI_SINC_GROUP_0, ADI_SINC_FILTER_THIRD_ORDER, ADI_SINC_FILTER_THIRD_ORDER); 86. result = adi_sinc_SetCircBuffer(hSINC, ADI_SINC_GROUP_0, sincCircBuffer, CIRC_BUF_SIZE); 87. /* Reset overload amplitude detection limits to 0 – FullScale */ 88. result = adi_sinc_SetAmplitudeLimit (hSINC, ADI_SINC_PAIR_0, 0x0000, 0xFFFF); 89. result = adi_sinc_SetAmplitudeLimit (hSINC, ADI_SINC_PAIR_1, 0x0000, 0xFFFF); 90. /* Specify Modulator Clock frequency, phase & startup synchronization */ 91. result = adi_sinc_ConfigModClock (hSINC, ADI_SINC_GROUP_0, fsysclk, SINC_MODCLK, 0, false); 92. result = adi_sinc_EnableModClock (hSINC, ADI_SINC_GROUP_0, ADI_SINC_MOD_CLK_PWM_SYNC); 93. /* submit buffers to receive SINC data */ 94. result = adi_sinc_SubmitBuffer(hSINC, ADI_SINC_GROUP_0, sincData1, 16); Rev. A | Page 15 of 16 AN-1265 107. /*** Function: SincDataCallback 95. result = adi_sinc_SubmitBuffer(hSINC, ADI_SINC_GROUP_0, sincData2, 16); ****/ 108. static void SincDataCallback(void* pHandle, uint32_t event, void* pArg){ 96. /* route the TRU interrupt */ 97. result = adi_sinc_EnableDataInterrupt (hSINC, ADI_SINC_GROUP_0, ADI_SINC_DATA_INT_0, true); 109. static uint16_t *bufferPtr; 98. result = adi_sinc_EnablePair(hSINC, ADI_SINC_PAIR_0, ADI_SINC_GROUP_0, true); 111. 112. switch((ADI_SINC_EVENT)event){ 113. Mctrl_U.ibc_sinc[1] = *bufferPtr; 110. bufferPtr = (uint16_t*)pArg; /* pointer to sincData1 or sincData2 */ 99. result = adi_sinc_EnablePair(hSINC, ADI_SINC_PAIR_1, ADI_SINC_GROUP_0, true); 100. for (int i=0; i<500; i++) // Wait 10us to let data propagate through the filter before setting trip limits. 101. asm("nop;"); 102. /* Enable & assign used SINC filter pair, and specify interrupt masks */ 105. result = adi_sinc_SetAmplitudeLimit (hSINC, ADI_SINC_PAIR_1, LMIN, LMAX); 106. } Mctrl_U.ibc_sinc[0] = *(bufferPtr+1); 115. MotorControl(); call */ 116. break; 118. break; 117. 119. 120. 103. result = adi_sinc_SetControlIntMask (hSINC, ADI_SINC_INT_EPCNT0|ADI_SINC_INT_EFOVF0 | ADI_SINC_INT_EPCNT1|ADI_SINC_INT_EFOVF1 | ADI_SINC_INT_ELIM0); 104. result = adi_sinc_SetAmplitudeLimit (hSINC, ADI_SINC_PAIR_0, LMIN, LMAX); 114. case ADI_SINC_EVENT_DATA0: 121. 122. 123. */ /* Algorithm case ADI_SINC_EVENT_STATUS: default: break; } } 124. static void SincStatusCallback(void* pHandle, uint32_t event, void* pArg){ 125. ADI_SINC_EVENT eEvent = (ADI_SINC_EVENT)event; 126. uint32_t status = (uint32_t)pArg; 128. SINC_TRIP_Fault_handler(); 127. 129. 130. ©2013 Analog Devices, Inc. All rights reserved. Trademarks and registered trademarks are the property of their respective owners. AN11801sc-0-11/13(A) Rev. A | Page 16 of 16 if (status & ADI_SINC_STATUS_GLIM0){ } }