(6.4) 라즈베리 파이를 통한 SPDT 제어
#define VOLT0 0
#define VOLT20 1
#define VOLTM20 2
#define SPDT_0 21 //5
#define SPDT_1 22 //6
/*
//입력: 관찰 영역의 중심 좌표 x, y
//출력: 없음
//기능: 관찰할 영역의 중심점을 입력하면 x와 y의 각각의 톱니파를 DC offset 시킨다.
*/
void centerOfObservation(int x, int y){
x_Shift(x);
y_Shift(y);
}
/*
//입력: 관찰 영역의 중심 좌표 중 x를 제어
//출력: 없음
//기능: 시료의 좌표에 맞게 x축 톱니파에 DC offset 준다. programR2와 programR3, SPDT을 하드웨어적으로 제어한다.
*/
void y_Shift(int y);
void x_Shift(int x){
if(x == 0){
SPDT_cont(VOLT0);
return;
}
else if(x>0){
SPDT_cont(VOLT20);
}
else if(x<0){
SPDT_cont(VOLTM20); //minus 20 voltage
x=-1*x;
}
ProgramR2_cont(x/200); //big scale
ProgramR3_cont(x%200); //small scale
}
/*
//입력: SPDT에서 선택할 전압
//출력: 없음
//기능: 0V, 20V, -20V중에 하나를 선택해서 스캔 드라이버 회로에 shift단에 전압을 공급해준다.
*/
void SPDT_cont(int type){
if(type == VOLT0){
digitalWrite(SPDT_0, LOW);
digitalWrite(SPDT_1, LOW);
}else if(type == VOLT20){
digitalWrite(SPDT_0, HIGH);
digitalWrite(SPDT_1, LOW);
}else if(type == VOLTM20){
digitalWrite(SPDT_0, HIGH);
digitalWrite(SPDT_1, HIGH);
}
}
/*
//입력: 시료 좌표상의 x축 중심점의 위치 - (자연수 , 200의 배수)
//출력: 없음
//기능: 입력 좌표값에 맞게 shift 시킬 수 있도록 Big scale output 단에 DC 전압을 흘려 줘야 한다. 그러기 위해서 스캔 드라이버 회로 상의 programR2의 저항을 제어해야 한다. Big scale output 단에서 나와야 하는 전압의 범위는 (-20V, -19400mV, …, -600mV, -400mV, -200mV), 0, (200mV, 400mv, 600mv, …, 19400mv, 20V)이다.
이를 위해서 ProgramR2의 레지스터에 쓰일 수 있는 값의 범위는 +20V가 SPDT에서 공급될 때 0~99이다. SPDT에서 0이 공급 될 때는 don’t care이다. SPDT에서 -20V가 공급될 때도 마찬가지로 0~99임.
*/
void ProgramR2_cont(int bigScaleVal){
if(bigScaleVal > 99)
bigScaleVal = 199;
else if(bigScaleVal < 0){
printf(“big scale value is minus, error\n”);
return;
}
digitalPotWrite(bigScaleVal);
}
/*
//입력: 시료 좌표상의 x축 중심점의 위치 - (1~199사이의 수)
//출력: 없음
//기능: ProgramR2_cont와 비슷하지만 이 함수는 스캔 드라이버 회로 상의 programR3의 저항을 제어해야 한다. Small scale output 단에서 나와야 하는 전압의 범위는 (-199mV, -199mV, …, -3mV, -2mV, -1mV), 0, (1mV, 2mv, 3mv, …, 198mv, 199mV)이다.
이를 위해서 ProgramR3의 레지스터에 쓰일 수 있는 값의 범위는 +20V가 SPDT에서 공급될 때 0~199이다. SPDT에서 0이 공급 될 때는 don’t care이다. SPDT에서 -20V가 공급될 때도 마찬가지로 0~199임.
*/
void ProgramR3_cont(int smallScaleVal){
if(smallScaleVal > 199)
smallScaleVal = 199;
else if(smallScaleVal < 0){
printf(“small scale value is minus, error\n”);
return;
}
digitalPotWrite(smallScaleVal);
}
(20000, 0) (-20000, 0)
(19800, 0)
(0, 0)
수정
시료대
*SEM 스캔 LOW LEVEL DESIGN 수정
X, Y축 모두 좌표 범위가 -4000~ 0 ~ +4000 이다. 좌표 1칸 당 전압 분해능은 40V / 8000칸 = 5mV. 가장 작은 영역을 볼 수 있는 스킨 신호의 톱니파는 5mv * 512칸 = 2.560V
빨간색 글이 수정한 것.
댓글 없음:
댓글 쓰기