[Embedded] 1-wire 통신, 온도값 표시

강지원·2025년 3월 17일

STM32 강의

목록 보기
30/33

1-Wire 통신

1-Wire 통신은 하나의 데이터 라인과 하나의 접지(그라운드) 라인만을 사용해 데이터를 송수신하는 직렬 통신 방식입니다. 이 방식은 Dallas Semiconductor(현재 Maxim Integrated, Analog Devices에 인수)에서 개발했습니다. 1-Wire는 마스터-슬레이브 구조를 기반으로 하며, 주로 센서, 메모리, 식별 장치 등에서 사용됩니다.

1-wire bus는 선 한개로 데이터의 송/수신을 하므로, 1-wire bus 방식의 ic와 연결하는 mcu는 gpio 핀의 입력/출력모드를 번갈아 사용

🔹 1-Wire 통신의 특징

  1. 단일 데이터 라인 사용
    데이터 송수신과 전원 공급을 모두 하나의 데이터 라인에서 수행 가능
    최소한의 배선으로 구현 가능 → 비용 절감 및 간소화

  2. 마스터-슬레이브 구조
    하나의 마스터가 여러 개의 슬레이브 장치와 통신 가능
    각 슬레이브 장치는 고유의 64비트 시리얼 번호를 가짐 → 개별 장치 식별 용이

  3. 전원 공급 방식
    슬레이브 장치는 별도의 전원선 없이 데이터 라인에서 전력을 공급받는 파라사이트 전원(Parasite Power) 방식 지원 가능

  4. 저속 통신
    일반적으로 통신 속도는 16.3kbps 정도로 낮음 → 주로 센서 및 식별 장치에 적합

  5. 충돌 방지 및 다중 장치 식별
    장치 선택을 위한 ROM 코드 검색(ROM Search) 프로토콜 제공 → 다중 장치 연결 시 충돌 방지

🔹 1-Wire 통신의 동작 원리

  1. 리셋 및 프레즌스(Reset & Presence)
    마스터가 라인을 리셋하면 슬레이브가 응답 신호(Presence)를 보냄

  2. 장치 식별 (ROM Code)
    슬레이브는 64비트의 고유 시리얼 번호를 통해 개별적으로 식별됨
    마스터는 ROM 명령을 통해 특정 슬레이브 장치를 선택 가능

  3. 명령 전송
    마스터는 선택된 슬레이브에 특정 명령(데이터 읽기, 쓰기 등)을 전송

  4. 데이터 전송
    슬레이브는 명령에 따라 데이터를 응답
    데이터는 LSB(Least Significant Bit)부터 전송

🔹 1-Wire 통신 방식

✅ 비트 전송 방식

  • 데이터 라인은 풀업 저항을 통해 고전압 상태로 유지됨
  • 마스터와 슬레이브는 시간 차이를 이용해 0 또는 1 비트를 전송함

라이브러리 포팅(TM -> HAL)

1-wire 통신을 사용하기 위해서 라이브러리를 사용할 건데 TM 라이브러리 이기 때문에 HAL 라이브러리로 바꾼 소스를 포팅할 것이다.

1. 에러 고치기

처음 포팅 실행 시 에러가 많이 나기 때문에 하나 씩 해결해줄 것이다.

1) Lib 폴더생성

2) Inc, Src 폴더생성 후 파일 옮기기

3) 문제 1 - #include 경로 지정

4) 문제 2 - oneWire.h에서 gpio.h 오류

#include "main.h" 로 변경해줌

5) 문제 3 - config 오류

freeRTOS 0으로 설정, temp 핀 설정해주기, 타이머 생성

2. 타이머 설정

라이브러리를 사용하기위해서는 72MHZ에서 1us tick을 생성해야 한다.

타이머 생성 원리

  1. 클럭 입력
    MCU에는 크리스탈 오실레이터(crystal oscillator)나 세라믹 레조네이터(ceramic resonator)를 통해 정해진 주파수의 클럭 신호가 입력됩니다.
    현재 사용하고 있는 MCU의 기준 클럭은 8MHz이다. 따라서 1초에 8,000,000번의 클럭이 발생한다.

  2. 프리스케일러 설정
    클럭 주파수가 너무 빠르기 때문에 타이머가 너무 자주 오버플로우(overflow)되는 것을 방지하기 위해 프리스케일러를 설정합니다.

  • 프리스케일러는 입력 클럭을 분주하여 타이머가 카운터할 속도를 줄인다.
  • 프리스케일러 값이 10000-1 이면 입력클럭 주파수가 8MHz / 10000 = 800Hz로 감소
  1. 카운터 설정
  • 타이머는 설정된 프리스케일러로 분주된 클럭에 따라 카운터 값을 증가시킨다.
  • 카운터 값이 설정된 값에 도달하면 오버플로우되면서 인터럽트 발생
  1. 인터럽트 발생
  • 설정된 카운터 값에서 오버플로우가 발생하면 타이머 인터럽트가 발생하고, 원하는 작업을 수행한다.

예시) 인터럽트를 1초마다 발생하게 세팅하기

기준 클럭 = 8MHz = 80000000 Hz
prescaler = (10000 - 1) : 카운터 1을 올리는데 걸리는 단계
카운터 = (800 - 1) : 카운터가 0 ~ 799까지 갔다가 0으로 돌아오는 시간 1초

타이머 설정) 72MHz 발생시키고 클럭을 1us tick 으로 맞추기

crystal/ceramic Resonator 설정(클럭 생성기)

클럭 생성기를 통해 기존클럭 8MHz에서 72MHz로 클럭을 바꾼다.

위처럼 클럭을 72MHz로 설정을 해준다.(HSE에서 9배수로 바꿔줌)

프리스케일러: (72-1)로 입력클럭을 분주 시켜 1,000,000Hz로 감소, 즉 1us마다 타이머값이 1 증가됨

카운터 : 0xFFFF (최대값 , 65535)에 오버플로우가 나도록 설정

3. Ds18b20_Init() 사용

4. 온도센서 동작 확인

Temperature 온도값이 나오는 것을 확인 할 수 있다
이를 fnd에 표현하기를 시도했지만 fnd가 깜빡거리면서 보이기 때문에 오류를 수정할 예정이다

  /* USER CODE BEGIN 2 */
  fnd_init(&hspi2);
  //HAL_TIM_Base_Start_IT(&htim2);
  Ds18b20_Init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

    while (1)
    {
    	Ds18b20_ManualConvert();
    	digit4_temper((int)ds18b20[0].Temperature*10,10000);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    }
  /* USER CODE END 3 */
}

0개의 댓글