Electronic – How to make a decent ground plane in Eagle

eaglepcbrouting

I've made a couple of simple PCBs as a hobbyist, and for the first time now I want to add a ground plane pour but I'm having some issues.

As I have currently understood I need to:

  • Create a polygon along the outline of my board with the polygon tool
  • Rename it to GND
  • Set a clearance
  • Turn on thermals for easier soldering
  • Click on ratsnest after manual/auto routing

The problem is that I'm getting empty spaces after doing an auto-route test and clicking ratsnest and the inner ground planes don't seem to be connected to the outer ones

Image:

enter image description here

What am I doing wrong?

Best Answer

For a simple two-sided board, start by creating a ground polygon on the whole bottom layer. The trick then is to get Eagle to route most of the connections on the top layer. To do this, make the cost of routing within a polygon high and the via cost low. Actually you want to start with parameters more likely to find a solution, then tighten up the requirements over multiple optimization passes.

Before auto-routing, route the critical traces manually, and connect any grounds you can right at the pad to the ground layer. That will cause it not to waste routing space connecting the grounds.

Of course this all has to start with good layout that tries to put connected things near each other and oriented to have as few crossovers as possible.

After the auto-routing, you have to do some manual cleanup. The measure of a ground plane is how small the maximum dimension is of any island. Lots of small islands are better than a few big ones. This means you want the ground plane to flow around every via if possible. Unfortunately Eagle tends to clump vias, even with the hugging parameter set to 0. You can't set it negative, I tried. This means you have to see what the auto-router did and move things around a little to try to break up clumps of vias.

It's mostly about using the auto-router properly and realizing it's a tool, not a substitute for your own brain. If you are expecting fire and forget, you aren't going to get good boards.

Anyway, here is a auto-router control file from one of my 2 layer boards with the bottom layer a ground plane:

[Default]

  RoutingGrid     = 4mil

  ; Trace Parameters:

  tpViaShape      = Round

  ; Preferred Directions:

  PrefDir.1       = *
  PrefDir.2       = 0
  PrefDir.3       = 0
  PrefDir.4       = 0
  PrefDir.5       = 0
  PrefDir.6       = 0
  PrefDir.7       = 0
  PrefDir.8       = 0
  PrefDir.9       = 0
  PrefDir.10      = 0
  PrefDir.11      = 0
  PrefDir.12      = 0
  PrefDir.13      = 0
  PrefDir.14      = 0
  PrefDir.15      = 0
  PrefDir.16      = *

  Active          =    1
  ; Cost Factors:

  cfVia           =   50
  cfNonPref       =    5
  cfChangeDir     =    2
  cfOrthStep      =    2
  cfDiagStep      =    3
  cfExtdStep      =    0
  cfBonusStep     =    1
  cfMalusStep     =    1
  cfPadImpact     =    4
  cfSmdImpact     =    4
  cfBusImpact     =    0
  cfHugging       =    3
  cfAvoid         =    4
  cfPolygon       =   10

  cfBase.1        =    0
  cfBase.2        =    1
  cfBase.3        =    1
  cfBase.4        =    1
  cfBase.5        =    1
  cfBase.6        =    1
  cfBase.7        =    1
  cfBase.8        =    1
  cfBase.9        =    1
  cfBase.10       =    1
  cfBase.11       =    1
  cfBase.12       =    1
  cfBase.13       =    1
  cfBase.14       =    1
  cfBase.15       =    1
  cfBase.16       =    5

  ; Maximum Number of...:

  mnVias          =   20
  mnSegments      = 9999
  mnExtdSteps     = 9999
  mnRipupLevel    =   50
  mnRipupSteps    =  300
  mnRipupTotal    =  500

[Follow-me]

  @Route

  Active          =    1
  cfVia           =    8
  cfBase.16       =    0
  mnRipupLevel    =   10
  mnRipupSteps    =  100
  mnRipupTotal    =  100

[Busses]

  @Route

  Active          =    1
  cfVia           =   10
  cfChangeDir     =    5
  cfBusImpact     =    4
  cfPolygon       =   25
  cfBase.16       =   10
  mnVias          =    0
  mnRipupLevel    =   10
  mnRipupSteps    =  100
  mnRipupTotal    =  100

[Route]

  @Default

  Active          =    1

[Optimize1]

  @Route

  Active          =    1
  cfVia           =   99
  cfNonPref       =    4
  cfChangeDir     =    4
  cfExtdStep      =    1
  cfHugging       =    1
  cfPolygon       =   30
  cfBase.16       =   10
  mnExtdSteps     =   20
  mnRipupLevel    =    0
  mnRipupSteps    =  100
  mnRipupTotal    =  100

[Optimize2]

  @Optimize1

  Active          =    1
  cfNonPref       =    3
  cfChangeDir     =    3
  cfBonusStep     =    2
  cfMalusStep     =    2
  cfPadImpact     =    2
  cfSmdImpact     =    2
  cfHugging       =    0
  cfPolygon       =   40
  mnExtdSteps     =   15

[Optimize3]

  @Optimize2

  Active          =    1
  cfVia           =   80
  cfNonPref       =    2
  cfChangeDir     =    2
  cfPadImpact     =    0
  cfSmdImpact     =    0
  cfPolygon       =   50
  mnExtdSteps     =   10

[Optimize4]

  @Optimize3

  Active          =    1
  cfVia           =   60
  cfNonPref       =    1
  cfPolygon       =   60
  cfBase.16       =   12

[Optimize5]

  @Optimize4

  Active          =    1
  cfVia           =   40
  cfNonPref       =    0
  cfPolygon       =   70
  cfBase.16       =   14
  mnExtdSteps     =    5

[Optimize6]

  @Optimize5

  Active          =    1
  cfVia           =   20
  cfBase.16       =   16

[Optimize7]

  @Optimize6

  Active          =    1
  cfBase.16       =   18

[Optimize8]

  @Optimize7

  Active          =    1
  cfBase.16       =   20