[Embedded] 온도센서

강지원·2025년 3월 17일

STM32 강의

목록 보기
29/33

1. 온도센서

프로브 - 선(3개) - 모듈(VCC, GND, DAT) - 보드 (온도를 FND에 표현)

온도 측정 개념

프로브에 열이 가해지면 저항값이 변함
-> 저항이 변하면서 전압이 변함
-> 변한 수치를 가지고 온도를 측정해냄

온도센서 회로도

2. 온도센서 소스코드로 동작이해하기

OneWire 클래스 이해하기

1) ds()

/** 사용코드 **/
OneWire  ds(10);  // on pin 10
/** OneWire 클래스 코드 - 생성자**/
OneWire::OneWire(uint8_t pin)
{
	pinMode(pin, INPUT);
	bitmask = PIN_TO_BITMASK(pin);
	baseReg = PIN_TO_BASEREG(pin);
#if ONEWIRE_SEARCH
	reset_search();
#endif
}

핀을 input 모드로 세팅

2) ds.read()

uint8_t OneWire::read_bit(void)
{
	IO_REG_TYPE mask=bitmask;
	volatile IO_REG_TYPE *reg IO_REG_ASM = baseReg;
	uint8_t r;

	noInterrupts();
	DIRECT_MODE_OUTPUT(reg, mask);
	DIRECT_WRITE_LOW(reg, mask);
	delayMicroseconds(3);
	DIRECT_MODE_INPUT(reg, mask);	// let pin float, pull up will raise
	delayMicroseconds(10);
	r = DIRECT_READ(reg, mask);
	interrupts();
	delayMicroseconds(53);
	return r;
}

// Read a byte
uint8_t OneWire::read() {
    uint8_t bitMask;
    uint8_t r = 0;

    for (bitMask = 0x01; bitMask; bitMask <<= 1) {
	if ( OneWire::read_bit()) r |= bitMask;
    }
    return r;
}

void OneWire::read_bytes(uint8_t *buf, uint16_t count) {
  for (uint16_t i = 0 ; i < count ; i++)
    buf[i] = read();
}

핀이 하나뿐인데 읽고 쓰고를 다할 수 있다는 것은 read를 할 때는 output 모드로 바꿔서

1Bit를 읽는 방법(read_bit)

선 3개(DAT, GND, VCC)

  1. DAT를 output 모드로 바꾸기
  2. LOW로 떨어트리고 3micro 쉼
  3. 다시 input 모드로 바꿈
  4. 10micro 쉼
  5. 1Bit를 읽음
  6. 1Bit를 리턴함

read()

int8_t == char
uint8_t == unsigned char
uint32_t == unsigned int

1. for (bitMask = 0x01; bitMask; bitMask <<= 1)
-> 00000001 << 1 = 00000010,..
for문은 8번을 돌아서 bitmask = 00000000 일때 종료

2. if ( OneWire::read_bit()) r |= bitMask;
r이 1이면 해당 번째 비트에 1이 켜짐

따라서 DAT에서 8Bit를 읽어서 r에 저장해서 r을 리턴하는 코드이다

read_bytes()

read함수에서 r에 저장된 8비트를 buf에 저장함

3) ds.write()

void OneWire::write_bit(uint8_t v)
{
	IO_REG_TYPE mask=bitmask;
	volatile IO_REG_TYPE *reg IO_REG_ASM = baseReg;

	if (v & 1) {
		noInterrupts();
		DIRECT_WRITE_LOW(reg, mask);
		DIRECT_MODE_OUTPUT(reg, mask);	// drive output low
		delayMicroseconds(10);
		DIRECT_WRITE_HIGH(reg, mask);	// drive output high
		interrupts();
		delayMicroseconds(55);
	} else {
		noInterrupts();
		DIRECT_WRITE_LOW(reg, mask);
		DIRECT_MODE_OUTPUT(reg, mask);	// drive output low
		delayMicroseconds(65);
		DIRECT_WRITE_HIGH(reg, mask);	// drive output high
		interrupts();
		delayMicroseconds(5);
	}
}

// write a byte
void OneWire::write(uint8_t v, uint8_t power /* = 0 */) {
    uint8_t bitMask;

    for (bitMask = 0x01; bitMask; bitMask <<= 1) {
	OneWire::write_bit( (bitMask & v)?1:0);
    }
    if ( !power) {
	noInterrupts();
	DIRECT_MODE_INPUT(baseReg, bitmask);
	DIRECT_WRITE_LOW(baseReg, bitmask);
	interrupts();
    }
}

void OneWire::write_bytes(const uint8_t *buf, uint16_t count, bool power /* = 0 */) {
  for (uint16_t i = 0 ; i < count ; i++)
    write(buf[i]);
  if (!power) {
    noInterrupts();
    DIRECT_MODE_INPUT(baseReg, bitmask);
    DIRECT_WRITE_LOW(baseReg, bitmask);
    interrupts();
  }
}

3. 온도센서 회로 구성

*오타 - PA3에 연결해주기

0개의 댓글