AN1473 多种计算脉冲与占空比的方法 作者: Justin Bauer Microchip Technology Inc. 简介 很多时候,我们需要量化周期信号的脉宽(如伺服电机 的脉宽)或者脉宽调制信号的占空比。有时会遇到需要 测量非周期性脉冲的情形,如测量常见于电容放电式点 火电路中的脉冲。本应用笔记介绍了基于8位PIC® 器件 的六种测量周期性和非周期性波形脉冲的不同策略,以 及六种计算周期性波形占空比的方法。 根据所选单片机与所用外设的不同,设计所需的方案 可能比预期的要复杂,这也是本文档介绍多种方案的 原因。有些方案需要使用2011年推出的可配置逻辑单 元(Configurable Logic Cell,CLC)和 数 控 振 荡 器 (Numerically Controlled Oscillator,NCO)。这些方 案能提供软件开销最低的硬件解决方案,而简单的电平 变化中断(Interrupt-On-Change,IOC)外设会需要较 多的软件开销用于计算。 本应用笔记介绍的所有方案均包含相关的软件程序。由 于 PIC MCU 的时钟速度、软件优化以及常规环境设置等 多方面原因,各种方案的最终结果可能会与文档给出的 结果有所不同。 其他方案都需要软件干预,以补偿边沿之间的定时器计 满返回或寄存器设置操作,不过这会影响精度以及测量 波形的最小 / 最大时间约束。这些方案的软件程序应该 采用汇编语言编写,以实现最佳精度。通常采用软件方 案便足以满足应用所需的精度。 由于占空比为脉冲与其周期的比值,因此有关占空比的 介绍大都会提到脉冲测量。有些方案可调整其程序,以 选择在下降沿变为上升沿或在上升沿变为下降沿时触 发,但 CLC/NCO 和 Timer1 门控方案的设置与其对应的 脉冲测量方案完全不同。 术语 本文档中使用了“精度”这一术语,它取决于时钟频率 的精度以及测量粒度。粒度越大,分辨率越低。要实现 更精确的测量,需选择高精度和高频率时钟以实现更小 的粒度和更高的分辨率。本文档所使用的另一个术语是 测量不确定性。定时器相对于脉冲边沿的停止时刻存在 不确定性:它既可能刚好在脉冲边沿出现时停止,也可 能在一个时钟周期之后停止。因此,不确定性为一个完 整的时钟周期。 如下图(图 1)所示,定时器的分辨率将极大地影响脉 冲测量结果。 执行摘要 理想的实现方案应该完全在硬件中执行,并且外部波形 与 PIC MCU 系 统 时 钟 同 步。值 得 庆 幸 的是,通过 Timer1 门控和 CLC 以及 NCO 可实现纯硬件解决方案。 由于大多数情况下,要测量的脉冲或占空比是由其他源 所产生的外部波形,因此测量的分辨率将始终为至少一 个时钟周期。 2013 Microchip Technology Inc. DS01473A_CN 第 1 页 AN1473 图1: 确定特定脉宽对应的定时器值时的量化误差。定时器递增速率为 1 ns 量化误差 Error Quantization 4 3 Timer Output 2 定时器输出 1 0 0 0.5 1 可行方案 1.5 2 2.5 脉宽 (ns) Pulse Width (ns) 图 2: 3 3.5 4 脉宽定义 最精确的测量可以通过最快的时钟源与预分频比最低的 定时器来实现。最低的定时器预分频比可实现最高的分 辨率。通常分辨率越高,最大计数值越大,从而可对定 时器计满返回进行必要的补偿。 如果要使用非阻塞代码,则可以将中断程序整合到方案 中。不过,这种整合可能导致精度下降。例如,IOC 引 脚可在检测到上升 / 下降沿时产生中断。因此,现在无 需不断轮询该引脚,即可在 ISR 内部完成脉冲测量。这 听起来似乎很理想,但是用户此时必须适应 3-5 个指令 周期的延时,该延时是由于提供异步中断而产生的。 T2与 T1之间的时间为脉宽。 图 3: 占空比为脉宽与周期之比 如果必须保证绝对精度,则应该使用外部晶振,因为内 部振荡器模块可能偏离其标称频率高达 5%。 除非另外说明,否则本文档中所有包含相关代码的测量 方法,均使用 16 MHz 的内部系统时钟,并且所有定时 器均基于系统时钟(FOSC)的 1:1 预分频比工作。波长 的上下限,以及测量结果的精度通过表 1 与表 2 进行计 算。如果在基于软件的方案中考虑计满返回,则测量精 度将随软件程序的开销成比例降低。 这些方案假设脉冲为高电平有效,并且周期为两个相邻 上升沿之间的时间。详情请参见图 2 与图3。 DS01473A_CN 第 2 页 © 2013 Microchip Technology Inc. AN1473 表 1: 与代码相关的参数 脉冲测量——参数 模块 PIC® MCU 中断 编程语言 大小(程序/ 数据) * 上限 分辨率 Timer1门控 Timer1 PIC16LF1509 有 C 539 / 12 4.1 ms 62.5 ns CLC*2 PIC16LF1509 有 C 400 / 5 65.54 ms 62.5 ns PIC16LF1847 无 ASM 126 / 6 16.38 ms 3 μs PIC16LF1509 有 C 50 / 2 1 ms 4 μs (16x 预分频器) IOC PIC16LF1509 有 C 50 / 3 1.073s 6 μs 轮询输入 PIC16LF1509 无 C 50 / 3 1.073s 8 μs Timer1门控 Timer1 PIC16LF1509 有 占空比测量——参数 C 500 / 2 4.1 ms 125 ns NCO1 PIC16LF1509 有 C 400 / 5 65.54 ms 62.5 ns PIC16LF1847 无 ASM 126 / 6 16.38 ms 3 ns PIC16LF1509 有 C 50 / 2 4.1 ms 8 ns IOC PIC16LF1509 有 C 50 / 3 1.073s 12 μs 轮询输入 PIC16LF1509 无 C 50 / 3 1.073s 20 μs NCO1 CCP1 Timer1/3 IOC/INT Timer0 CLC CCP1 Timer1/3 IOC/INT TimerX * 这些计算的上限可以扩大至任意设定值。表中所示的限值为定时器计满一次的时间。 2013 Microchip Technology Inc. DS01473A_CN 第 3 页 AN1473 表2: 用于表 1 所示结果的公式 脉冲测量 —— 公式 模块 Timer1 门控 Timer1 CLC*2 上限 ⎛ 1---⎞ * 2 n ⎝ f⎠ 分辨率 1--f NCO1 ⎛ 1---⎞ * 2 n ⎝ f⎠ TimerX n = NCO ACCUM位宽 CCP1 ⎛ 1---⎞ * 2 n ⎝ f⎠ 取决于软件 ⎛ 1---⎞ * 2 n * 4 ⎝ f⎠ 取决于软件(16x 预分频器) IOC ⎛ 4---⎞ * 2 n ⎝ f⎠ 取决于软件 无 ⎛ 4---⎞ * 2 n ⎝ f⎠ 取决于软件 Timer1/3 IOC/INT Timer0 1--f 占空比测量 —— 公式 Timer1 门控 Timer1 CLC*2 NCO1 TimerX CCP1 Timer1/3 ⎛ 1---⎞ * 2 n ⎝ f⎠ ⎛ 1---⎞ * 2 n ⎝ f⎠ n = NCO ACCUM位宽 ⎛ 4---⎞ * 2 n ⎝ f⎠ 1--f 1--f 取决于软件 IOC/INT Timer0 ⎛ 1---⎞ * 2 n * 4 ⎝ f⎠ 取决于软件(16x 预分频器) IOC ⎛ 4---⎞ * 2 n ⎝ f⎠ 取决于软件 无 ⎛ 4---⎞ * 2 n ⎝ f⎠ 取决于软件 n = TimerX位宽 f = 时钟频率 DS01473A_CN 第 4 页 © 2013 Microchip Technology Inc. AN1473 图 4: 脉冲 本节介绍如何测量周期性和非周期性波形的单个脉冲。 对于需要周期性波形源的方案,通常需要连续从脉冲测 量值中减去周期值,直到脉冲值比周期小。由于软件速 度限制导致无法在上升沿触发以及随后无法设置为捕捉 下降沿事件时,可采用此策略。 TIMER1工作原理 计数器 时钟源 Timer1门控 TIMER1 门控代码计算 表3: 模块 上限 分辨率 门控 Timer1 门控 Timer1 4.1 ms 62.5 ns Timer1 门控是测量周期性和非周期性信号脉宽的经典 方法。此方法极其精确且配置简单,建议优先选用。整 个捕捉过程都在硬件中执行。大多数 PIC 器件上都提供 这种方法。 概述 Timer1门控根据外部触发信号来控制Timer1何时递增。 该触发信号既可以是 Timer1 门控输入的上升沿,也可 以是其下降沿。 图5: Timer1门控将时钟源连接到随后将开始计数的定时器。此 策略仅与门控的闭合和断开有关。 假设要测量的脉冲为高电平有效,并且刚刚产生了一个 上升沿,则门控会将时钟源与其计数器相连,随后只要 脉冲保持高电平,Timer1 便递增。当波形变为低电平 时,门控断开,并且中断标志置 1。随即可通过读出 Timer1计数寄存器中的16位值来确定脉宽。 TIMER1 门控在“T1G_IN”上的信号变为高电平时连通 在 T1G 的上升沿 使能计数 T1G_IN T1CKI T1GVAL Timer1 N TMR1GIF 由软件清零 设置 1. 2. 3. 4. 5. 6. N+2 在上升 /下降沿将Timer1门控设置为单脉冲模式 为脉冲选择合适的Timer1 时钟源与预分频比 将 TMR1H和 TMR1L清零 使能模块并将T1GG0位置 1 (脉冲产生) TMR1GIF 位置1 © 2013 Microchip Technology Inc. 在 T1GVAL 的下降沿 由硬件置 1 7. 8. 9. 由软件清零 从TMR1H:L 读出脉宽 将TMR1GIF 清零 重复执行步骤2 至步骤 8 为实现最佳分辨率,应选择 FOSC 作为 Timer1 的时钟源 并采用1:1 预分频比值。 DS01473A_CN 第 5 页 AN1473 图 6: 不确定性取决于时钟精度 脉冲 CLK 使用 16 MHz 时钟源时的不确定性可达 +/-62.5 ns。 限制 存在正 / 负一个时钟周期的不确定性。当脉冲刚好在时 钟的上升沿之前变为低电平或者在时钟的上升沿之后变 为高电平时会出现最坏情况。Timer1 的最大计数为 65535。在定时器计数到第 65536 个周期时,会溢出为 0。通过对 Timer1 的溢出次数进行计数,可测量超过 65535 个 Timer1 周期的脉冲。每次发生溢出事件时, TMR1IF 位都会置 1。对溢出事件次数进行计数,然后 将所计次数与 65536的乘积与Timer1 计数值相加。 CLC 和 NCO 表 4: CLC/NCO 代码计算 模块 CLCX2 NCO1 上限 分辨率 65.54 ms 62.5 ns 该策略使用了NCO 与 CLC。 概述 可以将两个CLC设置成一个脉冲检测器。发生软件复位 时,CLC2 将输出一个低电平,以使能 CLC1 与门,从 而脉冲为高电平时可允许时钟信号通过。当脉冲变为高 电平时,HFINTOSC 将为累加器提供时钟,直到该脉 冲变为低电平为止。当脉冲变为低电平时,CLC1 会输 出一个低电平并停止为 NCO 提供时钟。此时,可从 20 位宽的NCO 累加器寄存器读取脉宽。 图 7: 用于测量单个脉冲的 NCO 与 CLC 连接 NCO1 in c 脉冲 D SE T Q CLC 2 C LR C LC1 Q 累加器 门 控 3极 性 时钟 CLC与 NCO 内部互连的顶层视图。除脉冲外,所有连接都是处理器的内部连接。 有关此设置需要特别注意的是,如果 CLC2 在脉冲的上 升沿之前未复位,将导致测量不准确,如图 8所示。 DS01473A_CN 第 6页 2013 Microchip Technology Inc. AN1473 图8: 脉冲为高电平时应避免软件引起意外复位 脉冲 复位 CLC1 必须在脉冲产生之前复位,否则会导致测量不准。 图9: 图7 的时序图 当脉冲变为高电平时,NCO 便开始在每个 HFIINTOSC 时钟边沿都累加值1,直到脉冲变为低电平。 设置 1. 2. 3. 4. 5. 6. 7. 8. 9. 将 CLC1 设置为 4输入与门 a) 输入1连接至VDD(取反门控1输出)。输入2 为要测量的脉冲 b) 输入3 为HFINTOSC c) 输入4 为CLC2 的输出反相 将 CLC2 设置为 D型触发器。 a) 将“D”连接至 VDD(取反门控2 输出) b) 将时钟与脉冲引脚的反相连接 c) “复位”连接至门控 3 设置 NCO a) 将NCO配置为固定占空比(Fixed Duty Cycle,FDC)模式 b) 为要测量的脉冲选择合适的递增值 翻转 CLC2 中的“复位”门控以启动 (脉冲为高电平) (计数) (脉冲为低电平) 从累加器读取脉宽 重复执行步骤3 至步骤8 © 2013 Microchip Technology Inc. NCO 累加器值与时钟源有关,必须进行适当的换算才 能得到脉宽。常用的办法是创建一个查找表,NCO 累加 器值作为偏差包括在表中。 问题1: 问:要测量的伺服脉冲约为1 ms Æ 2 ms宽。将 NCO 累加器用作时钟输入为 16 MHz 的计数器 时,对应的查找表是怎样的? 答:将 NCO 配置为 FDC 模式,并以 1 为单位递 增,同时使用 CLC1 作为其时钟源。当脉冲为高 电平时,NCO每62.5 ns加1。2 ms之后,NCO 累加器的值将递增至 32000。此时从累加器值中 减去 1 ms(16000),然后左移 7 次(本质上是 除以 128),以创建一个切实可行的、包含 125 个值的查找表。每个值现在对应8 μs。 表 5: 问题1 的查找表 偏移量 换算结果 0 <= 1 ms 1 1.8 μs 2 1.16 μs … …. 127 2 ms DS01473A_CN 第 7 页 AN1473 此方法的缺点是,每次要测量的脉宽发生变化时,都需 要重新配置 NCO和查找表。 注: 图10: 累加器最大值为 2^20。使用16 MHz 的时钟 时,这与65.536 ms 相对应。 更好的方案只会捕捉单个脉冲,该脉冲将强制 NCO 保 持累加器值,直到发出复位信号。这对于不能在下一个 脉冲到达之前复位的电路非常有用,见上文的图8。 用于测量无法在脉冲期间复位的单个脉冲的 CLC 与NCO连接 NCO1 inc 时钟 SET D 脉冲 CLC1 Q 累加器 CLC2 CLR Q 门控3极性 D SET Q CLC3 CLR 门控3极性 Q 上电复位(Power-on Reset,POR)时,CLC2 和 CLC3 的输出均为低电平。CLC3 Q 为低电平时禁止 CLC1。 脉冲出现时,会发生以下事件: 1. 2. 3. 上升沿将CLC2 Q置1,以使能CLC1门控,从而 为 NCO 提供时钟 下降沿将CLC3 Q置1,以禁止CLC1门控,从而 停止为NCO提供时钟。CLC3 Q高电平为计数就 绪信号。 系统在复位之前一直保持该状态。 设置 1. 2. 门控3的极性通过每个CLC模块的CLC配置寄存器中的 一个位进行控制。使用它按如下顺序复位电路: 1. CLC2“复位”为高电平 —— 脉冲在“复位”为 高电平时不能将 CLC2 置 1,Q 为低电平时禁止 CLC1 2. 3. CLC3“复位”为高电平 CLC3“复位”为低电平 —— 从高电平到低电平 的脉冲转换不能将 CLC3 置 1,因为 CLC2 使 CLC3 的D 输入保持为低电平 CLC2“复位”为低电平 —— 复位完成且准备好 捕捉下一个脉冲 4. 3. 4. 将CLC1 设置为 4 输入与门 a) 输入1 连接至 VDD(取反门控 1 输出) b) 输入2 为时钟源(HFINTOSC) c) 输入3 为 CLC2 输出 d) 输入4 为 CLC3 输出的反相 将CLC2 设置为 D型触发器 a) “数据”连接至 VDD(取反门控2输出) b) 时钟源为脉冲 c) 取反门控 3 以保持复位。开始测量脉冲时, 先释放CLC3 复位,然后释放CLC2复位。 将CLC3 设置为 D型触发器 a) “数据”为 CLC2 输出 b) 时钟源为脉冲输入的反相 c) 取反门控 3 以保持复位。开始测量脉冲时, 先释放 CLC3 复位,然后释放 CLC2 复位。 设置NCO a) 将 NCO配置为FDC 模式 b) 为要测量的脉冲选择合适的递增值 除法和减法的处理对于 8 位单片机很耗时。因此,下面 给出了使用CLC和 NCO模块的第三种方案。 DS01473A_CN 第 8 页 © 2013 Microchip Technology Inc. AN1473 图 11: 用于为 TIMER0 提供归一化时钟的 CLC 和 NCO 连接 NCO1 inc 时钟 溢出 累加器 RA2 SET D 脉冲 CLC1 Q TM R0 CLC2 CLR Q 门 控 3极 性 D SET Q CLC3 CLR 门 控 3极 性 Q 本方案使用与 CLC1 输出在同一引脚上的复用 Timer0。 NCO 仍如之前那样配置为 FDC 模式,不过其输出现在 用作 Timer0 的时钟。由于 NCO 作为线性频率发生器可 实现最高20位的分辨率,因此查找表的值可直接从NCO 周期获得。 表 6: 问题 2: 问:要测量的伺服脉冲约为0 ms 1 ms宽。使用 Timer0作为计数器时,为使TMR0不出现无法检 测的上溢 / 下溢情况,最大的 NCO 频率为多少? 答:计算将换算Timer0的NCO频率,以使值255 对应 1 ms。将 NCO 配置为脉冲频率模式。将要 测量的脉宽与Timer0宽度相除(1 ms/255位)。 取其倒数可得 NC0 频率为 255 kHz。 F 上溢 = (NCO 时钟频率 * 递增值 ) / 2^n 1. 2. 3. 4. 2013 Microchip Technology Inc. 偏移量 换算结果 0 0 ms 1 3.92 μs 2 7.84 μs … …. 255 1 ms 设置 255 kHz = 16 MHz * 递增值 / 2 ^ 20 求解以上等式可得到递增值约为 16711。这会将 NCO 配置为以 255 kHz 的速率输出单个脉冲为 TMR0 提供时钟。如果定时器因时钟频率出错而 溢出,则需检查 Timer0 中断标志并在软件中对溢 出加以考虑。 问题 2 的查找表 将CLC1输出引脚配置为数字输出 将CLC1设置为 4输入与门 a) 输入 2为 VDD(取反门控1输出) b) 输入1 为NCO输出 c) 输入3为 CLC2 的输出 d) 输入 4为CLC3 输出的反相 将 CLC2设置为 D型触发器 a) 将D连接至VDD(取反门控3输出) b) 时钟源为脉冲 c) 取反门控 3 以保持复位。开始测量脉冲时, 先释放 CLC3复位,然后释放 CLC2复位。 将 CLC3设置为 D型触发器 a) 将D连接到 CLC2 输出 b) 时钟源为脉冲的反相 c) 取反门控 3 以保持复位。开始测量脉冲时, 在释放CLC2 复位之前释放CLC3 复位。 DS01473A_CN 第9 页 AN1473 限制 概述 由于测量在硬件中实现,因此不存在软件开销,但如果 要执行其他脉冲测量,则复位 CLC2 和 CLC3 会存在软 件开销。不确定性为负0 和正一个时钟周期。 可将 CCP 设置为同时捕捉波形的上升沿和下降沿。在 CCP 接收到事件条件时捕捉定时器计数值。事件是指 如下情形之一: CCP CCP代码计算 表7: 模块 CCP1 Timer3 上限 分辨率 16.38 ms 3 μs 1. 2. 3. 4. 每个下降沿 每个上升沿 每4 个上升沿 每16个上升沿 每4个上升沿事件或每16个上升沿事件通常用于计算信 号的周期,如图12所示。 捕捉和比较模块为脉宽测量提供一种精确的硬件和软件 方法。所提供的方案要求波形是周期性的,因为将执行 周期测量。 图12: 计算 16个重复波形的周期 在PIC10/12/16器件上使用Timer1,而在PIC18器件上可使 用Timer3。进行捕捉时,定时器值将锁存到CCPRxL:H寄 存器中。如图 1 所示,脉宽是指上升沿与下降沿之间的 时间。由于脉冲测量同时需要捕捉上升沿与下降沿,因 此 CCP 模块需要软件干预来捕捉这两类事件。 注: 在 捕 捉 模 式 下,不 应 该 使 用 系 统 时 钟 (FOSC)为Timer1提供时钟。为在捕捉模 式下识别 CCPx 引脚上的触发事件,Timer1 必须由指令时钟(FOSC/4)来提供时钟。 理想情况下,要测量的脉冲比 CCP 模块在捕捉上升沿 和下降沿之间切换所需的建立时间宽很多倍。但很多时 候,脉冲比切换所需的指令时钟短很多。由于此限制, 比较明智的方案是也进行周期测量。如果脉冲测量值比 周期测量值大,则需要从脉冲测量值中减去周期测量 值,直到结果比周期小为止。 脉冲测量也需要进行周期测量,如图13所示。 DS01473A_CN 第 10 页 © 2013 Microchip Technology Inc. AN1473 图13: 从周期中提取脉冲以及脉冲捕捉 周期约为5个Timer1增量宽,而脉冲为2个增量宽。由于CCP在第一个下降沿发生之前(下降沿1)无法设置为捕捉下降沿,因此将 捕捉第二个下降沿(下降沿 2)。使用脉冲捕捉值(7)减去之前测得的周期(5)即可得到脉宽:7-5 = 2。 内部同步电路会导致信 号延时。以上测量不是同时进行的。 如果波形的 16 个周期比 65536 个 Timer1 时钟周期短, 则通过将 CCP 设置为每 16 个上升沿捕捉一次可测量周 期。那样的话,需要选择4个或1个事件作为捕捉模式。 执行两次捕捉,用第二次的捕捉值减去第一次的捕捉值 例1: 计算差值,并忽略借位。将结果除以16(右移4位,不包 括符号位)以确定周期。当计算差值时,第二次的捕捉 值比第一次的捕捉值小并没有关系。 用于计算图 13 中单个脉冲宽度的代码段 // 可能需要跨越多个周期才测得 // 脉宽长度,因此需要减去周期, // 直到脉宽比周期短。 while(MeasuredPulse > Period) MeasuredPulse -= Period; 例 2 和例 3 中的代码显示了在检测到上升沿之后不久, 如何因CCP模块存在软件建立时间而错过下降沿检测的。 由于软件干预,将无法检测到比跳出 while(!CCP2IF) 循环并设置为捕捉下降沿所需时间短的脉冲。以下 C 语 言代码中以粗体显示的代码行,突出显示了检测到下降 沿之前必须执行的程序。 © 2013 Microchip Technology Inc. DS01473A_CN 第 11 页 AN1473 例 2: 用于捕捉单个脉冲的 C语言代码 //*** 首先捕捉上升沿 CCP2IF = 0; while(!CCP2IF && !TMR1IF); CCP2CON = 0x00; itemp = CCPR2L; //等待边沿或定时器溢出 // 停止捕捉 // 此时保存捕捉值 if(TMR1IF) { //如果 Timer1溢出,则信号周期过长, //MeasuredPulse 将强制为 Period 或 0, //具体取决于引脚电压 if(PWM_INPUT_PIN) { MeasuredPulse = Period; } else { MeasuredPulse = 0; } } else { //*** 接下来捕捉下降沿 …… } 由于这是顶层语言,需要分析 PIC MCU 所使用的实际 指令数才能得到精确的预期延时。 例 3: 更改边沿以便 CCP 执行捕捉的软件程序的反汇编 //*** 首先捕捉上升沿 98: 070C 1012 99: 070D 1812 070E 2F10 070F 2F11 0710 2F15 0711 1C11 0712 2F14 0713 2F15 0714 2F0D 100: 0715 0025 0716 019A 101: 0717 0818 0718 0020 0719 00A8 071A 01A9 102: …… CCP2IF = 0; BCF 0x12, 0 while(!CCP2IF && !TMR1IF); // 等待 BTFSC 0x12, 0 GOTO 0x710 GOTO 0x711 GOTO 0x715 BTFSS 0x11, 0 GOTO 0x714 GOTO 0x715 GOTO 0x70d CCP2CON = 0x00; // 停止捕捉 MOVLB 0x5 CLRF 0x1a itemp = CCPR2L; // 保存捕捉值 MOVF 0x18, W MOVLB 0 MOVWF 0x28 CLRF 0x29 if(TMR1IF) 以上反汇编代码采用免费版 XC8 v1.01 进行编译。您的 程 序 可 能 因 所 用 的 优 化 而 有 所 不 同。请 记 住,每 条 GOTO 或修改 PC 的任意指令都占用两个指令周期。 DS01473A_CN 第 12页 如果周期远小于 CCP 建立时间,则应将 CCP 模块配置 为每 16 个上升沿捕捉一次。 2013 Microchip Technology Inc. AN1473 设置 搭配定时器的IOC(电平变化中断) 周期的测量步骤: 表 8: 1. 2. 3. 4. 5. 6. 7. 8. 9. 将CCPXCON<3:0>配置为每16个上升沿捕捉一次 将TimerX预分频器配置为最低设置,并且TimerX 在第 16 个上升沿不发生溢出 使能 CCP 模块和定时器 (第 16 个上升沿) 禁止 CCP 模块,并将 CCPRX 保存在临时变量 (temp)中 使能 CCP 模块 (16 个边沿之后) 禁止 CCP 模块和定时器 此时可得周期: Period_16 = CCPR2 – temp Period = Period_16 >> 4 脉冲的测量步骤: 1. 2. 将 CCPXCON<3:0> 配置为每个上升沿捕捉一次 将TimerX预分频器配置为最低设置,并且TimerX 在脉冲周期结束之前不发生溢出 3. 使能 CCP 模块和定时器 4. (上升沿) 5. 禁止 CCP 模块,并将 CCPRX 保存在临时变量 (temp)中 6. 将 CCPXCON<3:0> 配置为每个下降沿捕捉一次 7. 使能 CCP 模块 8. (下降沿) 9. 禁止 CCP 模块和定时器 10. 此时可得脉宽: MeasuredPulse = CCPRX - itemp; while(MeasuredPulse > Period) MeasuredPulse -= Period; 限制 搭配定时器的 IOC 的代码计算 模块 IOC TimerX 上限 分辨率 1 ms 4 μs (16x 预分频器) 如果无法使用硬件模块来测量脉冲,则可以将一个电平 变化中断引脚配置为能够同时在上升沿和下降沿产生中 断。根据电气规范,对于 PIC16F1847,最小脉宽必须 至少为 25 ns。此方法的性能还会受到其他因素的限 制,如中断延时。 概述 此方法与 CCP 模块的方法类似,只是无法在检测到事 件(上升 / 下降沿)时立即停止定时器。这会增加计算 中的不确定性,因为软件此时必须立即停止定时器。一 些 PIC 器件可指定上升沿和下降沿触发器,而另一些器 件不会对两者进行区分。如果器件支持 IOC,则可以使 用INT引脚以及任意PORTB引脚。 首先,测量周期波形的周期。然后测量脉冲。 设置 周期的测量步骤: 1. 2. 3. 4. 5. 6. 7. 将其中一个IOC引脚配置为在上升沿中断(IOCBP) 将该引脚设置为数字输入 将任意定时器设置为对 T(图 3)进行计数且不 会产生溢出 使能定时器 当 IOC 标志置 1 时,先将其清零,然后将定时器 值保存在临时变量(temp)中 当中断标志再次置 1 时,停止定时器并将定时器 值保存在临时变量(temp2)中 此时可测得周期: Period = temp2 - temp 此测量的分辨率为 PIC MCU 指令时钟的函数。待测量 波形的周期必须至少为指令时钟周期的两倍。这是因为 CCP 模块检测与时钟同步,而且必须记录每个上升沿 和下降沿。 2013 Microchip Technology Inc. DS01473A_CN 第 13 页 AN1473 脉冲的测量步骤: 1. 2. 3. 4. 5. 6. 7. 8. MeasuredPulse = temp2 – temp; while(MeasuredPulse > Period) MeasuredPulse -= Period; 将其中一个IOC引脚配置为在上升沿中断(IOCBP) 将该引脚设置为数字输入 将任意定时器设置为对 W(图 3)进行计数且不 会产生溢出 使能定时器 当 IOC 标志置 1 时,先将其清零,然后将定时器 值保存在临时变量(temp)中 将该引脚配置为在下降沿中断(IOCBN) 当中断标志再次置1时,先将其清零,然后停止定 时器并将定时器值保存在临时变量(temp2)中 此时可测得脉宽: 图14: 限制 该方法的限制是周期时间必须大于捕捉两个上升沿所需 的时间。如果相邻两个上升沿之间的软件建立时间大于 周期时间,将导致周期测量错误。 如果IOC标志置1导致跳转到ISR,则设计人员必须认识 到中断指向引发的延时。由于该中断与时钟异步,因此 预期延时为3-5个指令周期时间,如下图(图14)所示。 中断延时 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 OSC1 CLKOUT 3 4 INT 引脚 pin 1 1 INTF 标志 flag (INTCON<1>) (INTCON<1>) Interrupt Latency 2 中断延时 5 GIE 位 bit (INTCON<7>) (INTCON<7>) 指令流 INSTRUCTION FLOW PC PC Instruction 取指令 fetched Inst (PC) Instruction 执行指令 executed Inst (PC-1) PC+1 Inst (PC+1) Inst (PC) PC+1 — 空周期Cycle Dummy 0004h 0005h Inst (0004h) Inst (0005h) Dummy Cycle 空周期 Inst (0004h) 注 1:1: INTF 此处采样INTF 标志(每个Q1)。 Note flag is sampled here (every Q1). CY = instruction cycle time. = 3-4 TCY where 2:2: Interrupt 中断延时latency = 3-4 个T CY,其中T CY =T指令周期时间。无论指令(PC)是单周期指令还是双周期指令,延时都相同。 Latency is the same whether Instruction (PC) is a single cycle or a 2-cycle instruction. 3: 仅在RC 振荡器模式下,CLKOUT 才可用。 3: CLKOUT is available only in RC oscillator mode. 4:4: For 要获得INT脉冲的最小宽度,请参见交流规范。 minimum width of INT pulse, refer to AC specs. is enabled to be set anytime during the Q4-Q1 cycles. 5:5: INTF 使能INTF,以在Q4-Q1期间随时将INTF置1。 未搭配定时器的 IOC(电平变化中断) 未搭配定时器的 IOC 的代码计算 表9: 模块 IOC 上限 分辨率 1.073s 6 μs 该方法与搭配定时器的电平变化中断类似,只不过它使 用系统时钟计数,而不是定时器。 DS01473A_CN 第 14 页 概述 这种确定脉宽的方法比较“经济”。用户只需等待至检 测到上升沿,然后使寄存器递增,直到检测到第二个上 升沿中断为止。这样可测得周期。将保存上升沿以及随 后的下降沿测量结果,然后从周期中减去相应测量值即 可得到脉宽。 © 2013 Microchip Technology Inc. AN1473 设置 脉冲的测量步骤: 周期的测量步骤: 1. 1. 2. 3. 4. 5. 6. 7. 8. 将 其 中 一 个 IOC 引 脚 配 置 为 在 上 升 沿 中 断 (IOCBP) 将该引脚设置为数字输入 将任意变量设置为对 T(图 3)进行计数且不会 产生溢出 使临时变量(count)开始递增 当 IOC 标志置 1 时,先将其清零,然后将计数变 量保存在另一个临时变量(temp)中 继续使计数变量递增 当中断标志再次置 1 时,将其清零并将计数变量 保存在另一个临时变量(temp2)中 此时可测得周期: Period = temp2 - temp 2. 3. 4. 5. 6. 7. 8. 将 其 中 一 个 IOC 引 脚 配 置 为 在 上 升 沿 中 断 (IOCBP) 将该引脚设置为数字输入 将任意变量设置为对 W(图 3)进行计数且不会 产生溢出 使临时变量(count)开始递增 当 IOC 标志置 1 时,先将其清零,然后将定时器 值保存在临时变量(temp)中 将该引脚配置为在下降沿中断(IOCBN) 当中断标志再次置 1 时,将其清零并将计数变量 保存在另一个临时变量(temp2)中 此时可测得脉宽: MeasuredPulse = temp2 – temp; while(MeasuredPulse > Period) MeasuredPulse -= P i d 限制 由于此实现方案采用 C 语言编写,相比汇编程序需要更 多的指令。例 4 中的代码段仅用来检查引脚是否为高电 平,如果是高电平,则使变量递增。注意仅仅几条简单 的语句所需的指令数。 例 4: 308: 0014 001F 0020 0021 0022 0023 0024 309: 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 两行 C 代码的反编译 281F 0027 1E16 2823 2824 2815 2825 3001 0020 07A8 3000 3DA9 3000 3DAA 3000 3DAB 281F while(!IOCBFbits.IOCBF4) // 等待下降沿 GOTO 0x1f MOVLB 0x7 BTFSS 0x16, 0x4 GOTO 0x23 GOTO 0x24 GOTO 0x15 GOTO 0x25 count++; //使变量递增 MOVLW 0x1 MOVLB 0 ADDWF 0x28, F MOVLW 0 ADDWFC 0x29, F MOVLW 0 ADDWFC 0x2a, F MOVLW 0 ADDWFC 0x2b, F GOTO 0x1f 由此可见,完成仅仅两行 C 语言代码所需的指令数也 比较多。每个指令周期递增“count”所需的延时约为 20 个指令时钟,具体而言,如果 FOSC = 16 MHz,则 为 5 μs。如果已产生脉冲,而且“count”寄存器的值 为 12,则脉宽为: 2013 Microchip Technology Inc. 脉宽 = count* 延时 * 指令定时器 脉宽 = 12*20* 1/(16 MHz/4) = 60 μs DS01473A_CN 第15 页 AN1473 轮询输入 占空比测量 任何PIC器件都可使用该方法,而且从所需模块(PORT) 的角度看,这是最基本的方法。 本节介绍如何测量波形的占空比。如前所述,在“脉 冲测量”一节列出的大多数模块已经测量了周期和脉 冲。因此,只需求这两个值的比值便可计算出占空比。 概述 表10: 轮询输入计算 模块 无 上限 分辨率 1.073s 8 μs 该方法测量单个脉冲宽度的代码与 IOC 策略类似,只不 过它没有电平变化中断功能。软件必须在轮询单个信号 引脚期间不断执行循环。 设置 周期的测量步骤: 1. 2. 3. 4. 5. 将其中一个引脚配置为数字输入 将任意变量设置为对 T(图 3)进行计数且不会 产生溢出 当引脚状态从低电平转换为高电平时,使临时变 量(count)递增 当引脚再一次从低电平转换为高电平时,使计数 变量停止递增 此时可测得周期: 占空比是脉冲与周期这两个数之比,因此占空比测量 本身很精确。脉冲测量的绝对误差在执行除法后会被 抵消。 Timer1门控 表 11: 模块 Timer1门控 Timer1 TIMER1门控代码计算 上限 分辨率 4.1 ms 1.2 μs 具有Timer1门控功能的单片机也可以测量波形的占空比。 概述 一个重要的前提条件是,要测量的波形的周期必须至少 出现两次。这是因为结果与后处理都要求进行两次测 量。因此,在两次测量之间需要软件干预,以设置下一 个正确配置。 可组合使用 Timer1 门控的单脉冲和翻转来测量波形的 周期,如图15所示: Period = count 脉冲的测量步骤: 1. 2. 3. 4. 5. 将其中一个引脚配置为数字输入 将任意变量设置为对 W(图 3)进行计数且不会 产生溢出 当引脚状态从低电平转换为高电平时,使临时变 量(count)递增 当引脚从高电平转换为低电平时,使计数变量停 止递增 此时可测得脉宽: MeasuredPulse = count 限制 最终脉宽必须将寄存器递增所需的指令数考虑在内。最 精确的指令数确定方法是参考程序反汇编或者采用汇编 语言编写程序。如果脉冲过短,则可能无法捕捉到第一 个下降沿。 DS01473A_CN 第 16 页 © 2013 Microchip Technology Inc. AN1473 图 15: TIMER1门控单脉冲和翻转组合模式 TMR1GE T1GPOL T1GSPM T1GTM T1GGO/ 在 T1GVAL 的下降沿 由硬件清零 由软件置 1 DONE 在 T1G 的上升沿 使能计数 T1G_IN T1CKI T1GVAL Timer1 TMR1GIF N N+1 由软件清零 N+2 N+3 N+4 在 T1GVAL 的下降沿 由硬件置 1 如果使能了中断,则周期结束时会将中断标志置 1。保 存此测量之后,可重复执行本文档前文所介绍的单个脉 冲的测量步骤(请参见“脉冲测量”下的“Timer1 门 控”一节)。之后,只需计算脉宽与周期长度的比值即 可得到占空比。 由软件清零 NCO + CLC + TimerX 表 12: 模块 NCO 1. TimerX 限制 此方案需要执行两次测量:分别针对波形的脉冲和周 期。这两次测量都是在软件初始化之后完全在模块中执 行的。每次测量都存在正/负一个时钟周期的不确定性。 © 2013 Microchip Technology Inc. 上限 分辨率 65.54 ms 62.5 ns CLC 设置 在上升 / 下降沿将 Timer1 门控设置为单脉冲和翻 转模式 2. 为周期选择合适的Timer1时钟源与预分频比 3. 将 TMR1H 和 TMR1L清零 4. 使能模块并将T1GG0 位置 1 5. (产生两个连续的上升/ 下降沿) 6. TMR1GIF 位置1 7. 从 TMR1H:L 保存周期宽度 8. 将 TMR1GIF 清零 9. 将 Timer1 门控设置为单脉冲模式(请参见“脉冲 测量”下的“Timer1门控”一节) 10. 保存脉宽测量值 11. 用脉宽除以周期以确定占空比 代码计算 此方法使用 NCO 和 CLC,在脉冲为高电平时为 NCO 累 加器提供时钟。当其他模块在运行时,可使用任意定时 器来递增计数。为实现最佳精度,使用此方法测量波形 的占空比时,应该让测量时间延长到至少 100 个周期。 概述 使能定时器后,立即使能NCO,以便开始以增量值1进 行累加。当要测量的波形为高电平时,NCO 将在每个 时钟沿递增,直到波形变为低电平为止。 通过禁止 NCO 可结束测量。可通过多种方式来禁止, 如定时器中断或 NCO 累加器溢出方式。如果发生了溢 出,则应该使用该寄存器的最大值,而不是其当前值, 因为中断无法阻止其再次从零开始递增。 为了避免后处理,必须对CLC和定时器使用同一个时钟 源(Fosc)。例如,Timer2 只能使用 Fosc/4 作为时钟 输入。对该定时器结果值进行两次左移操作可使值乘 4, 这样可对此进行补偿。 DS01473A_CN 第 17 页 AN1473 CLC1和 NCO之间交互的高级视图。除脉冲外,所有连接都是处理器的内部连接。 图16: NCO 1 T im e r X 时钟 in c CLC1 累加器 脉冲 之后,将 20 位 NCO 值除以定时器值可得到占空比(假 设定时器和 NCO 均按 1 递增,并且使用预分频比为 1:1 的相同时钟源)。 公式 1: NCO的占空比计算 占空比 = 累加器值 -----------------------定时器值 定时器计满时返回时长是一个重要考虑因素。定时器不 能在波形的一个完整周期结束之前计满。 图17: 设置 1. 2. 将NCO设置为FDC或PFC模式,并使用LC1OUT 作为时钟源 将CLC设置为4 输入与门 a)将输入1和2设置为VDD(取反门控1和2输出) b)输入 3 为时钟源(HFINTOSC) c) 输入 4 为脉冲 图17显示了图16 实现方案的时序图。 占空比为NCO 累加器值与定时器值之比 当信号为高电平且出现时钟上升沿时,NCO 的累加器开始按值 1 递增。该定时器会在禁止(未显示)之前持续递 增。波形的占空比约为60%(3个高电平计数/总共5个计数)。实际的波形周期可能比这5个时钟要大很多。 可测得的占空比如下: 公式 2: NCO的占空比计算 因此,该策略应在波形尽可能多的情况下计数时采用。 例如,长达100个周期的50 kHz方波,其精度为1%,亦 即一个周期长度。这需要让定时器至少计数2 ms。 占空比 = 累加器值 ------------------------ = 158 --------- ( 100 ) = 62 % 定时器值 255 由于定时器相对于波形周期的起始和结束而开始和停止 递增的时间不确定,因此该测量存在不确定性。这种不 确定性会随定时器溢出的配置而有所波动。如果定时器 刚好在第二个脉冲开始之前禁止(图中未显示),则占 空比会比实际小很多。 DS01473A_CN 第 18 页 © 2013 Microchip Technology Inc. AN1473 公式 3: 此方法的精度取决于测量的周期数 – 1- ( 100 ) 精度 = 周期数 ----------------------------1 - * 周期数 定时器长度 = ----------周期 此方法与 CCP 模块的方法类似,只是无法在检测到事 件(上升 / 下降沿)时锁存定时器值。这将导致计算中 进一步产生偏差,因为软件此时必须立即保存定时器 值。一些 PIC 单片机可指定上升沿和下降沿触发器,而 另一些器件不会对两者进行区分。如果器件支持 IOC, 则可以使用 INT 引脚以及任意 PORTB 引脚。有关测量 对象的图示,请参见图3。 CCP代码计算 设置 周期数 CCP 表13: 模块 CCP1 Timer1/3 概述 上限 分辨率 16.38 ms 3 μs CCP 模块也可以测量波形的占空比。该方法与“脉冲 测量”下“CCP”一节的方法类似。 概述 另 一 种 测 量 占 空 比 的 方 法 是 按 照“脉 冲 测 量”下 “CCP”一节所述设置CCP,然后将模块配置为在第4个 或第 16 个边沿产生中断以计算周期,最后将两个结果 相除以得到占空比。 执行“搭配定时器的 IOC(电平变化中断)”一节介绍 的设置操作之后,可按如下公式计算占空比百分数: 公式 4: 占空比 ( % ) = W ----- * ( 100 ) T 限制 分辨率与脉冲测量的分辨率相同。 未搭配定时器的 IOC(电平变化中断) 表 15: 设置 模块 请参见“CCP”一节进行设置以得到周期与脉宽。 IOC/INT 限制 需要消除任何由脉冲测量所导致的绝对误差。为获取最 佳结果,应该在持续捕捉期间捕捉大量计数。例如, CCP 必须至少捕捉 10 次计数才能达到10% 精度。 搭配定时器的 IOC(电平变化中断) 表14: 模块 IOC/INT TimerX 搭配定时器的IOC 的代码计算 上限 分辨率 4.1 ms 8 μs 此方法使用的硬件模块较便宜,但精度较低。此策略 整合了基于电平变化中断的脉冲测量(请参见“脉冲 测量”中的“搭配定时器的 IOC(电平变化中断)” 一节)。 © 2013 Microchip Technology Inc. 占空比百分数计算公式 未搭配定时器的 IOC的代码计算 上限 分辨率 1.073s 12 μs 此策略使用 IOC 功能实现只用一个寄存器来代替定时器 进行递增。 总结 由于未搭配定时器,单片机必须花费时间轮询和递增寄 存器。从而在完成占空比测量之前,迫使 CPU 一直被 软件程序占用。有关测量对象的图示,请参见图3。 设置 执行“未搭配定时器的 IOC(电平变化中断)”一节介 绍的设置操作之后,可通过公式4 计算占空比百分数。 限制 分辨率与脉冲测量的分辨率相同。不确定性为正/负两个 时钟周期。 DS01473A_CN 第 19 页 AN1473 轮询输入 表16: 无代码计算 模块 无 上限 分辨率 1.073s 12 μs 这是最基本的程序。它不包括任何外设,但最耗时。 总结 该方法只使用软件来轮询和递增变量,从而测量占空比。 设置 执行“轮询输入”一节介绍的步骤之后,可通过公式 4 计算占空比百分数。 限制 分辨率与之前的软件程序(与设置每个上升沿和下降沿 检测所需的指令数成比例关系)以及递增程序类似。 DS01473A_CN 第 20 页 © 2013 Microchip Technology Inc. 请注意以下有关 Microchip 器件代码保护功能的要点: • Microchip 的产品均达到 Microchip 数据手册中所述的技术指标。 • Microchip 确信:在正常使用的情况下, Microchip 系列产品是当今市场上同类产品中最安全的产品之一。 • 目前,仍存在着恶意、甚至是非法破坏代码保护功能的行为。就我们所知,所有这些行为都不是以 Microchip 数据手册中规定的 操作规范来使用 Microchip 产品的。这样做的人极可能侵犯了知识产权。 • Microchip 愿与那些注重代码完整性的客户合作。 • Microchip 或任何其他半导体厂商均无法保证其代码的安全性。代码保护并不意味着我们保证产品是 “牢不可破”的。 代码保护功能处于持续发展中。 Microchip 承诺将不断改进产品的代码保护功能。任何试图破坏 Microchip 代码保护功能的行为均可视 为违反了 《数字器件千年版权法案 (Digital Millennium Copyright Act)》。如果这种行为导致他人在未经授权的情况下,能访问您的 软件或其他受版权保护的成果,您有权依据该法案提起诉讼,从而制止这种行为。 提供本文档的中文版本仅为了便于理解。请勿忽视文档中包含 的英文部分,因为其中提供了有关 Microchip 产品性能和使用 情况的有用信息。Microchip Technology Inc. 及其分公司和相 关公司、各级主管与员工及事务代理机构对译文中可能存在的 任何差错不承担任何责任。建议参考 Microchip Technology Inc. 的英文原版文档。 本出版物中所述的器件应用信息及其他类似内容仅为您提供便 利,它们可能由更新之信息所替代。确保应用符合技术规范, 是您自身应负的责任。Microchip 对这些信息不作任何明示或 暗示、书面或口头、法定或其他形式的声明或担保,包括但不 限于针对其使用情况、质量、性能、适销性或特定用途的适用 性的声明或担保。 Microchip 对因这些信息及使用这些信息而 引起的后果不承担任何责任。如果将 Microchip 器件用于生命 维持和 / 或生命安全应用,一切风险由买方自负。买方同意在 由此引发任何一切伤害、索赔、诉讼或费用时,会维护和保障 Microchip 免于承担法律责任,并加以赔偿。在 Microchip 知识 产权保护下,不得暗中或以其他方式转让任何许可证。 商标 Microchip 的名称和徽标组合、 Microchip 徽标、 dsPIC、 FlashFlex、 KEELOQ、 KEELOQ 徽标、 MPLAB、 PIC、 PICmicro、 PICSTART、 PIC32 徽标、 rfPIC、 SST、 SST 徽 标、 SuperFlash 和 UNI/O 均为 Microchip Technology Inc. 在 美国和其他国家或地区的注册商标。 FilterLab、 Hampshire、 HI-TECH C、 Linear Active Thermistor、 MTP、 SEEVAL 和 The Embedded Control Solutions Company 均为 Microchip Technology Inc. 在美国的 注册商标。 Silicon Storage Technology 为 Microchip Technology Inc. 在 除美国外的国家或地区的注册商标。 Analog-for-the-Digital Age、 Application Maestro、 BodyCom、 chipKIT、 chipKIT 徽标、 CodeGuard、 dsPICDEM、 dsPICDEM.net、 dsPICworks、 dsSPEAK、 ECAN、 ECONOMONITOR、 FanSense、 HI-TIDE、 In-Circuit Serial Programming、 ICSP、 Mindi、 MiWi、 MPASM、MPF、MPLAB Certified 徽标、MPLIB、MPLINK、 mTouch、 Omniscient Code Generation、 PICC、 PICC-18、 PICDEM、 PICDEM.net、 PICkit、 PICtail、 REAL ICE、 rfLAB、 Select Mode、 SQI、 Serial Quad I/O、 Total Endurance、 TSHARC、 UniWinDriver、 WiperLock、 ZENA 和 Z-Scale 均为 Microchip Technology Inc. 在美国和其他国 家或地区的商标。 SQTP 是 Microchip Technology Inc. 在美国的服务标记。 GestIC 和 ULPP 为 Microchip Technology Inc. 的子公司 Microchip Technology Germany II GmbH & Co. & KG 在除美 国外的国家或地区的注册商标。 在此提及的所有其他商标均为各持有公司所有。 © 2013, Microchip Technology Inc. 版权所有。 ISBN:978-1-62077-390-1 QUALITY MANAGEMENT SYSTEM CERTIFIED BY DNV == ISO/TS 16949 == © 2013 Microchip Technology Inc. Microchip 位于美国亚利桑那州 Chandler 和 Tempe 与位于俄勒冈州 Gresham 的全球总部、设计和晶圆生产厂及位于美国加利福尼亚州和 印度的设计中心均通过了 ISO/TS-16949:2009 认证。 Microchip 的 PIC® MCU 与 dsPIC® DSC、KEELOQ® 跳码器件、串行 EEPROM、单片 机外设、非易失性存储器和模拟产品严格遵守公司的质量体系流程。 此外, Microchip 在开发系统的设计和生产方面的质量体系也已通过了 ISO 9001:2000 认证。 DS01473A_CN 第 21 页 全球销售及服务网点 美洲 亚太地区 亚太地区 欧洲 公司总部 Corporate Office 2355 West Chandler Blvd. Chandler, AZ 85224-6199 Tel: 1-480-792-7200 Fax: 1-480-792-7277 技术支持: http://www.microchip.com/ support 网址:www.microchip.com 亚太总部 Asia Pacific Office Suites 3707-14, 37th Floor Tower 6, The Gateway Harbour City, Kowloon Hong Kong Tel: 852-2401-1200 Fax: 852-2401-3431 台湾地区 - 高雄 Tel: 886-7-213-7828 Fax: 886-7-330-9305 奥地利 Austria - Wels Tel: 43-7242-2244-39 Fax: 43-7242-2244-393 台湾地区 - 台北 Tel: 886-2-2508-8600 Fax: 886-2-2508-0102 丹麦 Denmark-Copenhagen Tel: 45-4450-2828 Fax: 45-4485-2829 台湾地区 - 新竹 Tel: 886-3-5778-366 Fax: 886-3-5770-955 法国 France - Paris Tel: 33-1-69-53-63-20 Fax: 33-1-69-30-90-79 澳大利亚 Australia - Sydney Tel: 61-2-9868-6733 Fax: 61-2-9868-6755 德国 Germany - Munich Tel: 49-89-627-144-0 Fax: 49-89-627-144-44 印度 India - Bangalore Tel: 91-80-3090-4444 Fax: 91-80-3090-4123 意大利 Italy - Milan Tel: 39-0331-742611 Fax: 39-0331-466781 印度 India - New Delhi Tel: 91-11-4160-8631 Fax: 91-11-4160-8632 荷兰 Netherlands - Drunen Tel: 31-416-690399 Fax: 31-416-690340 印度 India - Pune Tel: 91-20-2566-1512 Fax: 91-20-2566-1513 日本 Japan - Osaka Tel: 81-6-6152-7160 西班牙 Spain - Madrid Tel: 34-91-708-08-90 Fax: 34-91-708-08-91 亚特兰大 Atlanta Duluth, GA Tel: 1-678-957-9614 Fax:1-678-957-1455 波士顿 Boston Westborough, MA Tel: 1-774-760-0087 Fax: 1-774-760-0088 芝加哥 Chicago Itasca, IL Tel: 1-630-285-0071 Fax: 1-630-285-0075 克里夫兰 Cleveland Independence, OH Tel: 1-216-447-0464 Fax: 1-216-447-0643 达拉斯 Dallas Addison, TX Tel: 1-972-818-7423 Fax: 1-972-818-2924 底特律 Detroit Farmington Hills, MI Tel: 1-248-538-2250 Fax: 1-248-538-2260 印第安纳波利斯 Indianapolis Noblesville, IN Tel: 1-317-773-8323 Fax: 1-317-773-5453 洛杉矶 Los Angeles Mission Viejo, CA Tel: 1-949-462-9523 Fax: 1-949-462-9608 圣克拉拉 Santa Clara Santa Clara, CA Tel: 1-408-961-6444 Fax: 1-408-961-6445 加拿大多伦多 Toronto Mississauga, Ontario, Canada Tel: 1-905-673-0699 Fax: 1-905-673-6509 中国 - 北京 Tel: 86-10-8569-7000 Fax: 86-10-8528-2104 中国 - 成都 Tel: 86-28-8665-5511 Fax: 86-28-8665-7889 中国 - 重庆 Tel: 86-23-8980-9588 Fax: 86-23-8980-9500 中国 - 杭州 Tel: 86-571-2819-3187 Fax: 86-571-2819-3189 中国 - 香港特别行政区 Tel: 852-2943-5100 Fax: 852-2401-3431 中国 - 南京 Tel: 86-25-8473-2460 Fax: 86-25-8473-2470 中国 - 青岛 Tel: 86-532-8502-7355 Fax: 86-532-8502-7205 中国 - 上海 Tel: 86-21-5407-5533 Fax: 86-21-5407-5066 中国 - 沈阳 Tel: 86-24-2334-2829 Fax: 86-24-2334-2393 中国 - 深圳 Tel: 86-755-8864-2200 Fax: 86-755-8203-1760 中国 - 武汉 Tel: 86-27-5980-5300 Fax: 86-27-5980-5118 中国 - 西安 Tel: 86-29-8833-7252 Fax: 86-29-8833-7256 中国 - 厦门 Tel: 86-592-238-8138 Fax: 86-592-238-8130 中国 - 珠海 Tel: 86-756-321-0040 Fax: 86-756-321-0049 Fax: 81-6-6152-9310 英国 UK - Wokingham Tel: 44-118-921-5869 Fax: 44-118-921-5820 日本 Japan - Tokyo Tel: 81-3-6880-3770 Fax: 81-3-6880-3771 韩国 Korea - Daegu Tel: 82-53-744-4301 Fax: 82-53-744-4302 韩国 Korea - Seoul Tel: 82-2-554-7200 Fax: 82-2-558-5932 或 82-2-558-5934 马 来 西 亚 Malaysia - Kuala Lumpur Tel: 60-3-6201-9857 Fax: 60-3-6201-9859 马来西亚 Malaysia - Penang Tel: 60-4-227-8870 Fax: 60-4-227-4068 菲律宾 Philippines - Manila Tel: 63-2-634-9065 Fax: 63-2-634-9069 新加坡 Singapore Tel: 65-6334-8870 Fax: 65-6334-8850 泰国 Thailand - Bangkok Tel: 66-2-694-1351 Fax: 66-2-694-1350 11/29/12 DS01473A_CN 第 22 页 © 2013 Microchip Technology Inc.