AIDT 온디바이스 STEM 나노계측 원자간력현미경(AFM) 피크포스 탭핑(PeakForce Tapping) 정량적 나노역학(QNM) 탄성계수 서보 제어기

서브-레조넌스 2kHz Z-피에조 탭핑 피크 접촉력 일정 제어, DMT/Sneddon 모델 영률(Young's Modulus) 및 부착력 실시간 매핑, 10,000Hz C# 엔진

1. 개요

생체 고분자, 배터리 고체 전해질 계면(SEI), 차세대 반도체 저유전율(Low-k) 박막의 나노스케일 표면 지형과 기계적 물성을 동시 측정하는 표준 기술은 피크포스 탭핑(PeakForce Tapping QNM)입니다. 기존 공진형 탭핑 모드는 캔틸레버의 높은 Q-인자로 인해 팁-시료 간 접촉력이 수 나노뉴턴 이상으로 급격히 증가하여 부드러운 시료를 손상시키는 문제가 있습니다. 반면, 피크포스 탭핑은 캔틸레버 공진 주파수보다 훨씬 낮은 비공진 영역(1~4kHz)에서 Z-피에조를 정현파로 구동하며, 탐침이 시료에 접촉하는 순간의 최대 인가 하중인 피크 접촉력(Peak Force)을 수십 피코뉴턴(pN) 단위로 직접 측정하여 정밀 폐루프 제어합니다. 매 탭핑 주기마다 얻어지는 힘-거리 곡선(Force-Distance Curve)으로부터 DMT 접촉역학 모델을 역산하여 국소 영률(Young's Modulus), 점탄성 소산 에너지, 부착력(Adhesion)을 원자 수준 분해능으로 추출합니다. 본 고에서는 10,000Hz 주기로 피크포스 에러를 보정하고 탄성계수를 실시간 산출하는 0-Alloc C# 엔진을 구현합니다.

2. 수학적 모델링 및 지배 방정식

서브-레조넌스 정현파 Z-피에조 변위 구동 방정식은 다음과 같습니다:

\[ Z_{piezo}(t) = Z_{dc} + A_{mod} \cos(2\pi f_{mod} t) \]

팁-시료 접촉 시 캔틸레버 편향력(Deflection Force) 및 피크 접촉력 검출식은 다음과 같습니다:

\[ F(t) = k_c \left( d(t) - d_{base} \right) \implies F_{peak} = \max_{t \in T_{mod}} F(t) \]

데르야긴-뮬러-토포로프(DMT: Derjaguin-Muller-Toporov) 접촉역학 모델에 따른 압입 깊이 \(\delta\)와 힘의 관계식은 다음과 같습니다:

\[ F(t) - F_{adh} = \frac{4}{3} E^* \sqrt{R_{tip}} \cdot \delta(t)^{3/2}, \quad \frac{1}{E^*} = \frac{1 - \nu_s^2}{E_s} + \frac{1 - \nu_t^2}{E_t} \]

피크 접촉력을 목표 설정값 \(F_{setpoint}\)로 고정하기 위한 Z-피에조 서보 피드백 방정식은 다음과 같습니다:

\[ Z_{dc}^{cmd}(t) = Z_{dc}(t - \Delta t) + K_p (F_{peak} - F_{setpoint}) + K_i \int (F_{peak} - F_{setpoint}) dt \]

3. 실시간 C# 서보 제어기 구현

다음은 고속 포토다이오드 편향 신호로부터 탭핑 주기마다 피크 포스를 래치하고 DMT 영률을 연산하여 Z-피에조 전압을 갱신하는 0-Alloc C# 엔진 구현체입니다:

PeakForceQnmModulusServoEngine.cs
using System;
using System.Runtime.CompilerServices;

namespace ZeliDesk.Stem.PeakForceQnm
{
    public readonly ref struct PeakForceSensorFrame
    {
        public readonly double InstantaneousDeflectionVolts;
        public readonly double CantileverSpringConstantNPerM;
        public readonly double TipRadiusNanometers;
        public readonly double DeflectionSensitivityNmPerVolt;
        public readonly double PeakForceSetpointPicoNewtons;

        public PeakForceSensorFrame(
            double instantaneousDeflectionVolts,
            double cantileverSpringConstantNPerM,
            double tipRadiusNanometers,
            double deflectionSensitivityNmPerVolt,
            double peakForceSetpointPicoNewtons)
        {
            InstantaneousDeflectionVolts = instantaneousDeflectionVolts;
            CantileverSpringConstantNPerM = cantileverSpringConstantNPerM;
            TipRadiusNanometers = tipRadiusNanometers;
            DeflectionSensitivityNmPerVolt = deflectionSensitivityNmPerVolt;
            PeakForceSetpointPicoNewtons = peakForceSetpointPicoNewtons;
        }
    }

    public ref struct PeakForceControlCommand
    {
        public double CommandedZPiezoVoltageVolts;
        public double ExtractedYoungsModulusGpa;
        public double MeasuredPeakForcePicoNewtons;
        public bool IsPeakForceLocked;
        public bool IsSampleDamageSafe;
    }

    public ref struct PeakForceQnmModulusServoEngine
    {
        private const double BaseZPiezoVolts = 50.0;
        private readonly double _kpZ;
        private readonly double _kiZ;
        private readonly double _dt;
        private double _forceErrorIntegral;
        private double _maxDeflectionInCycle;
        private double _minDeflectionInCycle;
        private int _sampleCountInCycle;

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public PeakForceQnmModulusServoEngine(double kpZ, double kiZ, double dt)
        {
            _kpZ = kpZ;
            _kiZ = kiZ;
            _dt = dt;
            _forceErrorIntegral = 0.0;
            _maxDeflectionInCycle = -1e9;
            _minDeflectionInCycle = 1e9;
            _sampleCountInCycle = 0;
        }

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void ComputePeakForceServo(in PeakForceSensorFrame frame, out PeakForceControlCommand cmd)
        {
            cmd = default;
            double deflVolts = frame.InstantaneousDeflectionVolts;
            if (deflVolts > _maxDeflectionInCycle) _maxDeflectionInCycle = deflVolts;
            if (deflVolts < _minDeflectionInCycle) _minDeflectionInCycle = deflVolts;

            _sampleCountInCycle++;

            // Assuming 2kHz tapping: 5 samples at 10kHz loop is 1 half-cycle
            double currentPeakForcePn = _maxDeflectionInCycle * frame.DeflectionSensitivityNmPerVolt * frame.CantileverSpringConstantNPerM * 1000.0;
            double adhesionForcePn = Math.Abs(_minDeflectionInCycle) * frame.DeflectionSensitivityNmPerVolt * frame.CantileverSpringConstantNPerM * 1000.0;

            double forceErr = currentPeakForcePn - frame.PeakForceSetpointPicoNewtons;
            _forceErrorIntegral += forceErr * _dt;
            _forceErrorIntegral = Math.Clamp(_forceErrorIntegral, -500.0, 500.0);

            // Z-piezo retraction servo
            double deltaZ = (_kpZ * forceErr) + (_kiZ * _forceErrorIntegral);
            double commandedZVolts = Math.Clamp(BaseZPiezoVolts - deltaZ * 0.01, 0.0, 100.0);

            // DMT Young's Modulus extraction (approximate analytical fit)
            double rTipMeters = frame.TipRadiusNanometers * 1e-9;
            double indDepthNm = Math.Max(0.1, _maxDeflectionInCycle * frame.DeflectionSensitivityNmPerVolt * 0.5);
            double indDepthMeters = indDepthNm * 1e-9;
            double netForceN = Math.Max(1e-12, (currentPeakForcePn + adhesionForcePn) * 1e-12);

            // E* = (3/4) * F_net / (sqrt(R) * delta^(1.5))
            double eReducedPa = (0.75 * netForceN) / (Math.Sqrt(rTipMeters) * Math.Pow(indDepthMeters, 1.5));
            double eGpa = Math.Clamp(eReducedPa * 1e-9, 0.01, 200.0);

            if (_sampleCountInCycle >= 5)
            {
                _maxDeflectionInCycle = -1e9;
                _minDeflectionInCycle = 1e9;
                _sampleCountInCycle = 0;
            }

            cmd.CommandedZPiezoVoltageVolts = commandedZVolts;
            cmd.ExtractedYoungsModulusGpa = eGpa;
            cmd.MeasuredPeakForcePicoNewtons = currentPeakForcePn;
            cmd.IsPeakForceLocked = Math.Abs(forceErr) <= 50.0; // Within 50 pN
            cmd.IsSampleDamageSafe = currentPeakForcePn <= 500.0; // Under 500 pN gentle contact
        }
    }
}

4. 교육 및 실무 적용 방안

  • 한국방송통신대학교 나노재료/생체공학: 팁-시료 접촉역학(DMT/JKR), 피크포스 정량적 나노역학 매핑 가상실험 교구.
  • 삼성SDI / LG에너지솔루션 배터리 연구소: 차세대 전고체 전지 고체전해질 계면(SEI) 나노 탄성계수 분석기 실장.