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-피에조 변위 구동 방정식은 다음과 같습니다:
팁-시료 접촉 시 캔틸레버 편향력(Deflection Force) 및 피크 접촉력 검출식은 다음과 같습니다:
데르야긴-뮬러-토포로프(DMT: Derjaguin-Muller-Toporov) 접촉역학 모델에 따른 압입 깊이 \(\delta\)와 힘의 관계식은 다음과 같습니다:
피크 접촉력을 목표 설정값 \(F_{setpoint}\)로 고정하기 위한 Z-피에조 서보 피드백 방정식은 다음과 같습니다:
3. 실시간 C# 서보 제어기 구현
다음은 고속 포토다이오드 편향 신호로부터 탭핑 주기마다 피크 포스를 래치하고 DMT 영률을 연산하여 Z-피에조 전압을 갱신하는 0-Alloc C# 엔진 구현체입니다:
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) 나노 탄성계수 분석기 실장.