2017년 8월 22일 화요일

[6] 스캔 드라이버 회로 제어 소프트웨어 - (6.4) 라즈베리 파이를 통한 SPDT 제어

(6.4) 라즈베리 파이를 통한 SPDT 제어
C:\Users\안유진\AppData\Local\Microsoft\Windows\INetCache\Content.Word\Screenshot from 2016-11-08 23-31-14.png
#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);
}

KakaoTalk_20161109_154156807.jpg

https://lh3.googleusercontent.com/tH1muzdPZevZGqbaX4ZZsSm3G2pmL8AJjDDdaopQ9v9EWTNuGihI40j6tfpJfGFJ7vV1QDJS9mSYiewx9gptHBoGKU9qb5fFQziQsneBg-iXpxOOdPY3zHNfPdXCpf0LkWgWabHy
(20000, 0) (-20000, 0)

KakaoTalk_20161109_154157512.jpg
(19800, 0)

KakaoTalk_20161109_154203045.jpg
(0, 0)
cordina.png

수정
mod_cordina.png

시료대
https://lh3.googleusercontent.com/tiXOsGL5BG4T8AMb77SkzZgmCtNAWsvAksSZrZ0mLXvDSfvQ134zODag6gOUMFBxpF56YqdyOVowDDfwb0Y-cm02d827OcygojR9qvi4u3qbuZCCmwndRy4IiftbByv3HKK2kiD0

*SEM 스캔 LOW LEVEL DESIGN 수정
X, Y축 모두 좌표 범위가 -4000~ 0 ~ +4000 이다. 좌표 1칸 당 전압 분해능은 40V / 8000칸 = 5mV. 가장 작은 영역을 볼 수 있는 스킨 신호의 톱니파는 5mv * 512칸 = 2.560V

빨간색 글이 수정한 것.

수정.png

댓글 없음:

댓글 쓰기

clear images were obtained