AN-1265: 使用ADSP-CM402F/ADSP-CM403F/ADSP-CM407F/ADSP-CM408F...

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){
}
}