How can I make a decent ground plane in Eagle?

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

The "holes" or "islands" that you are seeing are due to the fact that there is no connection that can be made with your current clearance tolerances given the position of traces and pads.

If you move traces to allow the pour to exist between them, within the constraints of your clearance settings, the pour will fill the voids.

Sometimes you may not be able to create a connection in a given area, in which case you may need to stitch them together with vias. On many of my small 2-layer boards, I use a ground pour on both the top and bottom. Where an "island" would be created on the bottom, I use vias to connect it to the same ground potential on the top layer.

You can move traces, vias and components around to prevent most of these islands, but inevitably you will probably have to use additional GND vias to keep them from becoming isolated.

Tags:

Routing

Pcb

Eagle