열전대의 온도를 측정하기 위해, 다이오드로 열전대의 콘넥션 부분의 온도를 측정해야 한다.


열전대는 두 선의 상대적인 온도차를 측정하는 것이기 때문에 현재 온도값이 필요하므로,
현재 TR(MMBT3904) 안에 있는 다이오드로 온도를 측정하도록 회로를 구성하고 프로그램을 만들었다.

그런데, 다이오드 온도측정에 필요한 함수 중에 log() 라는 수학함수가 있다.
이 함수를 쓰려면 #include <math.h> 만 추가해 주면 에러가 났다.

이유야 어떻든 불편하긴 한데, 컴파일러의 문제로 생각된다.
사용자의 기술적인 문제는 아니므로, 원인을 알 필요는 없다.

이 문제를 해결하려면, 다음과 같이 하면 된다.

1. 프로젝트를 클릭하고, 다시 마우스 우클릭한 다음 Build Setting 을 클릭.




2. 아래 그림처럼 Linker 를 클릭하고 Additional Libraries 에 m 이라고 써준다.




제품에 온도 센서로, 일반적으로 흔히 사용하는 TR(MMBT3904)를 적용해 봤습니다.
20bit - ADC 를 사용해서 CPU 가격이 올라가서 부담되시면 12비트 ADC 회로도 Cypress에서 제공하고 있습니다.

저는 열전대를 사용해야 하므로 좀 더 정밀한 ADC가 필요해서 20비트 ADC를 사용하다 보니,
TR쪽도 남은 ADC 채널에 연결했습니다. 열전대는 각 단자의 온도차만 센싱을 할 수 있어서, 기준 온도가 필요합니다.
그래서 열전대가 위치한 가장 가까운 곳에 이 TR 온도센서를 연결하게 되었습니다.
이 TR 센서는 다른 온도센서보다 정말 저렴합니다. 10원정도 밖에 안하거든요. ^^


범용 트랜지스터를 선택하는 이유는 덜 엄격한 정확도 요구 사항과 함께 매우 낮은 트랜지스터 비용입니다.

[왜 TR의 다이오드를 사용하는가?]
일반 다이오드 제조사와 종류가 어마어마 하게 많고 특성도 각각 많이 달라서, 그나마 Transistor에 들어있는
다이오드가 훨씬 더 규격적이고 제조사마다 차이가 적어서 그렇다고 합니다.

[실제 회로기판에 장착된 사진]




참고자로로서 Cypress 의 AN60590 문서가 있고, 샘플 프로그램도 함께 제공되어 있어서 사용했습니다.
 
문서를 좀 더 자세히 읽어 봐야 하는데, 읽어 봐도 너무 어려운 수학,물리 계산식들이 나와서 정확히 적용은 못하고 있습니다.
하지만 온도에 따라서 값이 오르고 내리는 것은 확실헀습니다.

테스트를 해 보니, TR을 딥타입 --> SMD 타입으로 바꿔서 사용해서 그런지 온도 값이 너무 높게 나오더라고요. ^^
아마도 딥타입(TO-92)과 SMD 타입(SOT-23)의 특성이 좀 다른 것 같습니다.
TR 자료를 좀 더 찾아보니 다음과 같은 내용이 있네요. TR이 패키지마다 온도 특성이 다르네요.



이 내용으로 적당한 계산값을 찾아 봐야 할 것 같은데, 해 보고 자료 업데이트 하겠습니다.

[업데이트]
좀 더 구글링을 해서 자료를 찾아봤습니다. 그 결과, 온도의 차이는 Package의 차이때문에 생기는 문제는 아닌 것 같습니다.온도의 차이는 IDEALITY FATOR 에 따라 발생하는데,  제조 회사마다 IDEALITY FATOR가 조금씩 다르다고 합니다.다음은 MICROCHIPS 사에서 제공하는 TR 특성 조사 문서입니다.

여기서 테스트에 사용한 TR에도 MMBT3904가 있었습니다. 제가 사용한 TR의 제조사를 몰라서 팩터값을 잘 모르겠네요.만약 TR로 온도를 측정하려고 한다면 제조사와 파트넘버를 잘 보고 사야겠습니다.
아니면 IDEALITY FATOR를 측정하는 방법을 알아야 하고, 측정 장비도 있어야 겠고 고생할 시간도 있어야 겠죠.

다음은 위의 링크에서 추출한 제조사 별 TR 특성표입니다.




다음은 제가 PSOC5에서 적용한 TopDesign.cysch 회로입니다.



참고로 한 AN60590 문서의 ref 회로는 다음과 같고요.



이 예제 프로그램에서 TR의 특성에 따른 상수(Ideality Fator)가 있는데, 
이 값을 일단은 대 충 바꿔서 현재 온도와 비슷하게 맞췄습니다.
아직까지 실제 온도와는 좀 다른 것 같은데, 이 값을 고치는 것은 맞는 것 같습니다.
다음은 이 상수가 위치해 있는 singleDiode.h 파일의 내용입니다.
(위의 Microchips 사의 TR 특성표 참조)

예제의 값은 다음과 같고, 
1
2
3
4
/* For the 2N3904 transistor that comes with the CY8CKIT-025 kit,
*  the ideality factor of 1.004 is used.
**********************************************************************************/
#define IDEALITY_FACTOR ((float)1.004)
cs

제가 수정한 값은 다음과 같습니다.
1
2
3
4
5
/* For the 2N3904 transistor that comes with the CY8CKIT-025 kit,
*  the ideality factor of 1.004 is used.
**********************************************************************************/
//#define IDEALITY_FACTOR ((float)1.004)
#define IDEALITY_FACTOR ((float)1.15)
cs

00001838A.pdf


MAC Address 읽는 함수로 ESP-8266 IC 내부의 2가지 MAC Address 를 읽을 수 있습니다.

참고한 사이트 주소는 다음과 같습니다.

http://www.esp8266.com/viewtopic.php?f=29&t=3587



아직 네트웍 개념이 없어서 잘은 모르겠지만,
1개는 일반 맥 어드레스이고(MAC{STA]) , 또 하나는 Wifi 단독 Server ?(MAC[SOFTAP]) 용 MAC Address 입니다.

Soft AP 는 공유기에 붙이지 않고, 8266가 단독으로 SSID,Password 를 치고 연결할 때
사용하는 방식 으로 알고 있습니다. 
그 뭐시냐... 핸드폰으로 Wifi 스캔하면 SSID가 보이죠. (^^ 공부 좀 더 해야겠네요.)

자 나중에 공부 더 해서 추가할께요.
아뭏든, 아두이노 IDE 에서 스케치 소스 코드만 있으면 실험 가능합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <ESP8266WiFi.h>
 
uint8_t MAC_array[6];
char MAC_char[18];
 
 
void setup() {
  char ser_tx_buff[100];
  
  Serial.begin(115200);
 
  Serial.println();
  // put your setup code here, to run once:
 
  Serial.print("MAC[STA] ->");
  WiFi.macAddress(MAC_array);
  for (int i = 0; i < sizeof(MAC_array); ++i){
    sprintf(MAC_char,"%s%02x:",MAC_char,MAC_array[i]);
  }
  Serial.println(MAC_char);  
 
  MAC_char[0]=0;
  Serial.print("MAC[SOFTAP] ->");
  WiFi.softAPmacAddress(MAC_array);
  for (int i = 0; i < sizeof(MAC_array); ++i){
    sprintf(MAC_char,"%s%02x:",MAC_char,MAC_array[i]);
  }
  Serial.println(MAC_char);  
}
 
void loop() {
  // put your main code here, to run repeatedly:
}
cs


+ Recent posts