同样叫 PIC,PIC10F 只有 16 字节 RAM,dsPIC33F 有 8 KB 和 6 通道 DMA。本文按 Microchip 选型指南,把 Flash 字与字节、I/O、ADC、通信与电机外设六道边界逐条算清。
一个小家电控制器原本用 PIC16F684,新需求要加 CAN、12 位 ADC 和十几路按键,采购把选型表发过来,从 PIC10F200 一直排到 dsPIC33FJ256MC710,光 Flash 的标法就有三种。结论先给:PIC 选型不能看型号数字大小,要按六道资源边界逐条卡——指令宽度与速度、存储容量、I/O 与封装、ADC、通信外设、电机专用外设,卡到哪一道不够就升到哪一级,多升一级往往就是换封装、换开发工具。
本文按 Microchip《产品选型指南》(2006.03)整理,所有型号的资源数字均取自该表,字节数由标称位宽换算得到。
选型表把 PIC 分成三段:PIC10F/12F/16F 是 8 位中低端,PIC18F 是 8 位增强型,dsPIC30F/33F 是 16 位数字信号控制器。三段的指令周期差一个数量级,拿"Flash 都是 8K"去横比没有意义。
| 家族 | 指令周期 | 指令数 | 最高时钟 | 供电 | Flash 标注单位 |
|---|---|---|---|---|---|
| PIC10F | 500 ns | 33 条 | 内部 4 MHz(220/222 为 8 MHz) | — | Words(12 位) |
| PIC12F | 500 ns~1 µs | 33/35 条 | 20 MHz | — | Words(12 位) |
| PIC16F | 200 ns | 35 条 | 20 MHz | — | Words(14 位) |
| PIC18F | 10 MIPS | 77 条 | 40 MHz | 2.0~5.5 V | Words(16 位) |
| dsPIC30F | 30 MIPS | 16 位指令 | — | 2.5~5.5 V | KWords(24 位) |
| dsPIC33F | 40 MIPS | 16 位指令 | — | 3.3 V | Kbyte |
这张表里最容易被忽略的是"供电"一列:dsPIC33F 是 3.3 V 器件,周边若是 5 V 传感器,电平转换要提前算进 BOM;dsPIC30F 和 PIC18F 都能直接跑 5 V,这也是很多工业现场还留着 30F 的原因。
PIC16F 的一个程序字是 14 位,PIC18F 是 16 位,dsPIC30F 是 24 位,dsPIC33F 干脆直接标 Kbyte。同一个"8K",PIC16F876A 是 8192×14 位,折合 14336 字节;PIC18F 的 8K 字是 16384 字节;dsPIC30F2010 的 4K 字按 24 位算是 12288 字节。编译器报"程序空间不足"时,先确认自己用的是字还是字节。
| 型号 | 选型表标法 | 折算字节 | SRAM | EEPROM | I/O | 封装 |
|---|---|---|---|---|---|---|
| PIC10F200 | 256×12 | 384 B | 16 B | — | 4 | 6OT、8P |
| PIC12F675 | 1024×14 | 1792 B | 64 B | 128 B | 6 | 8P、8SN、8MF |
| PIC16F684 | 2048×14 | 3584 B | 128 B | 256 B | 12 | 14P、14SL、14ST |
| PIC16F876A | 8192×14 | 14336 B | 368 B | 256 B | 22 | 28SP、28SO、28SS、28ML |
| PIC18F4520 | 16384×16 | 32768 B | 1536 B | 256 B | 36 | 40P、44ML、44PT |
| dsPIC30F2010 | 4 KWords | 12288 B | 512 B | 1024 B | — | 28SO、28SP、28MM |
| dsPIC33FJ64MC508 | 64 KB | 65536 B | 8 KB | — | 69 | 80PT |
Flash 决定功能能不能写完,RAM 决定运行起来会不会爆。PIC10F200 只有 16 字节 RAM,连一个 8 路按键的消抖缓冲都放不下;PIC16F684 的 128 字节要装栈、变量和通信缓冲,做 Modbus 从站时 100 个保持寄存器就需要 200 字节,直接超了。到 PIC18F4520 的 1536 字节才谈得上多任务缓冲,dsPIC33FJ64MC508 的 8 KB 才有余量跑双 ADC 乒乓和 DMA 描述符。
EEPROM 是另一笔账:PIC12F675 有 128 字节,PIC16F684、PIC16F876A、PIC18F4520 都是 256 字节,dsPIC30F2010 有 1024 字节,dsPIC30F6010 给到 4096 字节。参数表、标定系数、累计量都放这里,容量不够时要么外挂 24C 系列,要么把参数压到 Flash 末尾扇区自己管擦写。
I/O 数量先看按键、继电器和指示灯,再看封装能不能上产线。PIC10F200 只有 4 个 I/O,PIC12F675 是 6 个,PIC16F684 是 12 个,PIC16F876A 是 22 个,PIC16F877A 是 33 个,PIC18F4520 是 36 个,dsPIC33FJ64MC508 最多 69 个。封装从 6 脚 OT 一直到 100 脚 PT,每上一档,PCB 面积和贴片成本都要跟着改。
| 型号 | ADC | 模拟比较器 | PWM | 16 位定时器 |
|---|---|---|---|---|
| PIC10F200 | 无(220/222 为 2 路 8 位) | — | — | 1 个 8 位 + WDT |
| PIC12F675 | 4 路 10 位 | 1 | — | 1×16 位 +1×8 位 |
| PIC16F684 | 8 路 10 位 | 2 | 1 | 1×16 位 +2×8 位 |
| PIC16F876A | 5 路 10 位 | 2 | 2 | 1×16 位 +2×8 位 |
| PIC18F4520 | 13 路 10 位 | 2 | 2 | 3×16 位 +1×8 位 |
| dsPIC30F2010 | 6 路 10 位、1 Msps | — | 6 路电机 PWM | 3×16 位 |
| dsPIC33FJ64MC508 | 1 个 ADC、18 通道、4 路 S/H | — | 8 路电机 PWM | 9×16 位 |
分辨率要按被测量算:10 位是 1024 级,5 V 满量程下每级约 4.9 mV;12 位是 4096 级,每级约 1.2 mV。选型表里 dsPIC33F 单列了"12 位 500 ksps"一栏,但 dsPIC33FJ64MC508 在该栏是空的,只有 10 位 1 Msps 的 18 通道 ADC——想要 12 位就得往上挑同系列里有标注的型号,这一步很容易看漏。
这条边界最费钱,因为一旦要 CAN 或 USB,基本就要离开 PIC16F。表里写得很清楚:PIC16F684 没有硬件串口,要做串口通信只能软件模拟;PIC16F688 只有 EUSART;PIC16F876A 才配齐 AUSART 加 I2C/SPI。CAN 在 PIC18F2480 上是全速 CAN 2.0B,带 3 个发送缓冲、2 个接收缓冲、2 个验收屏蔽器和 6 个验收滤波器;USB 在 PIC18F4550 上是全速 USB 2.0,48 MHz 时钟。
| 型号 | UART | SPI/I2C | CAN | USB | 专用外设 |
|---|---|---|---|---|---|
| PIC16F684 | 无(需软件模拟) | 无 | — | — | — |
| PIC16F688 | 1 路 EUSART | 无 | — | — | — |
| PIC16F876A | 1 路 AUSART | 各 1 路 | — | — | — |
| PIC18F2480 | 1 路 AUSART | 各 1 路 | CAN 2.0B,3 发 2 收 | — | 6 个验收滤波器 |
| PIC18F4550 | 1 路 EUSART | 各 1 路 | — | 全速 USB 2.0 | 48 MHz |
| dsPIC30F4011 | 2 路 | 1 路 SPI、1 路 I2C | 1 路 | — | 4 路输入捕捉、QEI |
| dsPIC33FJ64MC508 | 2 路 | 2 路 SPI、2 路 I2C | 1 路 | — | 6 通道 DMA、QEI |
做电机控制时,通用定时器凑出来的 PWM 和专用电机 PWM 是两回事。dsPIC30F2010 给的是 6 路电机控制 PWM、4 路输入捕捉、2 路输出比较,外加 QEI 硬件正交解码和 6 通道 10 位 ADC;dsPIC30F6010 扩到 8 路 PWM、8 路捕捉、8 路比较、16 通道 ADC 和两路 CAN;dsPIC33FJ64MC508 则是 8 路 PWM、9 个定时器、6 通道 DMA、40 MIPS,并继续保留 QEI。PIC18F4520 只有 2 路 CCP PWM,也没有 QEI,低速转台还能靠软件解码,高速伺服就会丢步。
QEI 的价值在于把 A/B 相解码、倍频、方向判断、索引复位全放进硬件,CPU 只在计满或索引时收一次中断;软件解码在 1 MHz 以上的计数率时,中断开销会直接吃掉控制环的时间预算。这一条边界,是 16 位 dsPIC 与 8 位 PIC 最本质的分界。
/* 把选型边界写成编译期断言,换型号时先让编译器报错 */
#define FLASH_BYTES 14336u /* PIC16F876A:8192 x 14 bit */
#define RAM_BYTES 368u /* PIC16F876A SRAM */
#define EEPROM_BYTES 256u /* PIC16F876A EEPROM */
#if (FLASH_BYTES < 32768u)
#error "程序空间不足:14 KB 不够,需换 PIC18F4520(32 KB)"
#endif
#if (RAM_BYTES < 1024u)
#error "RAM 不足:协议帧与参数表放不下,需换 PIC18F4520(1536 B)"
#endif
#if (EEPROM_BYTES < 512u)
#error "EEPROM 不足:参数区需外挂 24C 或改 dsPIC30F2010(1024 B)"
#endif
| 现象 | 常见根因 | 改法 |
|---|---|---|
| 程序"空间够"却编译溢出 | 把字当成字节算,少算一倍 | 按 14/16/24 位折算字节后再评估 |
| 串口只能软件模拟 | 选了 PIC16F684,无硬件串口 | 升到 PIC16F688 或 PIC16F876A |
| CAN 丢帧 | 接收缓冲和验收滤波器数量不够 | 选带 6 个滤波器的 PIC18F2480,或 dsPIC 双 CAN |
| 伺服低速抖动、位置漂移 | 无 QEI,软件解码丢边沿 | 换带 QEI 的 dsPIC30F/33F |
| 12 位采样精度达不到 | 所选型号只有 10 位 ADC | 核对选型表 12 位列有标注的型号 |
| 换板后 5 V 传感器异常 | dsPIC33F 为 3.3 V 供电 | 加电平转换,或退回 5 V 的 dsPIC30F |
一句话总结:PIC 选型的三道坎是"存储按字算、外设按需算、电压按现场算"。先数通信口和 ADC 通道定家族,再用字节数核对 Flash 与 RAM,最后用封装和供电收口;把这三步写成编译期断言,下次换型号就不会靠猜。
还想接着看:STM32F101 低成本 RTU 的四档升级边界、dsPIC30F2010 的 MCPWM 死区与 ADC 同步采样、PIC16F 片内比较器做低压检测与窗口比较。
本文基于 Microchip《产品选型指南》(2006.03)技术资料整理优化。
沧州艾诺威电子 — 国家高新技术企业,20+项国家专利
嵌入式系统开发 · 物联网方案 · AI智能硬件 · 一站式交付
电话:13930711029 | 邮箱:tech@czinv.com | 24小时内响应