From: Bdale Garbee Date: Sat, 22 Jan 2022 06:57:43 +0000 (-0700) Subject: add first-cut footprint for sam21d qfn package X-Git-Tag: telelco-v3.0~174 X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=9bae15ccdb4c49f5c29e20099b0583824b25ad64;p=hw%2Faltusmetrum add first-cut footprint for sam21d qfn package --- diff --git a/packages/.gitignore b/packages/.gitignore index 61db65c..a88e125 100644 --- a/packages/.gitignore +++ b/packages/.gitignore @@ -141,3 +141,5 @@ DSE0006A.fp U-DFN2020-6-F.fp 711AT.fp PG-TSDSO-14.fp +dualbeeper.fp +vqfn-48.fp diff --git a/packages/Makefile b/packages/Makefile index 8bf4d33..3e243d1 100644 --- a/packages/Makefile +++ b/packages/Makefile @@ -157,7 +157,8 @@ FOOTPRINTS= \ U-DFN2020-6-F.fp \ 711AT.fp \ PG-TSDSO-14.fp \ - dualbeeper.fp + dualbeeper.fp \ + vqfn-48.fp .5c.fp: nickle $*.5c -o $@ diff --git a/packages/vqfn-48.py b/packages/vqfn-48.py new file mode 100755 index 0000000..50c2664 --- /dev/null +++ b/packages/vqfn-48.py @@ -0,0 +1,145 @@ +#!/usr/bin/python2 +# Copyright 2022 by Bdale Garbee . GPLv3 +# +# emit PCB footprint for Atmel VQFN-48 package used by SAM21D +# + +# dimensions in mm from +# atmel/samd21/SAM_D21_DA1_Family_Data_Sheet_DS40001882H-2580554.pdf + +PinWidth = 0.3 # X1 +PinHeight = 0.85 # Y1 +RowSpacing = 6.9 # C1 / C2 +PinSpacing = 0.5 # E +Overall = 7.0 +GndSquare = 5.25 # X2 / Y2 +CoreSquare = 2.1 +PinClearance = 2 * (PinSpacing - PinWidth) + +# ATMEL specifies 120-150 microns between pad and solder mask +# AT88RF1354 Appplication note .. should be good here too? +# +PinResist = PinWidth + (2 * 0.07) + +# 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 '# author: Bdale Garbee' +print '# email: bdale@gag.com' +print '# dist-license: GPL 3' +print '# use-license: unlimited' + +print 'Element[0x0 "vqfn-48" "" "" 0 0 0 0 0 100 0x0]' +print "(" + +## pad under the chip +#print ' Pad[',\ +# mm2mils100(0), \ +# mm2mils100(0), \ +# mm2mils100(0), \ +# mm2mils100(0), \ +# mm2mils100(GndSquare), \ +# mm2mils100(PinClearance), \ +# mm2mils100(PinResist), \ +# '"pin49" "49" "square,nopaste"]' +# +## vias in the ground pad under the chip +#for viarow in range (-1,1): +# for viacol in range (-1,1): +# print ' Pin[',\ +# mm2mils100(1.8 * viacol * CoreSquare / 3 + .9 * CoreSquare/3), \ +# mm2mils100(1.8 * viarow * CoreSquare / 3 + .9 * CoreSquare/3), \ +# 2600, \ +# 2500, \ +# 0, \ +# 1300, \ +# '"pin17" "17" 0x0002]' +# +## break pad under chip into a grid to control the resist and paste masks +# +#blocks=3; +# +#for viarow in range (-1, 2): +# for viacol in range (-1, 2): +# if (viarow in (-1, 1)) and (viacol in (-1, 1)): +# # copper sub-square with resist over vias +# print ' Pad[',\ +# mm2mils100(viacol * CoreSquare / blocks), \ +# mm2mils100(viarow * CoreSquare / blocks), \ +# mm2mils100(viacol * CoreSquare / blocks), \ +# mm2mils100(viarow * CoreSquare / blocks), \ +# mm2mils100((CoreSquare)/blocks), \ +# 0, \ +# 0, \ +# '"pin17" "17" "square,nopaste"]' +# else: +# # copper sub-square without resist +# print ' Pad[',\ +# mm2mils100(viacol * CoreSquare / blocks), \ +# mm2mils100(viarow * CoreSquare / blocks), \ +# mm2mils100(viacol * CoreSquare / blocks), \ +# mm2mils100(viarow * CoreSquare / blocks), \ +# mm2mils100((CoreSquare)/blocks), \ +# 0, \ +# mm2mils100((CoreSquare)/blocks), \ +# '"pin17" "17" "square,nopaste"]' +# # copper spot to control paste mask generation +# print ' Pad[',\ +# mm2mils100(viacol * CoreSquare / blocks), \ +# mm2mils100(viarow * CoreSquare / blocks), \ +# mm2mils100(viacol * CoreSquare / blocks), \ +# mm2mils100(viarow * CoreSquare / blocks), \ +# 1500, \ +# 0, \ +# mm2mils100((CoreSquare)/blocks), \ +# '"pin17" "17" "square"]' + +# pins +for pin in range (1,13): + print ' Pad[',\ + mm2mils100((-6.5 + pin) * PinSpacing), \ + mm2mils100(-RowSpacing/2 - PinHeight/2 + PinWidth/2), \ + mm2mils100((-6.5 + pin) * PinSpacing), \ + mm2mils100(-RowSpacing/2 + PinHeight/2 - PinWidth/2), \ + mm2mils100(PinWidth), \ + mm2mils100(PinClearance), \ + mm2mils100(PinResist), \ + '"pin%i"' % (37-pin), '"%i"' % (37-pin), '0x0000]' + + print ' Pad[',\ + mm2mils100((-6.5 + pin) * PinSpacing), \ + mm2mils100(RowSpacing/2 - PinHeight/2 + PinWidth/2), \ + mm2mils100((-6.5 + pin) * PinSpacing), \ + mm2mils100(RowSpacing/2 + PinHeight/2 - PinWidth/2), \ + mm2mils100(PinWidth), \ + mm2mils100(PinClearance), \ + mm2mils100(PinResist), \ + '"pin%i"' % pin, '"%i"' % pin, '0x0000]' + + print ' Pad[',\ + mm2mils100(-RowSpacing/2 - PinHeight/2 + PinWidth/2), \ + mm2mils100((-6.5 + pin) * PinSpacing), \ + mm2mils100(-RowSpacing/2 + PinHeight/2 - PinWidth/2), \ + mm2mils100((-6.5 + pin) * PinSpacing), \ + mm2mils100(PinWidth), \ + mm2mils100(PinClearance), \ + mm2mils100(PinResist), \ + '"pin%i"' % (36+pin), '"%i"' % (36+pin), '0x0000]' + + print ' Pad[',\ + mm2mils100(RowSpacing/2 - PinHeight/2 + PinWidth/2), \ + mm2mils100((-6.5 + pin) * PinSpacing), \ + mm2mils100(RowSpacing/2 + PinHeight/2 - PinWidth/2), \ + mm2mils100((-6.5 + pin) * PinSpacing), \ + mm2mils100(PinWidth), \ + mm2mils100(PinClearance), \ + mm2mils100(PinResist), \ + '"pin%i"' % (25-pin), '"%i"' % (25-pin), '0x0000]' + +print ' ElementArc[',\ + mm2mils100(-Overall/2 - PinWidth), \ + mm2mils100(Overall/2 + PinWidth), \ + '500 500 0 360 1000 ]' +print ")"