几何尺寸与公差论坛

 找回密码
 注册
查看: 1346|回复: 8

什么是晶圆的共面度

  [复制链接]
发表于 2023-2-11 15:38:15 | 显示全部楼层 |阅读模式
晶圆的共面度是指晶圆上所有bump(即电连接点)所在的平面的共面程度,也可以理解为这些点在三维空间中的分布是否处于同一平面上。通常,共面度的值越接近1,说明这些bump的分布越接近于一个平面。共面度通常用于检查晶圆制造过程中bump的加工质量,以及检测晶圆表面的平整度。
 楼主| 发表于 2023-2-11 15:39:52 | 显示全部楼层
继续,共面度和三坐标检测里的平面度有啥区别?
共面度和平面度都涉及到了平面的概念,但它们的应用场景和计算方法有所不同。

共面度主要用于晶圆加工和检测,是指晶圆上的所有bump是否在同一个平面上,通常使用测量方法计算。

平面度通常是在三坐标测量中使用的概念,是指一个平面与某个参考平面之间的最小距离,用来衡量该平面的平整度。计算平面度通常需要进行三坐标测量,得到平面的三维坐标数据,然后根据计算公式进行计算。

虽然这两个概念都与平面有关,但是它们的计算方法和应用场景有所不同。
 楼主| 发表于 2023-2-11 15:46:48 | 显示全部楼层
继续,用c#代码计算晶圆的最小二乘法的共面度和三坐标检测里的平面度
 楼主| 发表于 2023-2-11 15:47:08 | 显示全部楼层
计算晶圆最小二乘法共面度可以使用数学库中的线性回归方法。下面是一个使用 C# Math.NET Numerics 库进行晶圆最小二乘法共面度计算的示例代码:
using MathNet.Numerics.LinearRegression;

public static double CalculateFlatness(double[][] data)
{
    // 将 x 和 y 坐标分离为两个数组
    double[] xData = data.Select(p => p[0]).ToArray();
    double[] yData = data.Select(p => p[1]).ToArray();

    // 执行线性回归计算最小二乘法拟合直线
    Tuple<double, double> regression = SimpleRegression.Fit(xData, yData);

    // 计算拟合直线的残差平方和
    double residuals = 0;
    for (int i = 0; i < data.Length; i++)
    {
        double yPredicted = regression.Item1 * data[i][0] + regression.Item2;
        residuals += Math.Pow(yPredicted - data[i][1], 2);
    }

    // 计算标准差
    double standardDeviation = Math.Sqrt(residuals / (data.Length - 2));

    // 计算共面度
    double flatness = standardDeviation / Math.Sqrt(data.Sum(p => Math.Pow(p[1], 2)) / data.Length);

    return flatness;
}
 楼主| 发表于 2023-2-11 15:47:27 | 显示全部楼层
上述代码中,data 是一个二维数组,包含了晶圆的所有坐标数据。代码首先将 data 中的 x 和 y 坐标分离为两个数组,然后使用 SimpleRegression.Fit 方法计算最小二乘法拟合直线。接着,代码计算拟合直线的残差平方和,并使用该值计算标准差。最后,代码根据标准差计算晶圆的最小二乘法共面度。
 楼主| 发表于 2023-2-11 15:48:01 | 显示全部楼层
续,用c#代码和最小二乘法计算晶圆共面度,计算要越快越好
 楼主| 发表于 2023-2-11 15:49:21 | 显示全部楼层
使用C#计算晶圆的最小二乘法共面度可以采用矩阵运算,具体步骤如下:

    首先将所有待测点的坐标存储到一个二维数组中,假设该数组为 points,其中每一行代表一个点,每一列代表一个坐标轴。

    为了方便计算,需要将每个点的坐标都减去一个基准点的坐标,以确保所有点都处于同一坐标系下。假设选择第一个点为基准点,则需要执行以下代码:
double[] baseCoord = new double[] { points[0, 0], points[0, 1], points[0, 2] };

for (int i = 0; i < points.GetLength(0); i++)
{
    points[i, 0] -= baseCoord[0];
    points[i, 1] -= baseCoord[1];
    points[i, 2] -= baseCoord[2];
}
然后,将点集中的所有点看作是一组多元一次方程,使用最小二乘法来求解该方程组的最优解,即平面法向量。设该平面法向量为 (a, b, c),则可以得到如下代码:
int numPoints = points.GetLength(0);

// 构造矩阵 A 和向量 b
double[,] A = new double[numPoints, 3];
double[] b = new double[numPoints];

for (int i = 0; i < numPoints; i++)
{
    A[i, 0] = points[i, 0];
    A[i, 1] = points[i, 1];
    A[i, 2] = 1;
    b[i] = -points[i, 2];
}

// 使用最小二乘法求解矩阵 A 和向量 b
double[,] AT = Matrix.Transpose(A);
double[,] ATA = Matrix.Multiply(AT, A);
double[] ATb = Matrix.Multiply(AT, b);
double[] x = Matrix.Solve(ATA, ATb);

// 计算平面法向量
double a = x[0];
double b = x[1];
double c = 1;
double norm = Math.Sqrt(a * a + b * b + c * c);
a /= norm;
b /= norm;
c /= norm;
最终得到的 (a, b, c) 即为晶圆的法向量,其共面度可以定义为所有点到该平面的距离平方和的平均值。
 楼主| 发表于 2023-2-11 15:51:57 | 显示全部楼层
继续,用c#计算所有点到该平面的距离平方和的平均值。
假设已经得到了晶圆平面的法向量 $n$ 和一个过该平面的点 $P_0$,以及晶圆上的一系列点 $p_1, p_2, \ldots, p_n$,可以使用以下代码计算所有点到该平面的距离平方和的平均值:
public static double CalculateMeanSquaredDistanceToPlane(Vector3D normal, Point3D pointOnPlane, IEnumerable<Point3D> points)
{
    int count = 0;
    double sumSquaredDistance = 0.0;

    foreach (Point3D point in points)
    {
        double distance = DistanceToPlane(normal, pointOnPlane, point);
        sumSquaredDistance += distance * distance;
        count++;
    }

    if (count > 0)
    {
        return sumSquaredDistance / count;
    }
    else
    {
        return 0.0;
    }
}

public static double DistanceToPlane(Vector3D normal, Point3D pointOnPlane, Point3D point)
{
    return Vector3D.DotProduct(normal, point - pointOnPlane);
}
其中 Vector3D 和 Point3D 是 System.Windows.Media.Media3D 命名空间中的类,分别表示三维向量和点。可以使用 NuGet 包管理器将 WPF 依赖项注入到项目中以使用这些类。

这里的 CalculateMeanSquaredDistanceToPlane 方法接受平面法向量 normal、平面上的一个点 pointOnPlane 和晶圆上的一系列点 points 作为参数。它使用 DistanceToPlane 方法计算每个点到该平面的距离,将这些距离的平方加起来并计算平均值。

DistanceToPlane 方法接受平面法向量 normal、平面上的一个点 pointOnPlane 和一个点 point 作为参数。它计算点 point 到该平面的距离,即点 point 到平面上一点到点 point 的向量在平面法向量上的投影长度。
 楼主| 发表于 2023-2-11 15:55:58 | 显示全部楼层
继续,用c#代码和最小二乘法和egien库计算晶圆共面度,计算要越快越好
使用Eigen库进行计算可以大大提高计算速度。下面是使用C#和Eigen库计算晶圆共面度的示例代码:
using System;
using EigenSharp;

public static double CalcWaferCoplanarity(VectorXd X, VectorXd Y, VectorXd Z)
{
    int n = X.Size;
    MatrixXd A = new MatrixXd(n, 3);
    VectorXd b = new VectorXd(n);
    for (int i = 0; i < n; i++)
    {
        A[i, 0] = X[i];
        A[i, 1] = Y[i];
        A[i, 2] = 1.0;
        b[i] = Z[i];
    }

    Vector3d solution = A.BdcSvd().Solve(b);
    double a = solution[0];
    double b = solution[1];
    double c = solution[2];

    double sumOfDistSquared = 0.0;
    for (int i = 0; i < n; i++)
    {
        double dist = a * X[i] + b * Y[i] + c - Z[i];
        sumOfDistSquared += dist * dist;
    }
    double RMS = Math.Sqrt(sumOfDistSquared / n);

    return RMS;
}
其中,使用了EigenSharp库中的MatrixXd和VectorXd来表示矩阵和向量,以及BdcSvd()函数进行奇异值分解。函数CalcWaferCoplanarity接收三个VectorXd类型的参数X、Y和Z,分别代表晶圆上点的横坐标、纵坐标和高度,返回晶圆的共面度(均方根误差)。在函数内部,首先将输入的三个向量转换为矩阵形式,并调用BdcSvd()函数进行奇异值分解求解最小二乘解。然后计算每个点到该平面的距离平方和的平均值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-4-26 19:42 , Processed in 0.037506 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表