AN-1267: 使用ADSP-CM408F ADC控制器的电机控制反馈采样时序 (Rev. A)

AN-1267
应用笔记
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-CM408F ADC控制器的电机控制反馈采样时序
作者:Dara O’Sullivan、Jens Sorensen和Aengus Murray
简介
有关此ADCC的所有功能、配置寄存器和应用程序接口(API)
本应用笔记介绍ADSP-CM408F模数转换器控制器(ADCC)
的更多详细信息,请参阅ADSP-CM402F/ADSP-CM403F/
模块的主要特性,重点讨论该产品在高性能电机控制应用
ADSP-CM407F/ADSP-CM408F产品页面和采用ARM Cortex-M4
的电流反馈系统中的相关性与可用性。
和16位ADC开发产品的ADSP-CM40x混合信号控制处理器
本应用笔记的目的是为了强调模数转换器(DAC)模块的关
的产品页面上提供的《采用ARM Cortex-M4的ADSP-CM40x
键功能,并提供针对电机控制应用的配置指南。本文提供
演示ADI ADCC驱动器的代码示例。
混合信号控制处理器硬件参考指南》。
虽然本应用笔记重点讨论电流反馈,类似的配置和应用原
理同样适用于其他信号的反馈与测量。
同样,虽然本应用笔记重点讨论ADSP-CM408F,但原理在本
质上同样适用于ADSP-CM402F/ADSP-CM403F/ADSP-CM407F/
ADSP-CM408F系列的其他产品。
Rev. A | Page 1 of 18
AN-1267
目录
简介...................................................................................................... 1
ADC数据访问.................................................................................. 10
修订历史 ............................................................................................. 2
ADCC数据故障检测................................................................. 10
电流反馈系统概述 ........................................................................... 3
ADCC模块、触发路由和存储器设置 ....................................... 11
ADC模块概述.................................................................................... 4
ADCC事件配置.......................................................................... 11
电流反馈调整 .................................................................................... 5
中断和触发路由......................................................................... 12
ADC时序考虑因素........................................................................... 6
数据访问和存储器分配 ........................................................... 12
ADCC事件时序............................................................................ 6
ADCC软件支持............................................................................... 13
ADC操作时序 .............................................................................. 7
示例代码...................................................................................... 13
ADC流水线................................................................................... 9
示例实验结果 ............................................................................. 18
修订历史
2014年9月 — 修订版0至修订版A
更改“简介”部分................................................................................. 1
更改图2 ............................................................................................... 3
更改图3 ............................................................................................... 4
更改“电流反馈调整”部分 ............................................................... 5
更改“ADC操作时序”部分 ............................................................... 7
增加“采样时刻调整”部分和图11;重新排序 ............................ 8
增加“利用触发路由提供增强型精确采样时序”部分............. 12
更改“示例代码”部分...................................................................... 13
2013年9月—修订版0:初始版
Rev. A | Page 2 of 18
AN-1267
电流反馈系统概述
电机控制应用中的电流反馈示例如图1所示。该配置常用
这些特性可使能PWM周期中相位电流测量点的精密时
于高性能电机驱动,并针对电机相位绕组电流采样,而非
序。将这些测量时刻与零矢量的中间点或PWM周期的中
对逆变器低端相位引脚采样。中高电平时,电流传感器或
间点对齐,确保电流采样电平等效于忽略开关纹波的瞬时
变压器(CT0和CT1)必须用于电流测量路径,因为阻性分流
平均电流。
器尺寸过大而低效。
图2中显示了零矢量中点和PWM周期中点处的同步U相位
在图1的配置中,处理器位于安全的隔离栅低压侧,而信
和V相位采样。
号隔离通常为CT0和CT1所固有,且微处理器的脉冲宽度
VW
调制PWM输出和栅极驱动器之间还存在数字隔离。
IW
通常需要在电流传感器输出和ADC输入之间进行一些信号
调理,以便实现范围匹配和高频噪声滤波。随后将调理的
PWM
CYCLES
PWM
V
电流测量信号施加于ADC输入,用来采样和转换。对每个
ADC输入进行一次绕组电流测量将使能电流测量的同步采
0
1
2
3
W
MOTOR
CURRENT
SAMPLING
iV, iW
样以获得更高的控制环路精度,从而增强性能。另外,还
可在硬件内直接配置采样时间与PWM sync脉冲的同步。
ISOLATING
GATE DRIVERS
SAMPLING
SIGNAL
U
CT0
V
W
AC
MOTOR
SAMPLED
CURRENT
DATA
(V, W)
11835-002
CT1
图2. 平均电流采样图解
ISOLATION BARRIER
完成数据转换后,便可将其通过直接存储器访问(DMA)传
OTHER
MEASUREMENTS
ADC1
OTHER
MEASUREMENTS
IRQ
SRAM
DMA ADCC
ADSP-CM408F
图1. 电机控制中ADSP-CM408F ADC的电流反馈
输至控制器静态随机存取存储器(SRAM),完成传输后会生
成一个中断。在内核模式下,通过存储器映射寄存器,还
可实现直接ADC状态和数据读取,但这种方法需消耗更多
11835-001
CPU
ADC0
MUX1
PWM
MUX2
SYNC
的处理器开销。
通常还会采样其他模拟信号,例如直流总线电压、隔离式
栅极双极性晶体管(IGBT)温度和电机位置正弦与余弦输
出。虽然本应用笔记重点讨论电流反馈,但很多信息也与
系统中的其他测量参数有关。
Rev. A | Page 3 of 18
AN-1267
ADC模块概述
该ADC采用双通道、16位、高速、低功耗、逐次逼近型寄
片内2.5 V基准电压源,当优先选择外部基准电压源时可将
存器(SAR)设计,精度高达14位。
其过驱(通过ADCC_CFG寄存器选择该选项)。
输入多路复用器最多支持连接两个独立受控ADC的26个模
ADSP-CM408F中的总模拟子系统的图形概述如图3所示。
拟输入源组合(每个ADC的12路模拟输入加上1路DAC回送
ADSP-CM408F采用多芯片系统级封装(SiP),而ADC硅片
输入),任意时刻都对两个通道同步采样。ADC转换时间快
制造工艺与处理器硅片工艺有所不同,如图3所示。
达380 ns。单端模拟输入所需的电压输入范围为0 V至2.5 V。
ADCC负责ADC中与处理器的时序同步,并管理DMA,将
多路复用器和ADC之间提供片内缓冲器,无需使用额外的
采样数据传输到SRAM。
外部信号调理ADSP-CM408F。此外,每个ADC都有一个
ADC SILICON
PROCESSOR SILICON
BUF
ADC0
DAC0
NOT
PINNED OUT
BUF
BUF
ADC1
DAC1
LOCAL
DAC CONTROL
NOT
PINNED OUT
CTL
MMRs
ADCC
DMA
MUX1
VIN0
VIN1
VIN07
DATA
DATA
CTL
SRAM
MMRs
DACC
图3. ADSP-CM408F模拟子系统
Rev. A | Page 4 of 18
CPU
11835-003
BUF
MUX0
VIN0
VIN1
VIN07
LOCAL
ADC CONTROL
BAND GAP
AN-1267
电流反馈调整
若要最大限度地正确利用ADC的能力,正确调整反馈信号
ADC输出信号中去除,使带符号值IW(与实际相位绕组电
非常重要。信号通过反馈路径处理,如图5所示。双极性
流有关)的表达式为:
IW = KADC(KSIG[KCT(IW)IW + V0CT]) – NADC_OFFSET – NCT_OFFSET
相位绕组电流IW通过电流传感器(或变压器)和信号调理电
路的组合功能转换为ADC输入端的单极性电压。
其中:
电流传感器的传递函数由下式表示:
N CT _ OFFSET =
VIW = KCTIW + V0CT
216
V0
2.5 CT
这个带符号的16位值可转换为浮点值,或直接使用,具体
其中:
取决于控制器实现方案。若要最大限度地利用ADC的全范
VIW为输出电压。
围,则系统中的正峰值受控电流必须与ADC输入电压2.5 V
KCT是传感器的线性增益系数。
相对应,而负峰值受控电流与ADC输入0 V相对应。
V0CT是传感器的零电流失调电压。
该情况的一个示例如图4所示。该图显示了典型电流波形
KCT在不同传感器类型的某些电流水平下表现出非线性,
和相关的各种零电平、峰值电平以及标称电平,图4显示
且为了获得更佳的精度,应当与IW成函数关系,即KCT (IW)。
的电流电平将转换为通过信号测量系统传播(如图5所示)的
之后,ADC输入电压可表示为:
比例量(参见表1)。
VIW_ADC = KSIGVIW = KSIG[KCT(IW)IW + V0CT]
LPK+
其中,KSIG是信号调理电路的低频增益。
该单极性电压转换为16位无符号整数,并由DMA传输至处
LNOM+
理器存储器,然后发出中断,提醒控制程序新数据样本可
IW
L0
用。ADC理想化的传递函数如下所示:
216
VIW _ ADC
2.5
LNOM–
其中:
LPK–
NIW是ADC数字输出字。
11835-005
N IW = K ADCVIW _ ADC =
图4. 电流反馈信号幅度
KADC表示ADC的线性增益,等于根据输入电压范围划分的
表1. 电流反馈信号幅度
ADC分辨率,如上所示。
IW (A)
6.8
4
0
−4
−6.8
级别
LPK+
LNOM+
L0
LNOM−
LPK−
ADC输出会产生一些失调;而在软件内进行一些失调补偿
(NADC_OFFSET)通常是一个好办法,可将ADC自身的所有失调
以及传感器和信号调理电路产生的所有残余失调从ADC输
出中去除。该值可在零电流周期(如系统启动或禁用驱动输
出)中动态更新。
VIW (V)
4.625
3.75
2.5
+1.25
+0.375
VIW_ADC (V)
2.313
1.875
1.25
+0.625
+0.188
NIW
0xECD9
0xC000
0x8000
0x4000
0x1340
本示例采用连接LEM®,的CAS 6-NP霍尔效应传感器,其初
级匝数为3,具有0 V至5 V输出,后接增益为0.5的信号调理
最后,电流传感器零电流失调电压NCT_OFFSET的数字表示从
电路。
IW
BIPOLAR
CURRENT
KCT
SIGNAL
CONDITIONING
+
ADC
S/W
NADC_OFFSET
V0CT
+
VIW
KSIG
VIW_ADC
0V TO 2.5V
UNIPOLAR
VOLTAGE
KADC
NIW
+
16-BIT
UNSIGNED
INTEGER
图5. 电流反馈路径的调整关系
Rev. A | Page 5 of 18
–
NCT_OFFSET
+
–
IW
16-BIT
SIGNED
INTEGER
11835-004
CURRENT
TRANSDUCER
AN-1267
ADC时序考虑因素
以PWM周期同步采样事件对于精确电流反馈而言非常重
ADCC事件时序
要。ADCC采用PWM周期工作的概念时序如图6所示。下
控制器管理最多24个采样事件的配置和时序。这些事件的
列事件序列由PWM SYNC脉冲触发。
时序受触发限制,该触发会启动两个定时器(TMR0或TMR1)
1. PWM sync脉冲触发定时器,以便启动。
中的其中一个,并在定时器启动后启动一个事件时间。
2. ADCC不断将事件信息中的采样时间与定时器时间比较。
如图7所示,触发源可从一系列外设或处理器事件中选
3. 完成定时器匹配,ADCC计划ADC操作。
取,如PWM SYNC脉冲、定时器或I/O引脚中断。每次事件
4. ADC变为可用后,ADCC便使用事件信息选择适当的通道。
都与一个事件号码(以Event x表示)、一个事件时间(以TIMEx
5. ADCC触发ADC转换序列,ADC采样并转换数据。
表示)、控制信息(以CTLx表示)及其结果数据相关联。事件
6. 数据回流至ADCC。
控制信息(图7中以CTLx表示)包含每个采样事件的信息,
7. ADCC将数据通过DMA传输至存储器位置(LSB优先)。
如ADC接口和通道号、所用的ADC定时器、同步采样选
8. 产生中断(IRQ),提醒CPU数据样本可用。
择,以及相关事件ADC数据的存储器失调。ADCC使用该
GET DATA
DMA
4
TRANSFER
COMPLETE
TRANSFER
DATA
ADC
7
然后,可设置DMA传输,将每次事件的ADC数据移入
SRAM中。完成所有事件和后续DMA传输之后,便产生一
SELECT
ADC CHANNEL
ADCC
个中断,通知主应用代码新ADC数据可用。
ADSP-CM40x
图6. ADCC操作序列
TIME
ADC_CTL
DATA
TM0-MX2-A0-S-O
DATA (x)
EVENT 0
...
EVENT x
TIMEx
...
SRAM
EVENT 23
TRIGGER
SELECTION
COMPARE
EVT
ADC
CTL
ADC
DATA
SEL
ADAT0
ADC CTL
TRU
SEL
PWM0...2
TIMER0...7
COUNT0...3
PININT0...7
SW0...5
CVST0
CHx
TMR0
ADC1
ADAT1
CVST1
CHx
TMR1
ADC0
CTLx
TMRy
TMRy
ACTL
ADCx
TIMEx
t
Trigy
CTLx
图7. ADCC模块功能框图
Rev. A | Page 6 of 18
SIM
OFS
DATA OFFSET
SIM SAMPLE Y/N
ADC0/ADC1
MUX CHx
TMR0/TMR1
11835-007
SRAM
8
6
11835-006
IRQ
的事件数据寄存器中。
5
START
SAMPLING
EVENT
INFORMATION
CPU
ADC转换(CVST0/CVST1信号)并将正确的数据传输至适当
3
tSAMPLE
MUX0
2
MUX1
SYNC
信息对正确的ADC通道(CHx)进行多路复用处理、初始化
TIME = tSAMPLE
TIMER
DMA
1
MUX
PWM
AN-1267
例如,图8显示与ADC定时器0有关的3个采样事件。PWM
ADCC提供这3个事件相位的片选和选通时钟信号。ADCC
sync脉冲触发定时器,事件时间与每一次事件相关联。事
与ADC的接口为串行接口,采用双通道位操作。因此,每
件0和事件1是同步采样事件,事件时间寄存器中的事件时
个CS脉冲期间提供的最小时钟周期数(ADCC时序控制寄存
间置零。事件2稍后发生,并同样由事件2时间寄存器确
器的NCK段)为8。其他重要的设置有:ADC时钟频率、转
定,表示为ADC时钟周期(tACLK)的倍数。若事件2是与定时
换周期片选信号之间的最小延迟(tCSCS)(ACLK周期内),以
器0关联的最终事件,则定时器将在事件处理完成后停止
及CS边沿和ACLK边沿之间的最小延迟(tCSCK和t CKCS)。因
运行,以降低功耗。
此,单个同步采样信号对的ADC转换周期时间tCONV_ADC可
表示为:
PWM
SYNC
Timer 0
t = ADCC_EVT00 × tACLK
其中,fACLK表示ADCC时钟频率。
Event 2
11835-008
Event 0, Event 1
t = ADCC_EVT02 × tACLK
ADCC时钟由处理器系统时钟(fSYSCLK)通过ACKDIV分频(在
时序控制寄存器ADCC_TCA中)在内部产生,计算如下:
图8. 事件时序
ADC操作时序
ADCC控制器触发采样事件后,ADC操作本身具有一个转
其结果是系统时钟来源于处理器内核时钟(f CORECLK )。当
换时间延迟。图9显示单次ADC事件与每个ADC接口相关
fCORECLK为fSYSCLK的整数倍时,获得最佳系统性能。完成ADC
联,且使能两次事件同步采样的情况。
转换后,额外延迟是因为ADC数据通过DMA传输至数据
有三个独立的转换周期与ADC操作有关:
存储器,并最终由中断请求服务将数据帧准备就绪,供主应
1. 写入8位控制字,选择ADC读取通道(ADCC_EVTCTL.
用程序使用。因此,在应用中,从触发(例如,PWM SYNC
CTLWD)。
脉冲)到数据可用的总时间为:
2. 置位转换脉冲,使能ADC采样和转换。
3. 让16位ADC数据回流至ADCC。
其中:
tDMA是DMA传输的平均时间。
tIRQ是中断请求服务的平均时间。
EVT0 ~ ADCC0
EVT1 ~ ADCC1
tCSCK
tCKCS
NCK
FRAME PROCESSED
IRQ
tCSCS
ADC0 + ADC1 CS
ACLK
ADC0 MUX0
ADC1
ADC1 MUX1
ADC0 S/H
AND CONV0
ADC0 S/H
AND CONV1
ADC0 DATA0
DMA
IRQ LATENCY
ADC1 DATA1
TOTAL CONVERSION TIME
SAMPLING INSTANT
图9. 单次事件同步采样的转换时间
Rev. A | Page 7 of 18
11835-009
ADC0
AN-1267
典型时序设置见表2。表中还列出了对时序的一些约束条
调度中需加以考虑,虽然在1 kHz的典型电流控制环路带宽
件。获得正确ADC性能的绝对约束条件是,允许的ADC采
环境中,这表示不超过0.2°的相移。此外,对于10 kHz的典
样和转换周期(tCONV_ADC/3)必须至少为380 ns。单个同步采样
型PWM频率,ADC数据从产生PWM SYNC脉冲(表2中的设
事件的时序结果如图10所示,该结果与电机绕组电流的采
置)起,在不足2%的可用PWM周期时间内可供应用程序使
样有关(注意,该图为了突出示例而略为夸大)。
用 。 如 果 在 事 件 发 生 时 ADC处 于 空 闲 状 态 , 则 4至 5个
SYSCLK周期的额外延迟将存在于事件激活的时刻与ADC
开始工作的时刻之间。
∆iSAMP
采样时刻调整
可能需要进一步提高电机电流采样时刻的精度并消除所需
PWM SYNC
ADC S/H
450ns
ADC CONVERSION
COMPLETE
1350ns
ADC DATA AVAILABLE
1600ns
采样时刻和实际采样时刻之间的450 ns失调。精度提高后对
低电感伺服电机等应用案例或者采用较高开关频率的情况
特别有益。要消除这一较小的时间偏移量,一种方法是使
11835-010
用通用(GP)定时器在PWM sync脉冲前一个ADCC片选脉宽
处创建触发。这可以通过从前一PWM sync脉冲触发GP定时
器来实现,如图11所示。
图10. 采样延迟时间
采用这些设置时,在所需的电流波形采样点与实际采样点
使用此方法时,在PWM周期结束前安排任何采样事件时
之间存在450 ns失调。该值等于一个片选脉宽(200 ns + 25 ns +
必须谨慎。所有采样事件必须在下一周期开始前一个片选
0 ns)加两次片选之间的脉宽(225 ns)。 该结果造成平均电机
脉宽处完成(图11中的EVT0标记)。
绕组电流和实际采样电流之间的ΔiSAMP产生差异,在时序
tSW
PWM SYNC
tSW – 1 CS
1 CS
TMRn_CNT
TMRn TRIGGER
OUT
EVT0
ALL EVTS
FIRED
ADCC_TMR0
MUX0
CONV0
DATA0
MUX0
CONV0
DATA0
MUX0
ADC1
MUX1
CONV1
DATA1
MUX1
CONV1
DATA1
MUX1
11835-111
S/H
ADC0
图11. 采样时刻调整的实现
图2. 典型ADC设置的时序设定
参数
fCORECLK
fSYSCLK
fACLK
CS时间(tCSCS)
CS边沿至ACLK边沿(tCSCK)
ACLK边沿至CS边沿(tCKCS)
CS之间的时间间隔(tCSCS)
tCONV_ADC
tDMA
tIRQ
数值
240 MHz
80 MHz
40 MHz
200 ns
25 ns
0 ns
225 ns
450 ns
50 ns
200 ns
备注
允许的最大值
最大值为100 MHz
最大额定值为50 MHz
必须允许足够的ACLK周期才能传输CTL字和数据
推荐40 MHz时的最小时间
推荐
必须高于150 ns以便精确采样
平均需要4个SYSCLK周期
平均需要16个SYSCLK周期
Rev. A | Page 8 of 18
设置
PLL配置
fSYSCLK = fCORECLK/3
ADCC_TCA0.CKDIV = 1
ADCC_TCA0.NCK = 8
ADCC_TCB0.TCSCK = 1
ADCC_TCB0.TCKCS = 0
ADCC_TCB0.TCSCS = 9
AN-1267
ADC流水线
所有与PWM周期相关的采样事件以流水线方式处理。该
当新事件开始与ADC正在处理的现有事件重叠时,ADCC
方法可以确保新的ADC样本能在PWM周期中可能的最早
将新事件作为待处理事件存储在8深先进先出(FIFO)缓冲器
时刻准备就绪。要实施图13中显示的流水线,则需要所有
中,该缓冲器可用于所有ADC接口。写入激活事件的控制
事件时间均接近零,即紧跟在PWM SYNC脉冲后。
字后,ADCC立即开始写入首个待处理事件的控制字,同
建议在两个事件时间寄存器ADCC_EVTnn(nn表示0到24的
时进入激活事件的采样阶段。同样,第一个待处理事件的
寄存器编号)中存储的事件时间之间允许一个最小1 ACLK周
控制字阶段执行完成后,便进入第二个待处理事件的控制
期,实现正确调度。图12中显示使用流水线操作时的总转
字阶段。以这种方式,ADCC可在每个ADC接口上通过流
换时间,包括起始延迟、DMA传输和中断服务,可用于采
水线方式交错处理三个并行事件。因此,事件能以紧凑高
用表2中所示时序设置的各种同步采样对数目。
效的方式排列。
6
配置事件时序使事件以上述流水线方式处理,可获得最高
采样事件的触发时间间隔很短。
图中,三对同步采样事件的触发时间间隔很短。ADCC开始
处理事件0和事件1,同时将事件2至事件5存储在FIFO中。
然后,ADC资源变得可用时,便会对这些事件进行处理。
从图7可知,在CS某次置位期间,ADCC会处理全部6个事
件以及每个事件的多个阶段,并且两次连续采样之间的时
间间隔仅为18个ACLK周期。该时间间隔相当于表2设置中
5
4
3
2
1
0
的450 ns,且可通过提高ACLK频率进一步降低。若要在电
1
2
3
4
5
6
7
SAMPLE PAIRS
机控制应用内最大化ADC带宽,最好的方法是有意识地将
EVT0~ADCC0; EVT1~ADCC1
EVT2~ADCC0; EVT3~ADCC1
EVT4~ADCC0; EVT5~ADCC1
图12. 不同采样对数目的总转换时间
FRAME PROCESSED
IRQ
ADC0 + ADC1 CS
ADC0 MUX0
ADC0 S/H
AND CONV0
ADC0 MUX2
ADC0 DATA0
ADC0 S/H
AND CONV2
ADC0 DATA2
ADC0 MUX4
ADC0 S/H
AND CONV4
ADC1
ADC1 MUX1
ADC1 S/H
AND CONV1
ADC1 MUX3
ADC0 DATA4
ADC1 DATA1
DMA
ADC1 S/H
AND CONV3
ADC1 DATA3
ADC1 MUX5
ADC1 S/H
AND CONV5
TOTAL CONVERSION TIME
图13. ADC中的流水线事件
Rev. A | Page 9 of 18
IRQ LATENCY
ADC1 DATA5
11835-011
ADC0
8
11835-012
TOTAL CONVERSION TIME (µs)
的ADC吞吐速率。该流水线如图13所示。图中,三对同步
AN-1267
ADC数据访问
目前为止,本文中的示例都假定ADC数据采用自动DMA
ADCC数据故障检测
传输从存储器中访问。从ADCC存储器映射寄存器(MMR)
ADCC提供多个故障状态寄存器位,发生数据故障时可置
的内核读数中直接访问数据是可行的,如图14所示。注
位;ADCC事件时序和/或不确定事件序列设置不当时,就
意,图14中的ACK表示确认信号,而非模拟时钟。
有可能发生数据故障。这些故障可能使ADCC过载,或造
成无效的ADC数据。它们包括:
ACK
TIMER 0/TIMER 1
FRAME
SRAM
• DMA带宽。帧结束所需的时间长于用户定义时间。
Event 0
EVENT00
Event 1
EVENT01
Event 2
EVENT02
OPTIONAL
EVENT IRQs
ACK
• 存储器错误。ADC数据写操作失败。
ADCC
MMRs
• 事件冲突。处理现有事件时发生新事件。
• 事件错失。事件未处理。
EVENT03
11835-013
Event 3
• 触发溢出。当前帧结束前便触发下一次事件。
Core READ
ADCC_EISTAT
TRIG
TIME
CPU
ADCC_FISTAT
FRAME IRQs
这些错误均可按需配置为内核的中断源,并且它们都会置
位ADCC_ERRSTAT寄存器。在电机控制应用中,尤其在电
图14. 内核模式的ADC数据访问
流反馈测量中,与事件错失、存储器和触发溢出有关的错
在内核模式下,CPU通过事件或帧中断获取有关新数据就
误对于监控核心应用非常重要,因为错误或错失的电流环
绪的信号,这些中断可按需独立屏蔽或解除屏蔽。该模式
路数据可能会导致控制环路的不稳定。事件冲突在流水线
下还具有额外的灵活性:在整个事件帧结束前,一旦完成
操作中非常普遍,通常影响不大,除非FIFO已满。
独立事件,即可对其进行读取。内核模式的缺点是中断服
务以及MMR读访问所需的总延迟比DMA模式下要高。采
用优化的内核和时钟分频比设定,则在每个中断服务的最
高延迟情况下,每次MMR读操作将花费10至12个SYSCLK
周期。
图15显示了DMA模式下的数据访问。在这种情况下,
DMA传输仅在完成一个定时器帧后才会发生,且帧中断信
号仅在完成DMA传输后才发给CPU。
TIME0 FRAME
ADCC_FISTAT
ACK
FRAME IRQ
DMA UNIT 0
CPU
SRAM
DMA UNIT 1
TIME1 FRAME
ACK
11835-014
FRAME IRQ
ADCC_FISTAT
图15. DMA模式下的ADC数据访问
两种情况下,EISTAT和FISTAT寄存器都在激活后提供事件
和帧中断的状态指示,且必须在下一次触发前经由CPU清
零相关位确认,否则将标记一次触发溢出条件。
Rev. A | Page 10 of 18
AN-1267
ADCC模块、触发路由和存储器设置
PWM_U
使用ADC之前,需执行一系列步骤来设置ADCC模块以及
PWM_V
触发路由单元和数据缓冲器。完成配置后,假定采用DMA
PWM_W
PWM SYNC
存储器,供主应用程序进行内部访问。当数据就绪时,
TMR0/TMR1
ADCC产生中断,以便处理器执行控制算法并更新PWM调
TRIGGER
制器寄存器。
ADC0
图17显示ADCC、CPU、SRAM、PWM和外部信号之间所
eSIN VDC THS
tE0
E
0
E
2
E
3
ADC1
tE1
设置ADCC以便正确处理信号反馈的三个步骤如下所示:
1. ADCC事件配置。
2. 中断和触发路由。
3. 数据访问和存储器分配。
下列子段落描述正确设置系统所需的步骤与相应的寄存器
tE3
E
0
iW
E
1
E
5
E E
2 3
E
1
TMR1 FRAME IRQ
馈以及其他模拟监控信号。在本例中,编码器正弦和余弦
提供。
tE2
E
4
eCOS
需的互连,可用于在典型电机控制应用中捕捉电机电流反
信号、散热片温度和直流总线电压作为额外监控输入示例
iV
TMR0 FRAME IRQ
图16. 电机控制应用中的典型ADCC
表3. 示例应用的事件配置
事件
E0 (eSIN)
E1 (eCOS)
E2 (VDC)
E3 (THS)
E4 (iV)
E5 (iW)
定时器
TMR0
TMR0
TMR0
TMR0
TMR1
TMR1
ADC
I/F
0
1
0
0
0
1
ADC
通道
0
0
2
3
1
1
时间
tE0
tE1 = tE0
tE2
tE3
0
0
同步采样
是
是
否
否
是
是
配置。
相位电流iV和iW在发生PWM sync脉冲触发后立即同步采样,
ADCC事件配置
它们关联至TMR1。定时器1帧立即通过DMA传输至存储
ADCC事件的配置示例如图17所示,该示例包括为每个事件
分配定时器、ADC接口和通道、时间偏移以及同步采样开
关。这可以通过多种方法实现;图16以及表3所示为其中的
器,且新的电流样本可供主应用程序使用。在PWM周期中
的较晚时刻,新的事件帧采样并关联至TMR0。编码器正
弦和余弦信号同步采样,紧随其后的是直流总线电压和散
热片温度信号。对三个ADC0信号进行流水线处理,以最大
一种可能情况。该示例采用全部两个定时器,仅供参考。
化吞吐速率。然后,将TMR0帧通过DMA传输至存储器。
对于此示例,事件可连接至一个定时器,因为所有事件的
定时都与PWM SYNC脉冲有关。在诸如双轴电机控制算法
这类用例中,可能必须同时使用两个定时器,因为该用例
这些参数的配置需设置ADCC_EVCTLnn事件控制寄存器
和ADCC_EVTnn事件时间寄存器,nn表示每个事件的编
号。提供本节内容涉及的驱动程序API,简化该过程。
采用两组PWM输出以及相应的PWM sync脉冲。
ADSP-CM408F
M
E
PWM
VDC
THS
iV
iW
eSIN
SYNC
eCOS
TRU
S/W
CPU
TRIGGER
M0
ADC0
M1
ADC1
ADCC
图17. 典型电机控制应用中的系统互连
Rev. A | Page 11 of 18
ADC
DATA
DMA
SRAM
11835-015
INVERTER
E
4
E
5
11835-016
数据访问模式,则DMA引擎会自动将主ADC数据传输至
AN-1267
中断和触发路由
数据访问和存储器分配
在图17中的示例中,所有事件时间均参考PWM周期;因
如图14和图15所示,可通过读取内核MMR访问ADC数
此,两个定时器都由PWM SYNC脉冲触发。PWM sync脉冲
据,或通过DMA传输使其能在SRAM中访问。在内核模式
作为硬件触发与ADCC定时器相关联的前提是配置TRU,
下,无需配置特定存储器分配,即可实现除变量外的内核
使PWM sync脉冲作为主触发信号与ADCC触发从机相关联。
MMR读取数据的写操作。然而在DMA模式下,必须分配
随后,ADCC定时器必须与ADCC触发相关联。
特定的存储器区域,然后进行配置,才能实现DMA访问,
并且每个定时器都必须配置。所需的存储器大小取决于每
图18显示相应触发路由的概念图;该路由涉及触发主机19
个定时器相关的帧尺寸,以及新的帧覆盖之前需要在存储
(PWM0 SYNC)与触发从机24 (ADCC_TRIG0)之间的连接,
器中存储多少帧。
本例中该连接可通过将主机编号写入适当的从机选择寄存
器TRU_SSR24来实现。之后,通过在ADC_CTL寄存器中
表 19显示 SRAM映射 概念 ,以及 控制 SRAM配置 的 相 关
为TRIGSEL位设置相应的值,将ADCC_TRIG0触发路由至
ADCC寄存器。ADCC_BPTR寄存器必须存储指向存储器
两个定时器。
基址的指针,才能存储ADC样本。若存储器缓冲器中需要
ADCC_CBSIZ寄存器写入零来激活),会以持续增加的线性
TRIG SEL
TRGS24
TRGS25
SSR1
SSRn
值,使其指向下一帧的基址。在线性缓冲模式下(通过向
ADCC_CT L
TRGS62
Timer 0
Timer 1
图18. 从PWM SYNC至ADCC定时器的触发路由
此触发路由配置可以提供硬件的直连链路,将PWM时序与
化方式在存储器中存储额外的帧,中间隔开一个帧的增量
值。若向ADCC_CBSIZ写入非零值M,则会激活循环缓
冲,且在帧的基址指针返回ADCC_BPTR值并开始覆盖现
有帧数据之前向存储器写入M帧。
ADC采样相关联,而不会在路径上产生软件延迟。触发主
SRAM
机也可从其他源路由,如GPIO引脚中断、定时器和计数器
Event 0 DATA
Event n DATA
事件。如此配置便可提供精确同步,比如与ADSP-CM408F
=0
FRAME1
控制的其他转换器进行采样同步。
ADCC_CBSIZ
Event 2 DATA
Event 1 DATA
Event 0 DATA
Event n DATA
此外,完整的ADCC定时器帧能作为触发主机与其他外设
或核心从机相关联。
ADCC_FRINC
FRAME0
由于本例中采用了DMA传输模式,因此所有事件中断都应
ADCC_EVCTL01.EV TOFS
当在ADCC_EIMSK寄存器中屏蔽。同样,提供驱动程序
API,用来在寄存器中设置适当的中断服务例程,实现
Event 2 DATA
Event 1 DATA
Event 0 DATA
ADCC_BPTR
>0
BASE POINTER
TRGM68
存储多个帧,则ADCC_FRINC寄存器中应包含指针的偏移
ADCC
11835-018
TRGM19
TRGS1
TRGS2
TRGS3
BASE POINTER
TRU
11835-017
TRGM1
TRGM2
TRGM3
图19. ADC DMA传输的存储器配置
DMA模式下的帧中断。
在图17中的电机控制应用示例中,每个PWM周期都会采
利用触发路由提供增强型精确采样时序
本以线性方式存储毫无意义,因为存储器将很快过载。在
像上文所述那样,要从当前采样时序中移除片选脉宽滞
此类应用中,最好在启用循环缓冲时将M限制为1或更小
后,需要稍微不同的触发路由配置。在此情况中,ADCC
的值,或者将ADCC_FRINC值设为0并在每个PWM周期中
定时器是通过GP定时器触发器触发的,而该触发器本身是
覆盖帧。简化这项任务的驱动程序应用编程接口(API)可在
通过PWM sync触发的。此序列可参见图11。
“ADCC软件支持”部分找到。
集ADC样本,并即刻用于控制和监控应用中。因此,将样
Rev. A | Page 12 of 18
AN-1267
ADCC软件支持
与ADSP-CM40x EZKIT一同提供的ADI Enablement Software
正确完成ADCC事件配置后,必须开启ADCC实例,以及
软件包内含一系列API函数调用命令,可简化本应用笔记
与该实例相关的所有ADCC定时器。然后,必须在寄存器
中讨论的ADCC模块设置。这些调用命令监控不同寄存器
中设置每个定时器帧中断的驱动程序回调函数名(第72行至
73行)。随后,使能DMA模式(第74行),配置ADCC时钟和
的正确配置以及需要执行的任何状态确认。
芯片选择(第75行至第78行)。
示例代码
本应用笔记中的示例代码逐步说明配置并使用图17中电机
控制应用的方法。器件驱动程序会增加额外开销,但极大
定时器以ADCC_TRIG0输入配置为触发源。在SetupTRU()
函数中,ADCC_TRIG0触发分别作为触发从机与PWM同
步脉冲触发主机相关联(第92行至第97行),如图18所示。
地简化ADCC模块寄存器编程。
代码的第一部分定义一系列参数和配置常数,用于驱动程
这些函数调用中的数据枚举列于ADI Enablement Software软
件包的驱动程序文档中。
序API调用。
第81行将第62行定义的EventCFG指令传递至adi_adcc_
第1行至第10行定义每个定时器的帧和关联的数据缓冲器
大小。分配样本缓冲器长度时,将包含系数2作为安全措
ConfigEvent驱动程序函数,随后adi_adcc_SetEventMask驱
动程序函数按需使能或屏蔽事件。本例中,使能全部事
施,用于调试目的。由于ADC样本传输至存储器的操作完
件。为了获得最高的ADC吞吐速率,使能双位数据接口很
全通过硬件触发(包括DMA),因此在将新的缓冲器提交给
重要,代码见第83行,这表示能在8个ADC时钟周期内传
驱动程序以及复位ADC缓冲器指针之前,如果在第122行
输ADC的16位数据。(注意,如果没有使能双位接口,则
插入软件断点,则可能导致存储器被覆写。以一个额外缓
第76行中的NCK以及第77行和第78行中的tCSCS必须分别设为
冲作为裕量可防止出现此类调试相关问题。缓冲器中的帧
数目定义为1,这表示每次收到新帧,API便会覆写存储器
16和17)。然后进行数据缓冲器的存储器分配,数据缓冲器
将提交至ADCC,以便通过adi_adcc_SubmitBuffer调用进行
缓冲器,即每个定时器仅需针对1个帧进行存储器分配。
填充。adi_adcc_SubmitBuffer API仅在DMA模式下工作;因
第11行到第16行以ACLK周期数形式定义每个事件的采样
此使用该API之前必须先设置DMA模式。该驱动程序函数
时间,如表3所示。注意,SMP_TIME1、SMP_TIME2和
由主应用程序再次调用(第105行),以便应用程序完成数据
SMP_TIME3仅以一个ACLK周期分隔。该设置使这些事件
提取后将缓冲器归还给ADCC控制。最终,完成全部配置
在ADC0内以流水线方式进行处理。
后,需要使能定时器实例以及ADCC自身。
第17行至第44行定义每个ADC通道的控制字、6个采样事
第92行至第97行包含TRU的设置步骤。它包括开启TRU实例、
件的通道映射,以及数据缓冲器中每个事件的数组索引。
将触发从PWM sync主机路由至ADCC从机,以及使能TRU。
第45行至第59行声明ADC操作所需的变量和函数原型。
如前文所述,在应用层处理ADC数据由ADCC定时器回调
ADCC存储器缓冲器和ADCC定时器存储器缓冲器的存储
函数实现,该回调函数后跟一个中断,此中断在完成定时
器分配大小由API预定义,且不得进行更改。一个ADCC
器事件以及相关的DMA传输后发出。
设置函数、一个TRU设置函数以及两个ISR回调函数(每个
第98至第127行实现回调函数。缓冲数据在缓冲器的相应
ADCC定时器各一个回调函数)对寄存器进行设置。
位置处提取,并保存至适当的全局变量中。本例中,更新
第60行至91行包含主ADCC配置函数SetupADC()。第一步
后的相位电流数据立即用于电机控制算法中,通过第117
是设置事件配置表,即含有事件编号、ADC控制字、ADC
行中的算法调用函数MotorControl()从定时器1回调函数中
定时器、同步采样以及每个事件的存储器偏置的struct。
调用。
Rev. A | Page 13 of 18
AN-1267
注意,ADCC事件定时器中断服务是访问ADCC数据时发生
器TMR7再至ADCC定时器0触发的硬件触发路由路径。第
的唯一软件调用例程。同步与时序均在硬件层面中实现。
130行至第136行包含的示例代码可插入ADC设置函数,以
第 128行 至 第 136行 包 含 的 附 加 代 码 片 段 可 插 入 TRU和
正确配置和使能GP定时器TMR7,从而提供正确的延迟。
ADCC设置函数,以使能图11所示的增强型精确采样时序
无论何时,都必须在调用SetupADC函数前调用SetupTRU
功能。第128行至第129行中设置了从PWM SYNC至GP定时
函数。
Rev. A | Page 14 of 18
AN-1267
/*************************************************
ADCC Module Setup Code Example
*************************************************/
/********************Defines*********************/
1. #define ADCC_DEVICE_NUM
0
2. #define TRU_DEV_NUM
0
3. #define ADI_TRU_REQ_MEMORY
4. #define NUM_SAMPLES0
4
5. #define NUM_SAMPLES1
2
/*
Length of ADC buffers */
6. #define FRAME_INC0
2*NUM_SAMPLES0*sizeof(short)
7. #define FRAME_INC1
2*NUM_SAMPLES1*sizeof(short) /* Frame
increment in number of bytes for each buffer*/
8. #define FRAMES_IN_BUFFER 1
/*Number of
frames in buffer */
9. #define NO_OF_EVENTS
6
/* Total
number of events */
10. #define EVENT_MASK
0xFFFF
/*Event Times in ACLK Cycles*/
11. #define SMP_TIME0
12. #define SMP_TIME1
13. #define SMP_TIME2
14. #define SMP_TIME3
15. #define SMP_TIME4
16. #define SMP_TIME5
950
950
951
952
0
0
/* Control Words for All ADC Channels */
/*Upper Nibble = Chan No. Lower Nibble = 0xF for
Sim Sampling, 0xD Otherwise*/
17. #define ADC0_VIN00_CTL
0x0F
18. #define ADC0_VIN01_CTL
0x1F
19. #define ADC0_VIN02_CTL
0x2D
20. #define ADC0_VIN03_CTL
0x3D
21. #define ADC0_VIN04_CTL
0x4D
22. #define ADC0_VIN05_CTL
0x5D
23. #define ADC0_VIN06_CTL
0x6D
24. #define ADC0_VIN07_CTL
0x7D
25.
26.
27.
28.
29.
30.
31.
32.
#define
#define
#define
#define
#define
#define
#define
#define
ADC1_VIN00_CTL
ADC1_VIN01_CTL
ADC1_VIN02_CTL
ADC1_VIN03_CTL
ADC1_VIN04_CTL
ADC1_VIN05_CTL
ADC1_VIN06_CTL
ADC1_VIN07_CTL
0x0F
0x1F
0x2D
0x3D
0x4D
0x5D
0x6D
0x7D
/*Mapping the Signals to the Appropriate ADC
Channels*/
33. #define ES_CTL
ADC0_VIN00_CTL
34. #define EC_CTL
ADC1_VIN00_CTL
35. #define VDC_CTL
ADC0_VIN02_CTL
36. #define THS_CTL
ADC0_VIN03_CTL
37. #define IV_CTL
ADC0_VIN01_CTL
38. #define IW_CTL
ADC1_VIN01_CTL
/*Locations
39. #define
40. #define
41. #define
42. #define
43. #define
44. #define
/*******************Variables********************/
45. static ADI_ADCC_HANDLE hADCC;
/*
ADCC Handle */
46. static ADI_ADCC_HANDLE hADCCTimer0,
hADCCTimer1;
/*ADCC Timer Handles*/
47. static uint8_t ADCCMemory[ADI_ADCC_MEMORY];
/* Memory buffer for the ADCC device predefined */
48. static uint8_t
ADCCTmr0Memory[ADI_ADCC_TMR_MEMORY];
49. static uint8_t
ADCCTmr1Memory[ADI_ADCC_TMR_MEMORY];
/*
Memory buffer for the ADCC Timers predefined*/
50. static uint16_t SampleBuffer0[NUM_SAMPLES0];
51. static uint16_t SampleBuffer1[NUM_SAMPLES1];
/* Memory buffer for the ADC samples */
52. static uint16_t Iv_adc, Iw_adc;
53. static uint16_t Es_adc, Ec_adc, Vdc_adc,
Ths_adc;
/*Variables for ADC data*/
54. static uint8_t
TruDevMemory[ADI_TRU_REQ_MEMORY];
55. static ADI_TRU_HANDLE hTru;
/*TRU Device Memory and Handle*/
/*************Function Prototypes****************/
56. void SetupADC(void);
57. void SetupTRU(void);
58. static void AdccTmr0Callback(void *pCBParam,
uint32_t Event, void *pArg);
59. static void AdccTmr1Callback(void *pCBParam,
uint32_t Event, void *pArg);
/******Function to Configure ADCC***************/
60. void SetupADC(void) {
61. static ADI_ADCC_RESULT result;
/*Set Up Event Configuration Table*/
62. ADI_ADCC_EVENT_CFG EventCFG[NO_OF_EVENTS] = {
63. {0, ES_CTL, ADI_ADCC_ADCIF0, ADI_ADCC_TIMER0,
true, 0, SMP_TIME0},
64. {1, EC_CTL, ADI_ADCC_ADCIF1, ADI_ADCC_TIMER0,
true, 2, SMP_TIME1},
65. {2, VDC_CTL, ADI_ADCC_ADCIF0,
ADI_ADCC_TIMER0, false, 4, SMP_TIME2 },
66. {3, THS_CTL, ADI_ADCC_ADCIF0,
ADI_ADCC_TIMER0, false, 6, SMP_TIME3 },
67. {4, IV_CTL, ADI_ADCC_ADCIF0, ADI_ADCC_TIMER1,
true, 8, SMP_TIME4 },
68. {5, IW_CTL, ADI_ADCC_ADCIF1, ADI_ADCC_TIMER1,
true, 10, SMP_TIME5 }}; /*Event#, CTL_WORD,
ADC Interface, Timer ID, sim. samp, Mem offset
in frame, Event time */
of ADC Signals in Data Buffer Index*/
IV_ADC
0
IW_ADC
1
ES_ADC
0
EC_ADC
1
VDC_ADC
2
THS_ADC
3
Rev. A | Page 15 of 18
AN-1267
/*ADCC Setup API Functions*/
69. result = adi_adcc_OpenDevice(ADCC_DEVICE_NUM,
ADCCMemory, &hADCC);
70. result = adi_adcc_OpenTimer(hADCC,
ADI_ADCC_TIMER0, ADCCTmr0Memory,
&hADCCTimer0);
71. result = adi_adcc_OpenTimer(hADCC,
ADI_ADCC_TIMER1, ADCCTmr1Memory,
&hADCCTimer1); /* ADCC Device handle, Timer to
open, Timer memory, Pointer to the timer
handle */
72. result = adi_adcc_RegisterTmrCallback
(hADCCTimer0, AdccTmr0Callback, hADCCTimer0);
73. result = adi_adcc_RegisterTmrCallback
(hADCCTimer1, AdccTmr1Callback,
hADCCTimer1);/*Register callback functions*/
74. result = adi_adcc_EnableDMAMode(hADCC,true);
75. result = adi_adcc_ConfigADCCClock(hADCC,
ADI_ADCC_ADCIF0, false,1u, 8u );
76. result = adi_adcc_ConfigADCCClock(hADCC,
ADI_ADCC_ADCIF1, false,1u, 8u ); /*For each
ADC interface: ADCC handle, ADC Interface
number, falling edge, ACLK Clock divide, NCK*/
77. result = adi_adcc_ConfigChipSelect(hADCC,
ADI_ADCC_ADCIF0, false, 1u, 0u, 9);
78. result = adi_adcc_ConfigChipSelect(hADCC,
ADI_ADCC_ADCIF1, false, 1u, 0u, 9);/*For each
interface: ADCC handle, ADC interface, active
low, TCSCK, TCKCS, TCSCS*/
79. result = adi_adcc_ConfigTimer(hADCCTimer0,
ADI_ADCC_TRIG0, true, false);
80. result = adi_adcc_ConfigTimer(hADCCTimer1,
ADI_ADCC_TRIG0, true, false); /*For each
timer: Timer handle, Timer trigger source,
falling edge trigger, No trigger output */
81. result = adi_adcc_ConfigEvent(hADCC,
&EventCFG[0], NO_OF_EVENTS); /*ADCC handle,
Pointer to the event configuration table,
Number of events in the table */
82. result = adi_adcc_SetEventMask(hADCC,
EVENT_MASK);
/*
Handle to the device, Enable all events */
83. adi_adcc_EnableDualBitDataIF(hADCC, true);
/*Dual bit interface allows highest
throughput*/
84. memset((void *)SampleBuffer0, 0, NUM_SAMPLES0
* sizeof(short));
85. memset((void *) SampleBuffer1, 0, NUM_SAMPLES1
* sizeof(short));
86. result = adi_adcc_SubmitBuffer(hADCCTimer0,
SampleBuffer0, FRAME_INC0, FRAMES_IN_BUFFER);
87. result = adi_adcc_SubmitBuffer(hADCCTimer1,
SampleBuffer1, FRAME_INC1, FRAMES_IN_BUFFER);
/*For each timer: timer handle, Pointer to the
buffer, Frame increment, Number of frames
that fits into the given buffer */
88. result =
true);
89. result =
true);
90. result =
/*Enable
91. }
adi_adcc_EnableTimer(hADCCTimer0,
/*******Function to Configure TRU****************/
92. void SetupTRU(void){
93. ADI_TRU_RESULT result;
94. result = adi_tru_Open (TRU_DEV_NUM,
&TruDevMemory[0], ADI_TRU_REQ_MEMORY, &hTru);
/* Setup TRU for ADCC. Slave is ADCC0 trig 1
and master is PWM0 SYNC pulse*/
95. result = adi_tru_TriggerRoute (hTru,
TRGS_ADCC0_TRIG0, TRGM_PWM0_SYNC); /*TRU
device, slave, master*/
96. result = adi_tru_Enable (hTru, true); /*Enable
TRU*/
97. }
/***********ADCC Timer Callbacks*****************/
98. static void AdccTmr0Callback(void *pCBParam,
uint32_t Event, void *pArg){
99.
switch(Event){
100.
case ADI_ADCC_EVENT_FRAME_PROCESSED:
101.
Es_adc= SampleBuffer0[ES_ADC];
102.
Ec_adc = SampleBuffer0[EC_ADC];
103.
Vdc_adc = SampleBuffer0[VDC_ADC];
104.
Ths_adc = SampleBuffer0[THS_ADC];
/*Store all of the data sampled in appropriate
global variables*/
105.
_adcc_SubmitBuffer(hADCCTimer0,
SampleBuffer0, FRAME_INC0, FRAMES_IN_BUFFER);
/*Return the buffer to the ADCC for use in the
next events*/
106.
break;
107.
case ADI_ADCC_EVENT_BUFFER_PROCESSED:
108.
break;
109.
default:
110.
break;
111.
}
112.
static void AdccTmr1Callback(void
*pCBParam, uint32_t Event, void *pArg){
113.
switch(Event){
114.
case ADI_ADCC_EVENT_FRAME_PROCESSED:
115.
Iv_adc = SampleBuffer1[IV_ADC];
116.
Iw_adc = SampleBuffer1[IW_ADC];
117.
MotorControl();
/*Run the
current control algorithm*/
118.
119.
120.
break;
121.
case ADI_ADCC_EVENT_BUFFER_PROCESSED:
122.
adi_adcc_SubmitBuffer(hADCCTimer1,
SampleBuffer1, FRAME_INC1, FRAMES_IN_BUFFER);
123.
break;
124.
default:
125.
break;
126.
}
127.
return;
}
adi_adcc_EnableTimer(hADCCTimer1,
adi_adcc_EnableDevice(hADCC, true);
everything*/
Rev. A | Page 16 of 18
AN-1267
/*************************************************
Enhanced Precision Timing Code
*************************************************/
/*Setup TRU for ADCC enhanced timing precision.
Slave is ADCC0 trig 1 and master is GP timer 7
Added to SetpTRU() function in place of line 95 */
128.
result = adi_tru_TriggerRoute(hTru,
TRGS_ADCC0_TRIG0, TRGM_TIMER0_TMR7); // TRU
device, slave, master
129.
result = adi_tru_TriggerRoute(hTru,
TRGS_TIMER0_TMR7, TRGM_PWM0_SYNC); // TRU
device, slave, master
/*Setup GP timer 7 timer used to advance frame by
one CS. Add to SetupADC() function after line 91*/
130.
*pREG_TIMER0_STOP_CFG_SET =
BITM_TIMER_STOP_CFG_TMR07;
131.
*pREG_TIMER0_RUN_CLR =
BITM_TIMER_RUN_SET_TMR07; /*Disable Timer
First*/
132.
*pREG_TIMER0_TMR7_CFG =
ENUM_TIMER_TMR_CFG_PWMSING_MODE|ENUM_TIMER_TMR
_CFG_IRQMODE1 |ENUM_TIMER_TMR_CFG_TRIGSTART |
ENUM_TIMER_TMR_CFG_POS_EDGE|ENUM_TIMER_TMR_CFG
_PADOUT_EN | ENUM_TIMER_TMR_CFG_EMU_CNT;
133.
*pREG_TIMER0_TMR7_DLY = (uint32_t)(fsysclk
/ F_SW - 0.00000045 * fsysclk); /* Delay must
be Tsw minus one ADC chip-select. Chip select
is 18 ACLKs*/
134.
*pREG_TIMER0_TMR7_WID = 16; /*Be careful
here... DLY+WID must be smaller than one PWM
period. In other words, WID must be smaller
than one ADC chip select. If WID>CS, trigger
pulse stretches into next PWM period. */
135.
*pREG_TIMER0_TRG_MSK &=
~(BITM_TIMER_TRG_MSK_TMR07);
136.
*pREG_TIMER0_TRG_IE |=
BITM_TIMER_TRG_IE_TMR07; /*Enable TMR7*/
Rev. A | Page 17 of 18
AN-1267
示例实验结果
图21显示采用正确同步采样方法的平均效应,由图中可见
“示例代码”部分提供的电流采样代码部分已在闭环永磁同
电机相位电流具有平滑的正弦平均波形,即便电流水平低
步电机控制应用电路中进行了测试。应用电路采用通用交
于最大值的2%时亦是如此。图21和图22(即跟踪IQ参考电流
流线输入以及−6.8 A至+6.8 A的受控电机电流范围,并利用
的控制环路工作曲线)均通过ADSP-CM408F产生的数据流
了电流传感器;该电流传感器参数图4中的电流调整数
获得,该产品通过RS-232连接MATLAB®接口。
据。图20至图23还显示了应用电路的采样结果。
在图23中,PWM sync脉冲位置以及后续的采样触发显示在
图20显示了参考速度为1500 rpm且电机空载时测得的电机相
相位电流PWM周期的中央,该处电流等于瞬时平均值。
位电流。电机电流水平极低,并且高度不连续。
为便于说明,该图显示的是较高的负载。
0.20
100mA/DIV
IQ
IQREF
Q-AXIS CURRENT (A)
0.15
3
0.10
M2.00ms
T
40µs
A CH2
880mV
0
11835-019
CH2 470mV
CH3 100mA
0
20
40
60
80
100 120
CURRENT (A)
140
160
180
200
图22. Q轴参考电流和实际电流
图20. 测量电机相位电流
IPHASE (A)
0.2
0.1
0
SAMPLE
–0.1
–0.2
3
PWM SYNC
PULSE
3.30
2
3.25
3.15
0
20
40
60
80
100
120
140
160
180
200
SAMPLES
图21. ADC采样电机相位电流:上图为调整至真实值;
下图为数字字输出
©2013–2014 Analog Devices, Inc. All rights reserved. Trademarks and
registered trademarks are the property of their respective owners.
AN11835sc-0-9/14(A)
Rev. A | Page 18 of 18
CH2 2V
CH3 500mA
M10µs
T
–8ns
A CH2
图23. 与相位电流有关的采样
880mV
11835-022
3.20
11835-020
IPHASE (Digital)
3.35
11835-021
0.05