AVR/Atmega128 강좌

Atmega128 ADC예제 - lm35 온도 센서값 시리얼로 출력하기

webnautes 2023. 10. 8. 09:00
반응형

실수를 시리얼 포트를 통해 출력하려면 프로젝트를 생성하고 다음 두 가지를 변경해주어야 합니다. 

제가 사용한 버전은 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 최초작성



반응형