半桥/全桥驱动最怕上下管直通。按 PIC18F4320 数据手册第 16 章拆解 P1A~P1D 引脚映射、P1M 四种模式、PDC 死区算法与方向切换风险,给出 20 MHz 下 1 µs 死区的七步配置和排查表。
一台 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 的数值是按手册公式代入的算例,项目里按自己的时钟和开关频率重算。
数据手册写得很明确: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 kHz | 1:1 | 249 | 50.0 µs |
| 10 kHz | 1:4 | 124 | 100.0 µs |
| 5 kHz | 1:4 | 249 | 200.0 µs |
| PDC 取值 | 20 MHz 下死区 | 典型用途(经验值) |
|---|---|---|
| 1 | 0.2 µs | 小功率 MOS,栅极电荷小 |
| 5 | 1.0 µs | 常规半桥,兼顾效率与安全 |
| 10 | 2.0 µs | 功率管关断较慢的场合 |
| 25 | 5.0 µs | IGBT 或带隔离驱动的桥臂 |
| 127 | 25.4 µs | 7 位上限定值 |
这里有两个边界。第一,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 周期;或者选关断速度比开通更快的驱动。现场更稳妥的做法是两条都做,软件先降占空比,硬件再用快速关断的驱动兜底。
过流保护不必等软件轮询。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 / 两者之一 |
| 100 | INT0 引脚 |
| 101 / 110 / 111 | INT0 加比较器 1 / INT0 加比较器 2 / 三者任一 |
两个细节容易踩。第一,关断条件是电平而不是边沿:只要比较器还输出有效电平,ECCPASE 就清不掉,软件写也无效。第二,PRSEN=0 时必须由固件清 ECCPASE 才能重启;PRSEN=1 时故障消失会自动清,但如果故障一直存在,输出就一直不恢复。还有一条:如果 ECCPASE 在新周期开始时仍为 1,整周期都保持关断,清除后要等下一个周期才恢复正常波形。
复位后所有 IO 都是高阻,P1A~P1D 的锁存器状态也不确定。手册要求外部上下拉先把功率管保持在关断态,固件则按固定顺序来:先把 PWM 引脚配置为输入,装好 PR2、CCPR1L、CCP1CON,再启动 Timer2;等 TMR2IF 置位、确认完整 PWM 周期已经跑完,最后才清 TRISC/TRISD 把引脚切成输出。手册还提醒,极性必须在引脚成为输出之前选定,运行中改极性可能损坏外部电路。
休眠时 Timer2 停振,ECCP 引脚保持当前电平;唤醒后从原状态继续。如果应用要在休眠期间确保功率管关断,不能只靠 PWM 停振,得用自动关断或外部使能脚把驱动关掉。
/* 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小时内响应