MIT Advanced Energy Materials Lab
Chris Harris
26 Nov 1985


Introduction


This program calculates an overall change in the radius of curvature to determine stress in an amorphous Si film grown by laser-induced chemical vapor deposition (LICVD). The film is deposited on a thin quartz substrate which will bend according to the level of stress it receives. In order to calculate stress, one takes a pregrowth curvature measurement, then a postgrowth curvature profile, obtaining a net curvature difference. Curvature is measured by bouncing a HeNe laser beam off the surface of the substrate and projecting the beam on a wall with a mirror.

You scan the HeNe beam over fixed points along an axis of the substrate to establish an initial curvature, then return to those same points after growth to resolve a final curvature, based on the displacement of points on the wall. Program input accepts horizontal position and displacement of points projected on the wall. From there, it does a linear regression between position and displacement, delivering a slope, a, along with a y-intercept, b, which the compiler recognizes, never gets used. After substrate and height parameters are taken into consideration, stress emerges. Curvature change can appear in positive or negative ways, depending on whether the film stress acts in a tensile(+) or compressive(-) manner.


Pascal Code


stress.pas:

program stress (input, output);
  const
    mi = 1;
    h = 467 { cm };
    es = 7E11 { dyne/cm^2 };
    ts = 0.015 { cm };
    vs = 0.17;
  type
    dim = array [1..100] of real;
  var
    pos, disp : dim;
    mc, r, sigma, d : real;
    i, n : integer;
  procedure indata;
    begin
      write('What was the film thickness [cm] ? ');
      readln(d);
      writeln;
      write('How many data points ? ');
      readln(n);
      writeln;
      writeln('Enter pos(i), then disp(i):');
      for i := 1 to n do
        readln(pos[i], disp[i]);
    end; { indata }
  procedure outdata;
    begin
      writeln;
      writeln('mc    = ',mc);
      writeln('r     = ',r,' cm');
      writeln('sigma = ',sigma,' dyne/cm^2');
    end; { outdata }
  function slope (var x, y : dim; var n : integer) : real;
    var
      sx, sy, s1, s2, a, b : real;
      i : integer;
    begin
      sx := 0;
      sy := 0;
      s1 := 0;
      s2 := 0;
      for i := 1 to n do
        begin
          sx := sx + x[i]/n;
          sy := sy + y[i]/n;
        end; { for }
      for i := 1 to n do
        begin
          s1 := s1 + y[i]*(x[i] - sx);
          s2 := s2 + sqr(x[i] - sx);
        end; { for }
      a := s1/s2;
      b := sy - a*sx;
      slope := a;
    end; { slope }
  begin
    indata;
    mc := slope(pos,disp,n) - mi;
    r := 2*h/mc;
    sigma := es*sqr(ts)/(1 - sqr(vs))/6/r/d;
    outdata;
  end. { stress }


Results


$ fpc stress.pas

Free Pascal Compiler version 3.0.4 [2018/06/14] for x86_64
Copyright (c) 1993-2017 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling stress.pas
stress.pas(35,26) Note: Local variable "b" is assigned but never used
Linking stress
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?
62 lines compiled, 0.1 sec
1 note(s) issued

$ ./stress

What was the film thickness [cm] ? 1e-4

How many data points ? 4

Enter pos(i), then disp(i):
10      12
11      14
13      15
14      18

mc    =  3.0000000000000004E-001
r     =  3.1133333333333330E+003 cm
sigma =  8.6823988426114276E+007 dyne/cm^2



Figure 1: Screenshot


figure1