前言

芯片就像机械中的标准件一样,是有尺寸标准的,那这就特别适合用参数化的方式来创建三维模型。针对常见的封装建立参数化的模型,那就是分分钟给嘉立创补全芯片的3D模型。

参数化建模也不是一个多新的技术了,我上大学那会就在课本里学各种参数化建模,只是那会还鲜有软件支持。但是这几年,像FreeCAD这样的开源软件都支持参数化建模了。不过这次我要分享的是更轻量级的OpenSCAD,OpenSCAD采用的是一种更简单更容易理解的建模方式——CSG,简单来说就是把基础的几何体,比如立方体,圆柱等做加减操作来创建新的几何体。CSG的好处就是直观易懂,而OpenSCAD提供了编程语言来实现对基础几何体的运算,这让参数化建模更容易实现,甚至可以脱离软件独立、批量运行了。

今天就来分享一下我是如何用OpenSCAD来实现SOP封装芯片的参数化建模的。

建模规划

CSG建模有一些天然的劣势,会大大增加建模的工作量。举一个简单的例子——倒角,比如要对一个立方体A的顶面做倒角,在一般的CAD软件里太简单了。但CSG建模就需要针对每一条边做一个立方体B,先旋转B形成一个倒角角度,然后移动B到合适的位置,最后用A减去B,这样就完成了。所以我们建模之前得先分析一下模型尽量的简化模型创建步骤。

以上图的SOP16封装的芯片为例,来分析一下核心就是芯片本体和引脚的组合,首先是芯片本体部分,是有倒角的(严格来说不是倒角,应该是拔模),如果按照常规倒角的思路去做的话就会很麻烦了。我们可以换个思路,先把芯片一分为二,分成上半部分和下半部分,那下半部分可以看出是上半部分的镜像,而上半部分可以当作是一个下大上小的梯台,在OpenSCAD里可以采用hull操作把底面和顶面组合成一个梯台,这样就简单多了。如下图所示:

引脚的部分也有点复杂,引脚是属于Z字行,而且有一定的角度,还有弯折部分的弧度,因为不是精确建模,弯折部分的弧度就不做了,实在是在OpenSCAD里实现过于麻烦了。这如果要精准建模的话,我理解应该是用引脚的横截面按Z字路径去做扫描。虽然OpenSCAD也提供了扫描、旋转,但是没法直接按路径去扫描。为了简单建模,直接把引脚要分成三段,底,中,上。中间竖向那一部分位置得利用三角函数做运算,算是模型中最复杂的计算了。。。不过中间部分也取巧了一下,直接用hull操作连接了顶、底的两个端面,也就是A、B,注意A、B是单独建的两个方块。

代码实现

OpenSCAD中编程语言与其他语言相比还是简陋了一些,有一些代码是不得已而为之。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
$fn=100;
// ----------------------------
// 芯片尺寸
// ----------------------------
PINS = 16; // 引脚数量
LS = 6.0; // 引脚跨度
BL = 10.0; // 本体长度
BW = 3.9; // 本体宽度
BH = 1.55; // 本体高度
PL = 0.5; // 引脚长度
PW = 0.45; // 引脚宽度
PH = 0.2; // 引脚厚度
PP = 1.27; // 引脚间距
P1 = 0; // 1号引脚位置,0左上,1右上,2右下,3左下
CC = 0.2; // 芯片倒角

// ----------------------------
// 渲染颜色
// ----------------------------
PIN_COLOR = "#CCCCCC"; // 引脚颜色
BODY_COLOR = "#222222"; // 芯片主体颜色
DOT_COLOR = "#EEEEEE"; // 1号引脚指示颜色

module pins() {
module pin() {
xx = 0.1;
module pin_cube() {
cube([xx, PW, PH]);
}

dx1 = PL - xx;
dx2 = PL + (BH/2 - PH/2)/tan(80);
w3 = (LS - BW) / 2 - dx2;
dz = BH/2 - PH/2;

color(PIN_COLOR)
union() {
cube([PL, PW, PH]);
hull() {
translate([dx1, 0, 0])
pin_cube();

translate([dx2, 0, dz])
pin_cube();
}
translate([dx2, 0, dz])
cube([w3, PW, PH]);
}
}


module left_pins() {
for (i = [0:PINS/2-1]) {
translate([0, i * PP, 0])
pin();
}
}

module right_pins() {

// Y方向偏移
translate([LS, 0, 0])
mirror([1,0,0])
left_pins();
}

dy = (BL - (PINS/2 - 1)*PP - PW)/2;
translate([0, dy, 0])
left_pins();
translate([0, dy, 0])
right_pins();
}

module body() {
// Z方向平面高度
hz = PH/2;

// 先实现顶部
module top() {
color(BODY_COLOR)
hull() {
cube([BW, BL, hz]);

translate([CC, CC, BH/2-hz])
cube([BW-2*CC, BL-2*CC, hz]);
}
}

// 底部直接镜像顶部
module bottom() {
mirror([0, 0, 1])
top();
}

// 实现引脚指示,可以指定位置
module dot() {
// X方向上的边距
mx = CC + 0.4;
// Y方向上的边距
my = (BL - (PINS/2 - 1)*PP - PW);
// 左上,右上,右下,左下的X偏移
function tran_x() = [mx, BW-mx, BW-mx, mx];
// 左上,右上,右下,左下的Y偏移
function tran_y() = [BL-my, BL-my, my, my];
// 根据位置计算偏移距离
function dot_tran(i) = [tran_x()[i], tran_y()[i], BH-0.1];

color(DOT_COLOR)
translate(dot_tran(P1))
cylinder(h=1, d=0.4);
}

// 组合,先合并顶、底,然后减引脚指示圆点
difference() {
translate([0, 0, BH/2])
union() {
top();
bottom();
}
dot();
}
}

// 最终合体
module sop() {
union() {
// 引脚
pins();

// 芯片
translate([(LS-BW)/2, 0, 0])
body();
}
}
// 调用芯片渲染
sop();

参数说明

代码中定义的参数完全是按照嘉立创中封装向导中的参数命名的,可以按下图对照使用。

所以,只要根据芯片的具体参数直接修改一下就可以生成模型了。效果图如下:

因为现在最新版本的OpenSCAD直接支持通过定制面板改参数,所以基本上点点鼠标就可以了。下图中红框部分就可以直接修改参数了。

模型使用

因为嘉立创只能导入step格式,而OpenSCAD无法直接导出step,经过我的实验发现只能通过FreeCAD中转一下,这就稍微增加了一下操作复杂性。

首先在OpenSCAD中导出CSG,颜色信息也会同步导出,然后在FreeCAD中打开导出的CSG文件,再把CSG中的union导出为step格式,就可以在嘉立创中使用了。

模型效果

在PCB的3D渲染中,芯片的模型效果还是不错的。这样就不怕用的芯片没有3D模型了。