조도센서
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) 이런 식으로 하는 지에대한 좋은 사이트
'IoT > 아트멜 스튜디오와 아두이노로 배우는 ATmega328 프로그래밍' 카테고리의 다른 글
ATmega328 프로그래밍 LCD 출력 성공! (0) | 2020.06.25 |
---|---|
오버플로 / 비교일치 인터럽트 (0) | 2020.06.09 |
ATmega328 가변저항 / 난수 생성 (0) | 2020.06.08 |
인터럽트 (0) | 2020.05.30 |
LED & button (0) | 2020.05.24 |
댓글