본문 바로가기
IoT/아트멜 스튜디오와 아두이노로 배우는 ATmega328 프로그래밍

ATmega328 조도센서, 온도센서, 초음파센서

by javapp 자바앱 2020. 6. 11.
728x90

조도센서

 

void ADC_INIT(unsigned char channel)

{

       ADMUX |= 0x40; // 01000000 AVCC 기준 전압으로

       ADCSRA |= 0x07; // 00000111 분주비 (8비트)

       ADCSRA |= (1 << ADEN); //ADC 활성화

       ADCSRA |= (1 << ADATE); //자동 트리거 모드

       ADMUX |= ((ADMUX & 0xE0) | channel); //채널 선택

       ADCSRA |= (1 << ADSC); //변환 시작

}

 

int read_ADC(void)

{

       while(!(ADCSRA & (1 << ADIF))); //변환 종료 대기

       return ADC;                            //10비트 값을 변환

}

 

int main(void)

{

       int read;

       UART_INIT();   //UART 통신 초기화

       ADC_INIT(0);   //AD 변환기 초기화

       DDRB =0x08;            //0000 1000 (~11) PB3 출력

       PORTB =0x00;

       while(1)

       {

               read = read_ADC(); //아날로그 값 읽어 오기

               UART_print16bitNumber(read); //정수값 출력

               UART_transmit('\n');

               if(read > 700)PORTB = 0x00;    //read 값 조절 해서 LED on_off

               else             PORTB = 0x08;

               _delay_ms(500);

       }

}

 


 

온도센서

1도에 10mV 증가

-55 ~ 150 도 

VCC = 5V

 

 

 

 

 

 

 

 

 

 

#define F_CPU 16000000L

#include <util/delay.h>

#include <avr/io.h>

#include <avr/sfr_defs.h>

#include <avr/interrupt.h>

#include "UART.h"

 

void ADC_INIT(unsigned char channel)

{

       ADMUX |= 0x40; // 01000000 AVCC 기준 전압으로

       ADCSRA |= 0x07; // 00000111 분주비 (8비트)

       ADCSRA |= (1 << ADEN); //ADC 활성화

       ADCSRA |= (1 << ADATE); //자동 트리거 모드

       ADMUX |= ((ADMUX & 0xE0) | channel); //채널 선택

       ADCSRA |= (1 << ADSC); //변환 시작

}

 

int read_ADC(void)

{

       while(!(ADCSRA & (1 << ADIF)));

       return ADC;

}

 

int main(void)

{

       int read;

       float input_voltage, temperature;

      

       UART_INIT(); //UART 통신 초기화

       ADC_INIT(1); //AD 변환기 초기화

      

       while(1)

       {

               read = read_ADC(); //온도 센서 출력 전압을 ADC 거쳐 읽음

              

               input_voltage = read * 5.0 / 1023.0; // 0 ~ 1023 사이 값을 0 ~ 5V 사이로 변환

              

               temperature = input_voltage * 100.0; //10mV 1 이므로 100곱해서 현재 온도 얻음

              

               UART_print16bitNumber((int)temperature);

               UART_transmit('\n');

              

               _delay_ms(1000);

       }

      

}

 


 

 

초음파 센서 (디지털)

 

소리속도 340 m/s -> 1m = 1/340 = 2.9ms

1cm  = 29 ms -> 왕복 58

1인치는 나누기 148

 

VCC 동작전압 : VCC = 5V

Trig : 출력

Echo : 입력

GND

 

#define F_CPU 16000000L

#include <util/delay.h>

#include <avr/io.h>

#include <avr/sfr_defs.h>

#include <avr/interrupt.h>

#include "UART.h"

 

#define PRESCALER 1024 //분주비

 

void Timer_init(void)

{

       TCCR0B |= (1 << CS02) | (1 << CS00); //분주비 1024 설정 / 묶어서 보냄

}

 

uint8_t measure_distane(void)

{

       //트리거 핀으로 펄스를 출력

       PORTC |= (1 << PORTC0);   //high 출력  A0 트리거

       _delay_ms(10);                //10마이크로초 대기

       PORTC &= ~(1 << PORTC0);   //low 출력

      

       //에코 핀이 high 때까지 대기

       TCNT0 = 0;

       while(!(PINC & 0x02)) //0000 0010

               if(TCNT0 > 250) return 255; //장애물이 없는 경우

      

       //에코 핀이 LOW 때까지의 시간 측정

       TCNT0 = 0;                           //카운터를 0으로 초기화

       while(PINC & 0x02){           //장애물 있는 겨우

               if(TCNT0 >250){                      

                      TCNT0 = 0;

                      break;

               }

       }

       //에코 핀의 펄스폭을 마이크로초 단위로 계산

       double pulse_width = TCNT0 * 64; //PRESCALER * 1000000.0 / F_CPU = 64;

       return pulse_width / 58;      //센티미터 단위 거리 반환

}

       int main(void)

       {

               uint8_t distance;

               DDRC = 0x01; //트리거 출력 , 에코핀 입력 설정

               UART_INIT();

               Timer_init(); //타이머 초기화

               while(1)

               {

                      distance = measure_distane(); // 거리측정

                      UART_printString("distance = ");

                      UART_print8bitNumber(distance);

                      UART_transmit('\n');

                      _delay_ms(1000);

               }

       }

              

      

 

 

특정핀을 1로 바꿀때 왜

PORTC |= (1 << PC0) 이런 식으로 하는 지에대한 좋은 사이트 

https://m.blog.naver.com/PostView.nhn?blogId=nkkh159&logNo=220829652473&proxyReferer=https:%2F%2Fwww.google.com%2F

 

[AVR/ATmega] 포트/비트 단위 설정 (2)

이전 포스팅에 이어서 이번엔 바로 AVR의 포트/비트 단위 설정을 설명드리겠습니다.여기선 설명하기 쉽...

blog.naver.com

 

댓글