==========================================================================================

센서

==========================================================================================

<AVR2560>


PT100옴 (XTR 119?...:BB회사)

써머커플러 (MAX...) - 일반 선 연결 X(온도 보상 도선 연결 해야 함)

:전용 드라이버사용 I2C통신으로 값 받음


=온도센서(써미스터)


<ADC.H>


#ifndef
 __ADC_H__
#define __ADC_H__
//#include "avr2560.h"
#include <avr/io.h>
#include <util/delay.h>

#define DADC 1

//#define A 1.845012194
//#define B 2.690325175
//#define C 0.948665543

#define A 2.658310929
#define B 2.94551768
#define C 11.77139449

#define BCOEFFICIENT 3950    // The beta coefficient of the thermistor (usually 3000-4000)
#define THERMISTORNOMINAL 10000  // resistance at 25 degrees C
#define TEMPERATURENOMINAL 25  // temp. for nominal resistance (almost always 25 C)
#define SERIESRESISTOR 10000  // the value of the 'other' resistor

//extern int portop;

void ADC_Init(void);
char * Cvt_Char(int , char *);
float ADC_Read(void);

#endif //__ADC_H__
 


<ADC.C>

#include "adc.h"



void ADC_Init(void)
{  
  
//DDRF = 0x80;
  //ACSR = (1<<ACBG) |(1<<ACIS1) |(1<<ACIS0); //0b01000011; // + 입력 = 1.1V
  ADMUX = (1<<REFS0)|(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);//0b01000000;////(1<<REFS1) | (1<<REFS0);   //-입력 : ADC4(JTAGEN X) => ADC1
  ADCSRA =  (1<<ADEN) | (1<<ADSC) | (1<<ADATE);//0b11100000;////0x00;      //ADEN : 0
  ADCSRB = 0x00;//(1<<ACME);//0b01000000; //ACME : 1
  
  
return;
}

char * Cvt_Char(int T, char * cTemp)
{
  
unsigned short T2;
  
char tmp1;
  
char tmp2;

  
if(T < 0)
  {
    T2 
= (~T+1);
  }
  
else
  {
    T2 
= T;
  }

  tmp1 
= (char)(T2/10);
  tmp2 
= (char)(T2%10);
  
  
if(0 <= T)
    cTemp[
0= ' ';
  
else
    cTemp[0= '-';

  
if(0 == tmp1)
    cTemp[
1= ' ';
  
else
    cTemp[1= tmp1 + '0';

  cTemp[
2= tmp2 + '0';

  
return cTemp;
}

// calculate resistor value
float fCalcNtc(int wADCVal)  // from ADC

  
float fRntc;

    
//fRntc = 10000 *  (float) wADCVal / ( 1023.0  - (float) wADCVal);  // 10000 = pullup resistor
  fRntc = 10000 *  (( 1023.0  - (float) wADCVal) / (float) wADCVal );  // 10000 = pullup resistor

  return(fRntc);
}


// calculate temperature from resistorvalue
float fCalcTemp( float fRntc)
{
  
float fTemp;

    fTemp 
= (1.0 / ( (log(fRntc/THERMISTORNOMINAL))/BCOEFFICIENT  + 1.0/298.0)) - 273.0//log = ln 

  //kT = 1.0 / ((1.0 / (273.15 + 25.0)) + (1.0 / 4200.0) * log (sensorR / 10000.0));
  return( fTemp);
}


float ADC_Read(void)
{
  
unsigned char i;
  
int sum;
  
volatile unsigned int uiCnt;
  
float sensorV;
  
float sensorR;
  
float kT;
  
float cT;

  sum 
= 0;
  
for(i = 0; i<32; ++i) //AVERAGE
  {
    ADCSRA 
=  (1<<ADEN) | (1<<ADSC) |(1<<ADIF) |(1<<ADPS2) |(1<<ADPS0);//0b11010101;
    
    
while((ADCSRA & (1<<ADIF)) != (1<<ADIF));
      sum +
= (((int)ADCL) + (((int)ADCH) << 8)); // 10 bit - ADCL부터 읽어야 함..
      //sum += ((((int)ADCH)<<8) + ((int)ADCL)); // 10 bit - ADCH 부터 읽으면 값 변경 안됨
    
    
//DELAY(30000);
    _delay_ms(300);
  }
  
  
sum >>= 5//AVERAGE // sum = sum / 16  ==  sum /= 16; 

  //sensorV = (sum*5.0/1023.0);
  //sensorV = sum*5.0/512.0;
  //10k
  //sensorR = (( 5.0 * 10000.0 )/ sensorV ) - 10000.0;
  //kT = 1.0 / ((1.0 / (273.15 + 25.0)) + (1.0 / 3435.0) * log (sensorR / 10000.0));
  //kT = 1.0/(A + (B*log(sensorR)) + (C*log(sensorR)*log(sensorR)*log(sensorR))); // Stein Hart
  //kT = 1.0 / ((1.0 / (273.15 + 25.0)) + (1.0 / 4200.0) * log (sensorR / 10000.0));
  
  
// 5k
  //sensorR = (( 5.0 * 5000.0 )/ sensorV ) - 5000.0;
  //sensorR = (500*sensorV) / (5-sensorV);

  //kT = 1.0 / ((1.0 / (273.15 + 25.0)) + (1.0/3324.0) * log (sensorR / 5000.0)); // B parameter
  //kT = 1.0/(A + (B*log(sensorR)) + (C*log(sensorR)*log(sensorR)*log(sensorR))); // Stein Hart

  //cT = kT-273.15;

  sensorR = fCalcNtc(sum);      // calculate temperature from resistorvalue 
  cT = fCalcTemp(sensorR);      // calculate temperature from resistorvalue
  

  
return cT;
}




=결과




<추가>

=온도 경보 장치 ( WIFI 연결 => IOT 접목)

TCP/IP


-네비게이션(GPS - 센턴스로 통신)

-수온 체크(선박용)

$

- : DONT CARE

- : DONT CARE

MTW

,

x.x : x.. .x

,

C : 섭씨

*hh : checksum


NMEA0183







'2015 스마트 콘트롤러 > 업무일지' 카테고리의 다른 글

20150902  (0) 2015.09.03
20150901  (0) 2015.09.01
20150831  (0) 2015.08.31
20150828  (0) 2015.08.30
20150828  (0) 2015.08.28
Posted by ahj333
,