PIC18F4320 半桥/全桥怎么配:P1A~P1D 引脚映射与 1 µs 死区七步落地

半桥/全桥驱动最怕上下管直通。按 PIC18F4320 数据手册第 16 章拆解 P1A~P1D 引脚映射、P1M 四种模式、PDC 死区算法与方向切换风险,给出 20 MHz 下 1 µs 死区的七步配置和排查表。

2026-11-07
PIC18F4320ECCP半桥全桥死区PWM

一台 24 V 直流执行器驱动板用 PIC18F4320 直接推半桥,省掉外部 PWM 逻辑。样机空载正常,装到阀体上连续换向几次,下管就炸了。示波器一抓,P1A 与 P1B 在换向沿同时为高,死区根本没落地。结论先给:PIC18F4320 的 ECCP 只在 PIC18F4X20 上提供,半桥靠 P1A/P1B 互补加 PDC 死区,全桥靠 P1A/P1D 或 P1B/P1C 两组轮流导通;死区按指令周期计数,20 MHz 下 1 µs 就是 PDC=5,引脚映射和 TRIS 顺序错一步就会直通。

本文按 Microchip PIC18F2220/2320/4220/4320 数据手册 DS39599C 第 16 章“增强型捕捉/比较/PWM(ECCP)”整理,寄存器位定义、引脚表与初始化步骤均取自该章。文中 20 MHz、20 kHz 的数值是按手册公式代入的算例,项目里按自己的时钟和开关频率重算。

一、先认引脚:P1A~P1D 复用在 PORTC 和 PORTD 上

数据手册写得很明确:ECCP 只在 PIC18F4X20 器件上提供,PIC18F2X20 的 CCP1 仍是标准 CCP。P1A 在 RC2/CCP1/P1A,P1B 在 RD5/PSP5/P1B,P1C 在 RD6/PSP6/P1C,P1D 在 RD7/PSP7/P1D。要把它们当 PWM 输出,TRISC<2> 与 TRISD<5:7> 必须清零;双输出或四输出模式下,PORTD 的 PSP 功能会被 P1B~P1D 覆盖。

模式由 CCP1CON 的两组位共同决定:P1M1:P1M0 选输出结构,CCP1M3:CCP1M0 选 PWM 极性与工作类别。四种结构的引脚行为差别很大,先把这张表记住。

P1M1:P1M0输出结构引脚行为典型场景
00单输出P1A 调制,P1B~P1D 作普通 IO单向调速、加热丝
01全桥正向P1D 调制,P1A 常通,P1B/P1C 无效直流电机正转
10半桥P1A/P1B 互补调制,带死区推挽、半桥功率级
11全桥反向P1B 调制,P1C 常通,P1A/P1D 无效直流电机反转

很多“P1C/P1D 没波形”的现场,根因不是寄存器没写,而是选成了半桥模式——半桥只用 P1A 和 P1B,P1C/P1D 仍作普通 IO。反过来,选全桥却只清 TRISC<2>,另外三个脚仍是输入,也会表现成“只有一路在动”。

二、三个公式:周期、占空比、死区

ECCP 的时基还是 Timer2,手册给的三个关系式很直接:周期 = 4×TOSC×(PR2+1)×TMR2 预分频;占空比 = TOSC×(CCPR1L:CCP1CON<5:4>)×预分频;死区 = 4×TOSC×PWM1CON<6:0>,也就是 PDC×TCY。注意死区单位是指令周期,不是微秒,换晶振就要重算。

以 FOSC=20 MHz 为例,TOSC=50 ns,TCY=200 ns。要 20 kHz,周期 50 µs,代入得 (PR2+1)×预分频=250;预分频取 1:1 时 PR2=249。要 1 µs 死区,PDC=1 µs÷200 ns=5。PDC 是 7 位,最大 127,20 MHz 下上限 25.4 µs。

目标频率TMR2 预分频PR2实际周期
20 kHz1:124950.0 µs
10 kHz1:4124100.0 µs
5 kHz1:4249200.0 µs
PDC 取值20 MHz 下死区典型用途(经验值)
10.2 µs小功率 MOS,栅极电荷小
51.0 µs常规半桥,兼顾效率与安全
102.0 µs功率管关断较慢的场合
255.0 µsIGBT 或带隔离驱动的桥臂
12725.4 µs7 位上限定值

这里有两个边界。第一,PR2 只有 8 位,20 MHz 下 1:1 预分频最低只能做到约 19.5 kHz(PR2=255 时 51.2 µs);要更低频率,必须改预分频,不能指望把 PR2 写成 499。第二,占空比是 10 位,CCPR1L 存高 8 位、CCP1CON<5:4> 存低 2 位;50% 占空比对应 500 个计数,CCPR1L 写 125、低两位写 00。

三、半桥:死区加在“变有效”的沿上

半桥模式下 P1A 与 P1B 互补,死区延迟发生在信号从非有效态切到有效态的时刻。手册特别提醒:如果 PDC 的值大于当前占空比,对应输出在整个周期都保持非有效。换句话说,死区不是“固定挖掉一段”,它会和占空比抢时间;小占空比时把 PDC 设得太大,输出会直接没有波形。

引脚方向也要按模式配:P1A 对应 TRISC<2>,P1B 对应 TRISD<5>,两个都要清零。半桥可以驱动标准推挽负载,也可以驱动全桥的四个管子——后者只用两路 PWM,另外两路靠硬件逻辑或固定电平配合,手册图 16-5 给了两种接法。

四、全桥:方向切换没有死区,这是最容易烧管的地方

全桥模式四个脚都用上,但同一时刻只有两个输出有效。正向时 P1A 常通、P1D 调制;反向时 P1C 常通、P1B 调制。手册明确写着:全桥模式不提供死区延迟,因为任意时刻只有一个输出在调制。真正危险的是方向切换。

引脚全桥正向(P1M=01)全桥反向(P1M=11)
P1A(RC2)常通无效
P1B(RD5)无效调制
P1C(RD6)无效常通
P1D(RD7)调制无效

固件改 P1M1 位后,模块不会立刻换向,而是等到当前 PWM 周期快结束:在下一个周期开始前 4×TOSC×预分频的窗口里,调制的 P1B/P1D 先回到非有效,常通的 P1A/P1C 再切到相反方向。这段窗口在 20 MHz、1:1 预分频下只有 200 ns,1:4 时 800 ns。

如果占空比接近 100%,而功率管(含驱动)的关断时间又大于开通时间,换向瞬间会出现直通。手册给了两条硬要求:换向前先把占空比降下来、至少保持一个 PWM 周期;或者选关断速度比开通更快的驱动。现场更稳妥的做法是两条都做,软件先降占空比,硬件再用快速关断的驱动兜底。

五、自动关断:比较器和 INT0 把输出拉回安全态

过流保护不必等软件轮询。ECCP 的自动关断源可以选比较器 1、比较器 2、INT0,或它们的任意组合,由 ECCPAS<6:4> 选择。关断发生后,P1A/P1C 与 P1B/P1D 两组引脚各自按 PSSAC、PSSBD 的设定进入驱动 0、驱动 1 或高阻;ECCPASE 位由硬件置 1,把输出锁在关断态。

ECCPAS<2:0>关断源
000关闭自动关断
001 / 010 / 011比较器 1 / 比较器 2 / 两者之一
100INT0 引脚
101 / 110 / 111INT0 加比较器 1 / INT0 加比较器 2 / 三者任一

两个细节容易踩。第一,关断条件是电平而不是边沿:只要比较器还输出有效电平,ECCPASE 就清不掉,软件写也无效。第二,PRSEN=0 时必须由固件清 ECCPASE 才能重启;PRSEN=1 时故障消失会自动清,但如果故障一直存在,输出就一直不恢复。还有一条:如果 ECCPASE 在新周期开始时仍为 1,整周期都保持关断,清除后要等下一个周期才恢复正常波形。

六、上电顺序:先跑完一个 PWM 周期,再把引脚设成输出

复位后所有 IO 都是高阻,P1A~P1D 的锁存器状态也不确定。手册要求外部上下拉先把功率管保持在关断态,固件则按固定顺序来:先把 PWM 引脚配置为输入,装好 PR2、CCPR1L、CCP1CON,再启动 Timer2;等 TMR2IF 置位、确认完整 PWM 周期已经跑完,最后才清 TRISC/TRISD 把引脚切成输出。手册还提醒,极性必须在引脚成为输出之前选定,运行中改极性可能损坏外部电路。

休眠时 Timer2 停振,ECCP 引脚保持当前电平;唤醒后从原状态继续。如果应用要在休眠期间确保功率管关断,不能只靠 PWM 停振,得用自动关断或外部使能脚把驱动关掉。

七、七步落地与验证

  1. 定频:按目标频率和 FOSC 算 (PR2+1)×预分频,确认 PR2 不超过 255。
  2. 定占空比:把 10 位计数值拆成 CCPR1L 与 CCP1CON<5:4>,先按 50% 验证。
  3. 选结构:半桥 P1M=10,全桥正向 01,反向 11,单输出 00;同时选好 CCP1M 极性。
  4. 算死区:PDC=目标死区÷TCY,半桥必须非 0,且不要让 PDC 超过最小占空比。
  5. 配关断:需要过流保护就写 ECCPAS 的源与引脚状态,不需要就保持 0。
  6. 上电:引脚先输入,启动 Timer2,等 TMR2IF 后再开输出。
  7. 验证:示波器同时看 P1A/P1B,量死区与占空比;全桥还要做一次 100% 占空比换向。
/* 20 MHz,20 kHz 半桥,50% 占空比,1 µs 死区 */
    TRISC |= 0x04;              /* RC2/P1A 先做输入 */
    TRISD |= 0x20;              /* RD5/P1B 先做输入 */

    PR2     = 249;              /* 4×50 ns×250×1 = 50 µs */
    CCPR1L  = 125;              /* 500 个计数的一半,低 2 位为 00 */
    CCP1CON = 0x8C;             /* P1M=10 半桥,CCP1M=1100 双高有效 */
    PWM1CON = 0x05;             /* PDC=5,5×200 ns = 1 µs */
    ECCPAS  = 0x00;             /* 先不接自动关断 */
    T2CON   = 0x04;             /* 预分频 1:1,启动 Timer2 */
    TMR2IF  = 0;
    while (!TMR2IF) { }         /* 等完整 PWM 周期结束 */
    TRISC  &= ~0x04;            /* 再开 P1A 输出 */
    TRISD  &= ~0x20;            /* 再开 P1B 输出 */

这段配置把 20 MHz、20 kHz、50% 占空比和 1 µs 死区一次写全。实际项目里 PR2 和 CCPR1L 最好由宏按 FOSC 算,避免换晶振后忘记改;PWM1CON 在初始化后不要再动,防止误写把死区清零。

八、六个现场排查

现象根因改法
上电瞬间上下管同时导通先把 TRIS 设成输出,锁存器状态未定先输入,跑完一个 PWM 周期再开输出
换向时炸管全桥模式无死区,接近 100% 占空比换向换向前降占空比一个周期,或换关断更快的驱动
半桥量不到死区PDC 写了 0,或 PWM1CON 被后续代码改写确认 PWM1CON<6:0> 非 0,初始化后不再改
P1C/P1D 没有波形选成半桥模式,或 TRISD<6:7> 未清零按表 16-1 对齐模式与引脚方向
过流关断后不恢复PRSEN=0,且固件没有清 ECCPASE软件清 ECCPASE,或置 PRSEN=1 自动重启
休眠唤醒后波形停住Timer2 停振,引脚保持原电平唤醒后重装 PR2/CCPR1L,再启动 Timer2

一句话总结:PIC18F4320 的 ECCP 把死区、互补输出和过流关断都做进了片内,但前提是引脚映射、PDC 计数和上电顺序三件事都对;半桥盯住死区与最小占空比,全桥盯住换向窗口,量产前一定用示波器把这两个沿量一遍。

还想接着看:dsPIC30F2010 MCPWM 死区与 FLTA 设计、低成本有刷电机 H 桥 PWM 驱动、STM32 定时器 PWM 配置。

本文基于 Microchip PIC18F2220/2320/4220/4320 数据手册 DS39599C 第 16 章技术资料整理优化。

需要定制开发?

沧州艾诺威电子 — 国家高新技术企业,20+项国家专利
嵌入式系统开发 · 物联网方案 · AI智能硬件 · 一站式交付

立即微信咨询

电话:13930711029 | 邮箱:tech@czinv.com | 24小时内响应