Atmega128 ADC예제 - lm35 온도 센서값 시리얼로 출력하기AVR/Atmega128 강좌2023. 10. 8. 09:00
Table of Contents
반응형
실수를 시리얼 포트를 통해 출력하려면 프로젝트를 생성하고 다음 두 가지를 변경해주어야 합니다.
제가 사용한 버전은 Atmel Studio 7.0이지만 다른 버전에서도 비슷한 방법으로 변경하면 가능합니다.
메뉴에서 프로젝트 – 속성을 선택한 후.
Toolchain에 아래 항목에 libprintf_flt를 추가해줍니다.
그리고 General에서 다음 부분을 체크해줍니다.
/* * atmega128-adc-example.c * * Created: 2015-12-15 오후 1:37:05 * Author : webnautes */ #define F_CPU 16000000UL //1. baud rate를 선택 #define USART_BAUDRATE 9600 //2.시스템 클록과 원하는 baud rate를 이용하여 UBRR 값을 계산한다. #define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) #include <avr/io.h> #include <util/delay.h> #include <stdio.h> void usartInit() { //3. UBRR0은 16비트 레지스터이기 때문에 8비트씩 나누어서 넣어야 한다. UBRR0H = (uint8_t)(UBRR_VALUE>>8); UBRR0L = (uint8_t) UBRR_VALUE; //4. USART 설정 UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01); //Charecter size : 8비트 UCSR0C &= ~(1<<USBS0); //stop bit : 1비트 UCSR0C &= ~((1<<UPM01)|(1<<UPM00)); // no parity mode //5. 송수신을 가능하게 한다. UCSR0B=(1<<RXEN0)|(1<<TXEN0); } void uart_putchar(uint8_t u8Data, FILE *stream ) { //이전 전송이 끝나기를 기다림 while(!(UCSR0A&(1<<UDRE0))){}; UDR0 = u8Data; } uint8_t uart_getchar( FILE *stream) { // 수신 되기를 기다림 while(!(UCSR0A&(1<<RXC0))){}; return UDR0; } //http://www.appelsiini.net/2011/simple-usart-with-avr-libc FILE uart_output = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); FILE uart_input = FDEV_SETUP_STREAM(NULL, uart_getchar, _FDEV_SETUP_READ); int main(void) { //ADC init ADMUX |= (0<<REFS1 | 1<<REFS0); //기준전압으로 AVCC 사용 //ADC 입력채널 선택 ADC0(PF0) ADMUX &= ~( (1<<MUX4) | (1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0) ); ADCSRA |= (1<<ADEN); //ADC 기능 활성화 // 16Mhz/128 = 125Khz, ADC의 입력 클록 주파수 ADCSRA |= ((1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)); usartInit(); stdout = &uart_output; stdin = &uart_input; while (1) { ADCSRA |= (1<<ADSC); //ADC 변환 시작 //ADC 변환이 완료되면 자동으로 ADSC는 0이 되기 때문에 이렇게 대기한다. while(ADCSRA & (1<<ADSC)); unsigned char low = ADCL; unsigned char high = ADCH; int temperature = (high << 8) | low; float result = temperature * 5.0/1024*100; char str[256]; sprintf( str, "temperature %4.2f\r\n", result ); printf( str ); _delay_ms(100); } } |
실행결과가 너무 빨리나와서 100ms 정도 딜레이를 주고 출력해봤습니다.
참고로 LM35의 핀아웃은 아래와 같습니다. Vout을 PF0에 연결해서 센서값을 얻어왔습니다.
2015. 12. 17 최초작성
반응형
'AVR > Atmega128 강좌' 카테고리의 다른 글
Atmega128 기초 - 시리얼 통신( USART ) (0) | 2023.10.13 |
---|---|
Atmega128 기초 – ADC(Analog to Digital) 변환 (0) | 2023.10.13 |
Atmega128 기초 - 8비트 타이머/카운터 Phase Correct PWM 모드 (0) | 2016.06.21 |
Atmega128 기초 - 8비트 타이머/카운터 Fast PWM 모드 (7) | 2016.06.21 |
Atmega128 기초 - 8비트 타이머/카운터 CTC 모드 (0) | 2016.06.18 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!