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 최초작성
반응형