[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: gEDA-user: Footprint with thermal paddle



On Thu, 2009-01-08 at 19:18 -0500, DJ Delorie wrote:
> > I wonder if a couple of overlapping pads would work.
> 
> That's what I did.  One pad for the copper extent, and a set of
> smaller pads to define the paste and mask.  You just have to number
> them all the same.

I recently did a totally whacky one for the TI CC1111F32 RF system on a
chip, which is a QFN36 with mandatory connection to the ground paddle,
for the board I'm about to try loading.  If it works out ok, I'll post
it to gedasymbols.org.  All in all, the footprint has 78 pads and 9 pins
defined... 42 of those pads and all of the pins comprise the ground
paddle under the chip, to achieve the recommended paste and resist
geometries.

Makes for a pretty board and stencil, here's hoping it actually works!

Oh, heck, I'll append the Python script that generates the footprint.
Just be warned not to trust it until I've got a board loaded and turned
on that uses it! 

Bdale


#!/usr/bin/python
# Copyright 2008 by Bdale Garbee <bdale@xxxxxxx>.  GPLv2
#
# Program to emit PCB footprint for QFN36 package used by TI CC1111
#

# dimensions in mm from the TI cc1111f32.pdf datasheet
PinWidth = 0.28		
PinResist = 0.381		# width of gap in solder resist over pad
PinHeight = 0.75
PinSpacing = 0.50
Overall = 6.30
GndSquare = 4.40
CoreSquare = 3.7592		# resist gaps and paste spots over ground tab
PinSquare = 4.80

import sys

# we're going to use the 1/100 of a mil fundamental unit form
def mm2mils100( mm ):
	return int( mm / 25.4 * 1000.0 * 100.0 + 0.5 )

print 'Element[0x0 "QFN36" "" "" 0 0 0 0 0 100 0x0]'
print "("

# pad under the chip, must be grounded
print '   Pad[',\
 	mm2mils100(0), \
	mm2mils100(0), \
 	mm2mils100(0), \
	mm2mils100(0), \
	mm2mils100(GndSquare), \
	0, \
 	0, \
	'"pin37" "37" "square,nopaste"]'

# vias in the ground pad under the chip
for viarow in range (-1,2):
  for viacol in range (-1,2):
    print '   Pin[',\
	mm2mils100(2 * viacol * CoreSquare / 5), \
 	mm2mils100(2 * viarow * CoreSquare / 5), \
	2700, \
	1000, \
  	0, \
  	1500, \
	'"pin37" "37" 0x0002]'

# break pad under chip into a grid to control the resist and paste masks
for viarow in range (-2, 3):
  for viacol in range (-2, 3):
    if (viarow in (-2, 0, 2)) and (viacol in (-2, 0, 2)):
      # copper sub-square with resist over vias
      print '   Pad[',\
	mm2mils100(viacol * CoreSquare / 5), \
 	mm2mils100(viarow * CoreSquare / 5), \
	mm2mils100(viacol * CoreSquare / 5), \
 	mm2mils100(viarow * CoreSquare / 5), \
	mm2mils100((CoreSquare)/5), \
	0, \
 	0, \
	'"pin37" "37" "square,nopaste"]'
    else:
      # copper sub-square without resist
      print '   Pad[',\
	mm2mils100(viacol * CoreSquare / 5), \
 	mm2mils100(viarow * CoreSquare / 5), \
	mm2mils100(viacol * CoreSquare / 5), \
 	mm2mils100(viarow * CoreSquare / 5), \
	mm2mils100((CoreSquare)/5), \
	0, \
	mm2mils100((CoreSquare)/5), \
	'"pin37" "37" "square,nopaste"]'
      # copper spot to control paste mask generation
      print '   Pad[',\
	mm2mils100(viacol * CoreSquare / 5), \
 	mm2mils100(viarow * CoreSquare / 5), \
	mm2mils100(viacol * CoreSquare / 5), \
 	mm2mils100(viarow * CoreSquare / 5), \
  	1500, \
	0, \
	mm2mils100((CoreSquare)/5), \
	'"pin37" "37" "square"]'

# pins
for pin in range (1,10):
    print '   Pad[',\
 	mm2mils100(-2.5 + pin * PinSpacing), \
	mm2mils100(-Overall/2 + PinWidth/2), \
 	mm2mils100(-2.5 + pin * PinSpacing), \
	mm2mils100(-Overall/2 + PinHeight - PinWidth/2), \
	mm2mils100(PinWidth), \
	mm2mils100(PinSpacing - PinWidth), \
	mm2mils100(PinResist), \
	'"pin%i"' % (28-pin), '"%i"' % (28-pin), '0x0000]'

    print '   Pad[',\
 	mm2mils100(-2.5 + pin * PinSpacing), \
	mm2mils100(+Overall/2 - PinHeight + PinWidth/2), \
 	mm2mils100(-2.5 + pin * PinSpacing), \
	mm2mils100(+Overall/2 - PinWidth/2), \
	mm2mils100(PinWidth), \
	mm2mils100(PinSpacing - PinWidth), \
	mm2mils100(PinResist), \
	'"pin%i"' % pin, '"%i"' % pin, '0x0000]'

    print '   Pad[',\
	mm2mils100(Overall/2 - PinHeight + PinWidth/2), \
 	mm2mils100(-2.5 + pin * PinSpacing), \
	mm2mils100(Overall/2 - PinWidth/2), \
 	mm2mils100(-2.5 + pin * PinSpacing), \
	mm2mils100(PinWidth), \
	mm2mils100(PinSpacing - PinWidth), \
	mm2mils100(PinResist), \
	'"pin%i"' % (19-pin), '"%i"' % (19-pin), '0x0000]'

    print '   Pad[',\
	mm2mils100(-Overall/2 + PinWidth/2), \
 	mm2mils100(-2.5 + pin * PinSpacing), \
	mm2mils100(-Overall/2 + PinHeight - PinWidth/2), \
 	mm2mils100(-2.5 + pin * PinSpacing), \
	mm2mils100(PinWidth), \
	mm2mils100(PinSpacing - PinWidth), \
	mm2mils100(PinResist), \
	'"pin%i"' % (27+pin), '"%i"' % (27+pin), '0x0000]'

print '   ElementArc[',\
	mm2mils100(-2.6), \
	mm2mils100(2.6), \
	'500 500 0 360 1000 ]'
print ")"



_______________________________________________
geda-user mailing list
geda-user@xxxxxxxxxxxxxx
http://www.seul.org/cgi-bin/mailman/listinfo/geda-user