이 영역을 누르면 첫 페이지로 이동
천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

페이지 맨 위로 올라가기

천천히 꾸준히 조용히

천천히 꾸준히 조용히.. i3months 블로그

[Embedded] Sensor

  • 2026.05.13 17:01
  • Computer Science/Embedded Software
반응형

 

 

 

센서는 아날로그 현상을 디지털 값으로 바꾸는 역할을 수행한다.

센서가 어떤 물리량을 어떻게 측정하는지 이해하고, 출력 신호를 MCU의 어떤 자원으로 받아들일지 결정해야 함.

 

핸드폰만 해도 카메라, 지문인식, 화면 회전을 위한 가속도계, 습도 및 조도 센서, GPS 등 굉장히 많은 센서가 들어있음.

여기서 각 센서마다 측정하는 물리량과 용도가 다 다르다.

 

AXLM(가속도계)와 Gyro(자이로스코프)는 항상 pair로 사용된다.

자이로스코프는 축을 중심으로 한 회전운동을 의미하고, 가속도계는 축 방향으로의 직선운동을 의미한다.

 

핸드폰을 들고 위로 올리면 직선이동이니 가속도계가 감지하고, 손목을 비틀면 회전이니 자이로스코프가 감지한다.

두 가지가 함께 사용되어야 핸드폰을 잡은 자세를 파악할 수 있음.

다만 두 가지를 측정할 때 측정 단위에 주의하자. 센서 값을 의미 있는 숫자로 바꾸려면 단위를 명확하게 알아야 한다.

 

자이로스코프와 가속도계는 측정 대상은 다르지만 측정 방식은 똑같다.

MEMS는 물체의 공간이동 변위를 측정하는 회로로, 구현 축당 변위값을 ADC를 거쳐 디지털 신호로 변환함.

MEMS 가속도계 안에는 작은 덩어리가 스프링에 매달려있고, 센서를 흔들면 틀은 오른쪽으로 가지만 덩어리는 관성 때문에 제자리를 유지하려고 한다. 그러니 덩어리가 틀 기준으로 왼쪽으로 밀린 것 처럼 보임.

 

센서는 가속도의 수치를 측정하는게 아니고 덩어리가 얼마나 밀렸는지를 측정할 수 있다.

그러니 저 밀린 정도를 전기 신호로 바꾸고 ADC로 디지털화한다.

 

책상 위에 가만히 놓인 가속도계는 1g를 측정한다. 중력이 작용하니까.

핸드폰을 옆으로 눕히면 1g 벡터가 옆을 가리키고 폰을 가로 모드로 인식을 수 있다.

자이로스코프도 같은 원리. 똑같이 변위를 측정하지만, 변위를 만드는 힘이 좀 다를 뿐이다. 

 

 

 

 

 

 

MEMS -> AC 증폭 -> DEMOD -> 출력 증폭 -> 출력 (Xout, Yout, Zout)

X Y Z 세 축의 가속도를 각각 아날로그 전압으로 내보낸다.

 

3개의 아날로그 출력은 아두이노의 A0 A1 A2 핀으로 받는다. A 시리즈 핀은 아두이노의 ADC가 연결된 핀.

센서가 아날로그 출력을 내보내면 MCU는 ADC를 사용해야 하고, IR 센서에서도 마찬가지로 적용된다.

초음파 센서처럼 디지털 Pulse를 내보내면 Timer / Input Capture를 사용한다.

 

 

 

 

임베디드는 기기 스펙이 전부니까.. 센서 스펙을 보고 이해할 수 있어야 한다. 

 

자이로스코프도 가속도계와 똑같이 MEMS 기술을 사용함.

다만 칩 내부에 ADC가 들어있는지 아님 외부에 들어있는지의 차이와 출력 방식만 좀 다르다. 

 

 

 

 


 

 

 

 

 

가속도계와 자이로스코프는 현재 어떻게 움직이고 있는지를 측정하고, 초음파 거리센서 SRF04는 내 앞에 뭐가 있는지를 측정한다.

송신기, 수신기, 제어회로를 사용한다. 초음파를 쏘고 그 반사음이 돌아오는 시간을 듣고 거리를 측정함.

 

40kHz 를 사용해 사람 귀에는 들리지 않고, 짧은 파장이라 작은 물체도 감지할 수 있다.

너무 가까우면 송신과 수신이 겹치고 너무 멀면 반사파가 너무 약해서 감지할 수 없다. 

 

1. CPU -> SRF04 신호 전송 

2. SRF04가 초음파를 쏘고 echo 핀을 high로 설정 

3. SRF04에게 반사파가 도착하고 echo 핀을 low로 설정 

4. echo 펄스의 길이를 측정해서 거리 계산 

5. 시간 초과 시 자동 리셋 

 

Timer의 Input Capture 모드로 echo 핀이 high로 있던 시간을 측정한다.

너무 멀어서 반사파가 돌아오지 않으면 36ms 까지만 기다리고 알아서 low로 떨어짐. 

거리는 아날로그 데이터지만, 디지털 데이터인 시간으로 바꿔서 MCU가 측정할 수 있도록 다룬다. 

 

 

 

 

첫 번째 Trigger는 CPU가 만들고 SRF04에게 준다. 즉, 측정을 시작하라는 명령을 내림.

Trigger를 받으면 SRF04가 알아서 초음파를 쏜다. 이거는 SRF04 내부 회로가 알아서 만드니 CPU랑은 무관함.

echo는 SRF04가 CPU에게 알려주는 신호. 초음파를 쏘는 순간 echo 핀을 high로 올리고, 반사파가 돌아온 순간 echo 핀을 low로 내린다.

 

STM32의 Timer는 PWM출력과 Input Capture를 수행한다.

즉, Trigger를 만드는 작업과 echo를 측정하는 작업을 Timer가 수행하고, CPU는 그동안 다른 일을 처리하는 방식임.

 

다만 Timer는 한 가지 모드로만 동작한다. 내부 카운터를 어떻게 활용하는지가 모드와 연관됨.

PWM 모드에서는 카운터가 특정 값일 때 핀을 high/low로 바꾸는 작업을, Input Capture 모드에서는 핀이 변할 때 카운터 값을 기록.

 

이러면 echo 3개에 Timer가 3개 있어야 할 것 같지만.. 

TIM3은 채널이 4개 있고, 각 채널은 독립적으로 같은 카운터를 공유하면서 Input Capture를 수행할 수 있다. 

 

MCU 핀 하나도 여러 기능으로 사용할 수 있다.

PF6핀은 일반 GPIO로 사용할 수 있고, AF를 설정해두면 TIM10_CH1으로도 쓸 수 있음. 

그러니 회로도와 데이터시트를 함께 보고 설계해야 함. 

 

Input Capture는 Timer 내부 카운터를 사용해 핀이 변하는 순간 카운터 값을 CCRx 레지스터에 복사한다.

Risign Edge에서 T1을 캡쳐하고 Falling Edge에서 T2를 캡쳐. 그리구 T2 -T1이 캡쳐 길이가 된다.

 

 

 

TimHandle1.Instance       = TIM3;              // 어떤 타이머?
TimHandle1.Init.Period    = 0xFFFF;            // 카운터 최댓값
TimHandle1.Init.Prescaler = uwPrescalerValue;  // 클럭 분주값
TimHandle1.Init.ClockDivision = 0;
TimHandle1.Init.CounterMode   = TIM_COUNTERMODE_UP;  // 0→max 방향

HAL_TIM_IC_Init(&TimHandle1);  // 위 설정으로 초기화

sICConfig1.ICPolarity  = TIM_ICPOLARITY_RISING;    // Rising Edge에서 캡처
sICConfig1.ICSelection = TIM_ICSELECTION_DIRECTTI; // 직접 입력
sICConfig1.ICPrescaler = TIM_ICPSC_DIV1;           // 입력 분주 안 함
sICConfig1.ICFilter    = 0;                        // 필터 없음

// uBrain의 초음파는 3개 각각 TIM3의 2,3,4 Channel을 사용
HAL_TIM_IC_ConfigChannel(&TimHandle1, &sICConfig, TIM_CHANNEL_2);
HAL_TIM_IC_Start_IT(&TimHandle1, TIM_CHANNEL_2);
HAL_TIM_IC_ConfigChannel(&TimHandle1, &sICConfig, TIM_CHANNEL_3);
HAL_TIM_IC_Start_IT(&TimHandle1, TIM_CHANNEL_3);
HAL_TIM_IC_ConfigChannel(&TimHandle1, &sICConfig, TIM_CHANNEL_4);
HAL_TIM_IC_Start_IT(&TimHandle1, TIM_CHANNEL_4);

 

 

관련 코드 작성은 굉장히 쉽다.. 구조체에 값 채우고 HAL 함수 몇개 호출하면 끝

카운터가 알아서 돌고 핀이 변하면 알아서 캡쳐하고 캡쳐되면 알아서 인터럽트 발생하고.. 

 

IR 센서는 적외선 쏘고 반사된 양을 ADC로 읽는다.

초음파는 시간을 측정하고.. IR은 빛의 양을 측정하고.. 

같은 측정이라도 출력 형태가 다르면 MCU 자원도 다르다. 출력이 비선형이니 Lookup 테이블으로 보간이 필요하긴 함.

 

 

반응형
저작자표시 (새창열림)

'Computer Science > Embedded Software' 카테고리의 다른 글

[Embedded] Embedded Operating System  (0) 2026.05.13
[Embedded] Motor  (0) 2026.05.13
[Embedded] Communication Programming  (0) 2026.05.12
[Embedded] Communication Protocol (1)  (0) 2026.05.12
[Embedded] ARM Assembly  (0) 2026.05.10

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Embedded] Embedded Operating System

    [Embedded] Embedded Operating System

    2026.05.13
  • [Embedded] Motor

    [Embedded] Motor

    2026.05.13
  • [Embedded] Communication Programming

    [Embedded] Communication Programming

    2026.05.12
  • [Embedded] Communication Protocol (1)

    [Embedded] Communication Protocol (1)

    2026.05.12
다른 글 더 둘러보기

정보

천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

  • 천천히 꾸준히 조용히의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (703)
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • C (25)
      • C++ (12)
      • Java (19)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (161)
      • Machine Learning (38)
      • Operating System (18)
      • Computer Network (28)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Data Science (9)
      • Embedded Software (10)
      • Computer Architecture (4)
      • Compiler Design (11)
      • Computer Security (13)
      • BlockChain (0)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Amazon Web Service (8)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • 💡 솔루션 (17)
    • 👥 모각코 (12)
    • 💬 기록 (10)
    • 📚 공부 (7)
    • -------------- (25)

최근 글

나의 외부 링크

메뉴

  • 홈
반응형

정보

i3months의 천천히 꾸준히 조용히

천천히 꾸준히 조용히

i3months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / AXZ. Copyright © i3months.

티스토리툴바