PCB设计和布局

6 阅读12分钟

大家好,我是良许。

在嵌入式系统开发中,PCB(Printed Circuit Board,印刷电路板)设计和布局是将电路原理图转化为实际可制造产品的关键环节。

一个优秀的 PCB 设计不仅能保证电路功能的正常实现,还能提升系统的稳定性、降低电磁干扰、优化散热性能,甚至直接影响产品的成本和可靠性。

今天,我就结合自己多年在嵌入式领域的实践经验,和大家聊聊 PCB 设计和布局的那些事儿。

1. PCB 设计基础概念

1.1 什么是 PCB

PCB 是电子产品中电气连接的载体,它通过在绝缘基板上按预定设计形成点间连接及印制元件的印制板。

简单来说,就是把电路原理图中的各个元器件通过铜箔走线连接起来,形成一个可以实际焊接元器件的板子。

在我早期做单片机开发的时候,经常需要自己画 PCB 板。

记得有一次做一个 STM32 的项目,因为 PCB 布局不合理,导致 ADC 采集到的信号噪声特别大,后来重新调整了模拟地和数字地的布局,问题才得以解决。

这让我深刻体会到,PCB 设计绝不是简单地把元器件连起来那么简单。

1.2 PCB 的基本结构

一块标准的 PCB 通常由以下几层组成:

  1. 基板层:通常使用 FR-4 玻璃纤维环氧树脂材料,提供机械支撑。
  2. 铜箔层:用于形成电气连接的导电层,常见厚度有 1oz(35μm)、2oz(70μm)等。
  3. 阻焊层:绿色或其他颜色的保护层,防止铜箔氧化和短路。
  4. 丝印层:白色字符标识,标注元器件位号、极性等信息。

根据层数不同,PCB 可以分为单面板、双面板和多层板。

在汽车电子领域,我们通常使用 4 层或 6 层板,以满足复杂的信号完整性和 EMC(电磁兼容)要求。

1.3 PCB 设计流程

一个完整的 PCB 设计流程通常包括:

  1. 原理图设计:使用 Altium Designer、KiCad 等工具绘制电路原理图。
  2. 元器件封装库建立:为每个元器件创建或选择合适的 PCB 封装。
  3. PCB 布局:将元器件放置在 PCB 板上的合理位置。
  4. PCB 布线:连接各个元器件的引脚,形成电气通路。
  5. 设计规则检查(DRC):检查是否存在短路、开路、间距不足等问题。
  6. 生成制造文件:输出 Gerber 文件、钻孔文件等,交给 PCB 厂家生产。

2. PCB 布局设计原则

2.1 功能模块化布局

在进行 PCB 布局时,首先要将整个电路按功能划分为不同的模块,比如电源模块、MCU 核心模块、通信接口模块、传感器接口模块等。

每个模块内部的元器件应该紧密放置,模块之间保持适当距离,这样既便于布线,也有利于信号完整性。

举个例子,在我做 STM32 项目时,通常会这样布局:

  1. 电源模块:放在 PCB 的边缘或角落,包括电源输入接口、稳压芯片、滤波电容等。
  2. MCU 核心区:放在 PCB 中心位置,周围布置晶振、复位电路、去耦电容等。
  3. 外设接口:根据实际接口位置需求,放在 PCB 边缘,比如 USB 接口、串口、CAN 接口等。
  4. 模拟电路:如果有 ADC、DAC 等模拟电路,应该远离数字电路和高频信号源,减少干扰。

2.2 信号流向布局

布局时要考虑信号的流向,尽量让信号按照从输入到输出的顺序流动,避免信号回流或交叉。

比如在一个数据采集系统中,传感器信号应该先经过信号调理电路,再进入 ADC,最后到 MCU,这样的布局可以最大程度减少信号干扰。

2.3 热管理考虑

对于功耗较大的元器件,如电源芯片、功率器件、高速处理器等,布局时要考虑散热问题。这些元器件应该:

  1. 远离热敏感元器件(如晶振、传感器)。
  2. 靠近 PCB 边缘或散热孔位置。
  3. 在铜箔层预留足够的散热铜皮。
  4. 必要时预留散热片安装位置。

在汽车电子项目中,我们经常会遇到高温环境,所以热管理尤为重要。

有一次我们设计的一款车载控制器,因为功率芯片布局不当,导致局部温度过高,最后不得不重新设计 PCB,增加了散热铜皮面积。

2.4 机械结构配合

PCB 的外形尺寸、安装孔位置、接口位置等都要与产品的机械结构相匹配。

在布局之前,最好先拿到产品的 3D 结构图,确保 PCB 能够正确安装到外壳中,所有接口都能对准外壳开孔。

3. PCB 布线技巧

3.1 电源和地线布线

电源和地线是 PCB 中最重要的网络,它们的布线质量直接影响整个系统的稳定性。

电源线布线原则:

  1. 加粗电源线:电源线和地线应该尽可能粗,以降低压降和提高载流能力。对于大电流路径,线宽应该根据电流大小计算,通常 1A 电流需要约 20mil(0.5mm)的线宽(1oz 铜厚)。
  2. 星型布线:对于多个负载,尽量采用星型供电方式,从电源点分别引出多条线到各个负载,避免串联供电导致的压降累积。
  3. 去耦电容就近放置:每个 IC 的电源引脚附近都应该放置去耦电容(通常是 0.1μF 和 10μF),并且电容要尽可能靠近 IC 引脚。

地线布线原则:

  1. 单点接地:对于混合信号电路,模拟地和数字地应该分开布线,最后在电源入口处单点连接。
  2. 地平面:在多层板中,建议使用一整层作为地平面,这样可以提供最低阻抗的回流路径。
  3. 避免地线环路:地线不要形成环路,否则可能产生电磁干扰。

下面是一个 STM32 的电源去耦电容放置示例代码(虽然这是硬件设计,但我们可以在初始化代码中体现对电源的重视):

// STM32 HAL库初始化代码示例
void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
​
    // 配置电源调节器输出电压
    __HAL_RCC_PWR_CLK_ENABLE();
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
​
    // 初始化HSE和PLL
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLM = 8;
    RCC_OscInitStruct.PLL.PLLN = 336;
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    RCC_OscInitStruct.PLL.PLLQ = 7;
    
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        Error_Handler();
    }
​
    // 配置系统时钟
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
                                | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
​
    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
    {
        Error_Handler();
    }
}

在 PCB 设计中,对应这段代码的硬件布局应该是:HSE 晶振紧靠 MCU 的 OSC 引脚,电源去耦电容紧靠 VDD 引脚,这样才能保证时钟和电源的稳定性。

3.2 高速信号布线

对于高速信号(如时钟信号、高速数据总线),布线时需要特别注意信号完整性问题。

高速信号布线原则:

  1. 等长布线:差分信号对和并行总线应该保持等长,以避免信号到达时间不一致导致的时序问题。
  2. 阻抗控制:高速信号线需要进行阻抗匹配,常见的特征阻抗有 50Ω(单端)和 100Ω(差分)。
  3. 避免直角拐弯:高速信号线拐弯时应该使用 45 度或圆弧拐弯,避免 90 度直角拐弯产生信号反射。
  4. 参考平面连续:高速信号线下方应该有连续的参考平面(地平面或电源平面),换层时要在换层点附近打地过孔。

3.3 差分信号布线

差分信号(如 USB、CAN、以太网)具有良好的抗干扰能力,但布线时需要遵循特定规则:

  1. 紧密耦合:差分对的两根线应该紧密平行走线,间距通常为线宽的 2-3 倍。
  2. 等长匹配:差分对内部长度差应该控制在 5mil 以内。
  3. 避免分离:差分对不要分开走线,要保持平行。
  4. 对称布线:差分对周围的环境应该尽量对称。

下面是一个 STM32 的 CAN 总线初始化代码示例:

// CAN总线初始化
void MX_CAN1_Init(void)
{
    hcan1.Instance = CAN1;
    hcan1.Init.Prescaler = 6;  // 时钟分频
    hcan1.Init.Mode = CAN_MODE_NORMAL;
    hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
    hcan1.Init.TimeSeg1 = CAN_BS1_13TQ;
    hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;
    hcan1.Init.TimeTriggeredMode = DISABLE;
    hcan1.Init.AutoBusOff = ENABLE;
    hcan1.Init.AutoWakeUp = DISABLE;
    hcan1.Init.AutoRetransmission = ENABLE;
    hcan1.Init.ReceiveFifoLocked = DISABLE;
    hcan1.Init.TransmitFifoPriority = DISABLE;
    
    if (HAL_CAN_Init(&hcan1) != HAL_OK)
    {
        Error_Handler();
    }
    
    // 配置CAN过滤器
    CAN_FilterTypeDef sFilterConfig;
    sFilterConfig.FilterBank = 0;
    sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
    sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
    sFilterConfig.FilterIdHigh = 0x0000;
    sFilterConfig.FilterIdLow = 0x0000;
    sFilterConfig.FilterMaskIdHigh = 0x0000;
    sFilterConfig.FilterMaskIdLow = 0x0000;
    sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
    sFilterConfig.FilterActivation = ENABLE;
    
    if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
    {
        Error_Handler();
    }
    
    // 启动CAN
    if (HAL_CAN_Start(&hcan1) != HAL_OK)
    {
        Error_Handler();
    }
}

在 PCB 布线时,CAN_H 和 CAN_L 这两根差分信号线必须紧密平行布线,并且要远离高频干扰源,同时在总线末端要放置 120Ω 终端电阻。

3.4 模拟信号布线

模拟信号对噪声非常敏感,布线时要格外小心:

  1. 远离数字信号:模拟信号线要远离高速数字信号和时钟信号。
  2. 缩短走线长度:模拟信号线应该尽可能短,减少拾取噪声的机会。
  3. 屏蔽保护:对于敏感的模拟信号,可以在两侧布置地线进行屏蔽。
  4. 单独地平面:模拟地和数字地应该分开,最后单点连接。

4. PCB 设计中的常见问题和解决方案

4.1 电磁干扰(EMI)问题

电磁干扰是 PCB 设计中最常见的问题之一。在我做汽车电子项目时,产品必须通过严格的 EMC 测试,这就要求 PCB 设计时必须充分考虑 EMI 抑制。

EMI 抑制方法:

  1. 增加去耦电容:在电源入口和每个 IC 的电源引脚处增加去耦电容。
  2. 使用地平面:完整的地平面可以有效降低 EMI。
  3. 控制时钟信号:时钟信号是主要的 EMI 源,应该使用地线包围或屏蔽。
  4. 降低信号边沿速度:在满足时序要求的前提下,适当降低信号的上升/下降时间。

4.2 信号完整性问题

信号完整性问题通常表现为信号失真、振铃、串扰等。

改善信号完整性的方法:

  1. 阻抗匹配:在信号源端或接收端增加匹配电阻。
  2. 减少过孔:高速信号换层时尽量减少过孔数量。
  3. 控制走线长度:关键信号的走线长度应该控制在合理范围内。
  4. 增加参考平面:保证信号线下方有连续的参考平面。

4.3 热设计问题

在我之前提到的那个车载控制器项目中,热设计问题差点导致项目延期。后来我们采取了以下措施:

  1. 增加散热铜皮:在功率器件下方铺设大面积铜皮,并通过过孔连接到其他层。
  2. 使用热过孔:在发热器件下方打多个过孔,将热量传导到其他层。
  3. 预留散热片位置:为大功率器件预留散热片安装位置。
  4. 优化元器件布局:将发热器件分散布置,避免热量集中。

5. PCB 设计工具和实践建议

5.1 常用 PCB 设计工具

市面上有很多优秀的 PCB 设计工具,各有特点:

  1. Altium Designer:功能强大,业界标准,但价格较贵。
  2. KiCad:开源免费,功能完善,适合个人和小团队。
  3. EAGLE:易于上手,有免费版本,适合初学者。
  4. Cadence Allegro:高端工具,适合复杂的高速 PCB 设计。

我个人最常用的是 Altium Designer,它的 3D 可视化功能和强大的规则检查功能让我受益匪浅。

5.2 实践建议

基于多年的实践经验,我给大家几点建议:

  1. 多学习参考设计:芯片厂商通常会提供参考设计,这些都是经过验证的优秀设计,值得学习。
  2. 重视设计规则检查:在提交 PCB 制造之前,一定要仔细检查 DRC 报告,确保没有错误。
  3. 做好版本管理:PCB 设计文件要做好版本管理,记录每次修改的内容。
  4. 多与硬件工程师交流:如果团队中有专业的硬件工程师,要多向他们请教,学习他们的经验。
  5. 重视首板调试:第一版 PCB 回来后,要认真调试,记录问题,为下一版改进提供依据。

在我的职业生涯中,PCB 设计能力的提升是一个循序渐进的过程。

从最初的简单单片机板,到后来的复杂多层板,每一次设计都是一次学习的机会。

记得有一次,我设计的一块板子因为地线布局不合理,导致 ADC 采样值波动很大,后来通过重新布局地线,问题才得以解决。

这些经验教训都是宝贵的财富。

PCB 设计和布局是一门需要理论知识和实践经验相结合的技术。

希望今天的分享能够帮助大家在 PCB 设计的道路上少走弯路,设计出更加优秀的产品。

如果大家在实际项目中遇到 PCB 设计方面的问题,欢迎交流讨论!

更多编程学习资源