Курсовая работа: Применение автоматизированного адаптивного интерферометра для исследования наносмещений микрообъектов
Рис. 9 Главное диалоговое окно программы «motor control for 8DCMC1»
С помощью данной программы была осуществлена регистрация и синхронизация сигнала, подаваемого на АЦП, с передвижением нано-транслятора, что позволило правильно интерпретировать полученные результаты.
2.4 Экспериментальные результатыПеремещение образцов относительно объектного пучка осуществлялась от реперного кварцевого волокна к исследуемому образцу по направлению Х, как показано на рис. 8.
Экспериментально полученная зависимость амплитуды демодулированного сигнала от положения сканирующего пучка для двух образцов с диаметром 15 мкм и 2 мкм приведена на рис. 10. При этом амплитуда колебаний образца составляла 20 нм.
Рис. 10 Зависимости амплитуды сигнала от положения сканирующего пучка для образцов с диаметром 15 мкм и 2 мкм
Как видно из рис. 10 характер изменения сигнала демодуляции с расстоянием от реперного оптического волокна соответствует прямому оптическому измерению с помощью микроскопа (рис. 7), что подтверждает полученные результаты.
Заключение
Таким образом, в настоящей работе разработана и практически реализована система регистрации малых колебаний микрообъектов с помощью адаптивного интерферометра на основе динамических ортогональных голограмм, формируемых в фоторефрактивном кристалле. Показано что такая система позволяет регистрировать колебания объектов размерами 2 мкм. Создано программное обеспечение для управления нано-позиционерами.
С учетом того, что ортогональная геометрия формирования динамической голограммы в ФРК позволяет создавать поляризационно-независимые схемы адаптивных интерферометров, разработанная измерительная система может быть использована в том числе и для исследования сложных микро- и нано- объектов, взаимодействие излучения с которыми может приводить к полной его деполяризации.
Список литературы
1. B. Ilic, H. G. Craighead, S. Krylov, W. Senaratne, C. Ober, and P. Neuzil. Attogram detection using nanoelectromechanical oscillators // J. Appl. Phys. - 2004 –Vol.95.
2. M. Sato, B. E. Hubbard, L. Q. English, and A. J. Sievers, B. Ilic, D. A. Czaplewski and H. G. Craighead. Study of intrinsic localized vibrational modes in micromechanical oscillator arrays // CHAOS - 2003. –Vol. 13, No.2 – P.702-715.
3. L. Sekaric,a) M. Zalalutdinov, S. W. Turner, A. T. Zehnder, J. M. Parpia, and H. G. Craighead Nanomechanical resonant structures as tunable passive modulators of light // J. Appl. Phys. - 2002 –Vol.80.
4. S. Di Girolamo, A.A.Kamshilin, R.V.Romashko, Yu.N.Kulchin, J.-C.Launay. Fast adaptive interferometer on dynamic reflection hologram in CdTe:V // Optics Express. – 2007. – Vol.15. – No.2. – P.545-555.
5. М. П. Петров, С. И. Степанов, А. В. Хоменко. Фоточувствительные электрооптические среды в голографии и оптической обработке информации. – Л.: Наука Ленингр. отд.-ние. – 1983. – 269 с.
6. A. Ashkin, G. D. Boyd, J. M. Dziedzic, R. G. Smith, A. A. Ballman, J. J. Levinstein, K. Nassau. Optically-induced refractive index inhomogeneities in LiNbO3 and LiTaO3 // Appl. Phys. Lett. – 1966. – V.9. – P.72.
7. P. Gunter, J.-P. Huignard, eds. Photorefractive materials and their applications 2: Materials. – Springer Series in Optical Sciences. – 2007. – V.114. – 646 p.
8. G. Zhang, D. Kip, D. D. Nolte, J. Xu, eds. OSA Trends in Optics and Photonics: Photorefractive Effects, Materials, and Devices. – 2005. – V.99.
9. P. Delaye, C. Denz, L. Mager, G. Montemezzani, eds. OSA Trends in Optics and Photonics: Photorefractive Effects, Materials, and Devices. – 2003. – V.87.
10. В. Л. Винецкий, Н. В. Кухтарев. Динамическая голография. – Киев: Наукова думка. – 1983. – 125 с.
11. Di Girolamo S., Romashko R.V., Kulchin Y.N., Kamshilin A.A. Orthogonal geometry of wave interaction in a photorefractive crystal for linear phase demodulation // Opt. Commun. – 2010. - V.283. - P.128-131.
12. R. V. Romashko, S. Di Girolamo, Y. N. Kulchin, and A. A. Kamshilin. Photorefractive vectorial wave mixingin different geometries// J. Opt. Soc. Am. -2010. -Vol. 27. No. 2. –P. 311-317.
Приложение
Программа «motor control for 8DCMC1»
Данная программа создана в среде MS Visual C++ 6.0 на базе класса MFC. Состоит из двух диалоговых окон: SERIALGATETEST_DIALOG и ABOUTBOX. Реализованы следующие функции:
1. Взаимодействие с COM – портом компьютера. Чтение и запись информации в памяти контроллера 8DCMC1 по средствам интерфейса RS232. Эта функция реализована в виде отдельной библиотеки – SerialGate.dll.
2. Аналог командной строки для управления шаговыми двигателями, содержащий поле ввода и поле вывода.
3. Задание параметров работы шаговых двигателей (скорость, ускорение).
4. 2D-cканирование выбранного участка.
5. Опрос АЦП, запись полученных данных в файл.
Листинг SerialGateTest.cpp:
#include "stdafx.h"
#include "SerialGateTest.h"
#include "SerialGateTestDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
BEGIN_MESSAGE_MAP(CSerialGateTestApp, CWinApp)
//{{AFX_MSG_MAP(CSerialGateTestApp)
//}}AFX_MSG
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
// CSerialGateTestApp construction
CSerialGateTestApp::CSerialGateTestApp()
{
}
CSerialGateTestApp theApp;
// CSerialGateTestApp initialization
BOOL CSerialGateTestApp::InitInstance()
{
AfxEnableControlContainer();
#ifdef _AFXDLL
Enable3dControls();// Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic();// Call this when linking to MFC statically
#endif
CSerialGateTestDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
}
else if (nResponse == IDCANCEL)
{
}
return FALSE;
}
Листинг SerialGateTestDlg.cpp:
#include <stdio.h>
#include <string.h>
#include <string>
#include "stdafx.h"
#include "SerialGateTest.h"
#include "SerialGateTestDlg.h"
#include <windows.h>
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//using System;
int key=0;
//#include "thread.h"
//#include System::Threading;
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSerialGateTestDlg dialog
CSerialGateTestDlg::CSerialGateTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSerialGateTestDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSerialGateTestDlg)
m_port = 5;
m_rate = 9600;
m_recieve = _T("");
m_send = _T("");
m_axsis = _T("");
m_vel = _T("");
m_asel = _T("");
m_gomr = _T("");
m_mraxsis0 = _T("");
m_mraxsis1 = _T("");
m_tapeaxsis0 = _T("");
m_tapeaxsis1 = _T("");
m_dataininput = _T("");
m_dataoutput = _T("");
m_past = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSerialGateTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSerialGateTestDlg)
DDX_Control(pDX, IDC_RECIEVE, m_recievecontr);
DDX_Text(pDX, IDC_PORT, m_port);
DDX_Text(pDX, IDC_RATE, m_rate);
DDX_Text(pDX, IDC_RECIEVE, m_recieve);
DDX_Text(pDX, IDC_SEND, m_send);
DDX_Text(pDX, IDC_SETAXSCIS, m_axsis);
DDX_Text(pDX, IDC_SETVEL, m_vel);
DDX_Text(pDX, IDC_SETASEL, m_asel);
DDX_Text(pDX, IDC_MR, m_gomr);
DDX_Text(pDX, IDC_MRAXSIS0, m_mraxsis0);
DDX_Text(pDX, IDC_MRAXSIS1, m_mraxsis1);
DDX_Text(pDX, IDC_TAPEAXSIS1, m_tapeaxsis1);
DDX_Text(pDX, IDC_DATAEXCHANGE, m_dataininput);
DDX_Text(pDX, IDC_DATAEXCHANGE2, m_dataoutput);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSerialGateTestDlg, CDialog)
//{{AFX_MSG_MAP(CSerialGateTestDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON2, OnOpen)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON1, OnSend)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_ON_SETAXSIS, OnOnSetaxsis)
ON_BN_CLICKED(IDC_ON_SETACSEL, OnOnSetacsel)
ON_BN_CLICKED(IDC_ON_SETVELOS, OnOnSetvelos)
ON_BN_CLICKED(IDC_ON_MOTROON, OnOnMotroon)
ON_BN_CLICKED(IDC_ON_MOTOROFF, OnOnMotoroff)
ON_BN_CLICKED(IDC_ON_MR, OnOnMr)
ON_BN_CLICKED(IDC_ON_GO, OnOnGo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSerialGateTestDlg message handlers
BOOL CSerialGateTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);// Set big icon
SetIcon(m_hIcon, FALSE);// Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CSerialGateTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CSerialGateTestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CSerialGateTestDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CSerialGateTestDlg::OnOpen()
{
// TODO: Add your control notification handler code here
UpdateData(true);
if(m_port == 0 || m_rate == 0)
{
MessageBox("Not correct data","Error", MB_ICONERROR);
return;;
}
bool b = sg.Open(m_port, m_rate);
if(b == false)
{
MessageBox("Can`t open Port","Error", MB_ICONERROR);
return;;
}
else
{
MessageBox("Port open OK","Info", MB_ICONINFORMATION);
}
SetTimer(1, 1000, NULL);
}
void CSerialGateTestDlg::OnTimer(UINT nIDEvent)
{
if (key==0)
{// TODO: Add your message handler code here and/or call default
char buff[128];
int rcv = sg.Recv(buff, sizeof(buff));
this->m_recievecontr.SetWindowText("");
if(rcv > 0)
{
for(int i = 0; i< rcv; i++)
this->m_recieve += buff[i];
UpdateData(false);
}
}
CDialog::OnTimer(nIDEvent);
}
void CSerialGateTestDlg::OnSend()
{
// TODO: Add your control notification handler code here
UpdateData(true);
int len = this->m_send.GetLength();
if(len > 0)
{
char* LocBuf = m_send.GetBuffer(128);
sg.Send(LocBuf, len);
m_send.ReleaseBuffer();
char ent=0x0D;
char* ent2 = &ent;
sg.Send(ent2, 1);
}
}
void CSerialGateTestDlg::OnButton3()
{
UpdateData(true);
int len = this->m_send.GetLength();
if(len > 0)
{
char ent=0x01;
char* ent2 = &ent;
sg.Send(ent2, 1);
char* LocBuf = m_send.GetBuffer(128);
sg.Send(LocBuf, len);
m_send.ReleaseBuffer();
}
}
void CSerialGateTestDlg::OnOnSetaxsis() //выбор оси
{
UpdateData(true);
int popytka=0;
//изменение активного мотора
char ctrlkey=0x01;
char* ctrlkey2 = &ctrlkey;
sg.Send(ctrlkey2, 1);
int len=1;
char* LocBuf = m_axsis.GetBuffer(128);
sg.Send(LocBuf, len);
m_send.ReleaseBuffer();
CString tp="tp";
char* LocBuf2 = tp.GetBuffer(128);
sg.Send(LocBuf2, 2);
tp.ReleaseBuffer();
//enter
char ent=0x0D;
char* ent2 = &ent;
sg.Send(ent2, 1);
}
void CSerialGateTestDlg::OnOnSetacsel() //установить ускорение
{
UpdateData(true);
CString sa="sa";
char* LocBuf2 = sa.GetBuffer(128);
sg.Send(LocBuf2, 2);
sa.ReleaseBuffer();
int len = this->m_asel.GetLength();
if(len > 0)
{
char* LocBuf = m_asel.GetBuffer(128);
sg.Send(LocBuf, len);
m_asel.ReleaseBuffer();
//enter
char ent=0x0D;
char* ent2 = &ent;
sg.Send(ent2, 1);
//проверкаtl
CString tl="tl";
char* LocBuf3 = tl.GetBuffer(128);
sg.Send(LocBuf3, 2);
tl.ReleaseBuffer();
//enter
sg.Send(ent2, 1);
//m_recievecontr.SetWindowText("0");
//CEdit::Clear;
//UpdateData(false);
}
}
void CSerialGateTestDlg::OnOnSetvelos()
{
UpdateData(true);
CString sv="sv";