Skip to content
TUWLAB.com
모든 게시물에 대하여 '링크'
방식의 퍼가기만 허용합니다.
한양대학교 전자통신컴퓨터공학부
바라미
  • 132
  • 2712265
DNS Powered by DNSEver.com
AVR

ATmega의 ADC에서 결과를 읽을 때 주의할 점

Posted 2010. 02. 18 Updated 2015. 05. 31 Views 14684 Replies 0

가변저항을 ADC로 읽어서 그 값을 가지고 모터 PWM파형을 바꾸는 프로그램을 작성하고 있었습니다. 문제는 ADC를 읽는과정에서 발생했습니다.

unsigned int result = ADCL | (ADCH<<8);
unsigned int speed = 40000*result/1024;

분명히 잘 되야할 ADC 결과가 나오질 않고 result에는 이상한 값이 나오는 것이었습니다. ADC 레지스터 세팅도 몇 번 확인 했고, DDR레지스터도 거듭 확인했습니다.

혹 하드웨어 문제인가도 싶어서 테스터기로 찍어봤는데 가변저항을 돌리면 전압은 잘만 변하는 것이었습니다.

도무지 문제가 뭔지를 알 턱이 없어지자, 중요한 무엇인가를 빠뜨렸나 하고 데이터시트를 열심히 읽기 시작했습니다. 그러던 중, 문제 해결의 실마리를 발견할 수 있었습니다.

When an ADC conversion is complete, the result is found in these two registers.
When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently,
if the result is left adjusted and no more than 8-bit precision is required, it is
sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH.
The ADLAR bit in ADMUX, and the MUXn bits in ADMUX affect the way the result is
read from the registers. If ADLAR is set, the result is left adjusted. If ADLAR is cleared
(default), the result is right adjusted.

요약하면, ADCL레지스터를 먼저 읽은 후 ADCH레지스터를 읽었어야 하는데, 그 과정을 거꾸로 한 것이었습니다.

ADCL | (ADCH<<8);

에서 괄호 안의 연산이 먼저 수행되므로 ADCH가 먼저 읽혀지고, ADCL이 나중에 읽혀지게 됩니다.

ADCH를 읽는 순간 ADC레지스터의 모든 내용이 무효화되므로 ADCL을 읽으면 쓰레기값이 나오게 되는 것입니다. (게다가 Free Running Mode였으므로 바로 다음 ADC변환이 시작됩니다.)

위 구문을 다음과 같이 변환하니 모든 문제가 깔끔하게 해결되었습니다.

unsigned int resL = ADCL;
unsigned int resH = ADCH;
unsigned int result = resL | (resH<<8);
unsigned int speed = 40000*result/1024;

혹은, 16비트 가상 I/O를 지원하는 최신 AVR 컴파일러를 사용하는 경우(Atmel Studio 등), 다음과 같은 구문으로 대체할 수 있습니다.

unsigned int ADC_Result = ADC;

∴ AVR ADC 결과레지스터를 읽을 때는 하위 8비트를 먼저 읽어야 합니다.

TAG •
서비스 선택
이용중인 SNS 버튼을 클릭하여 로그인 해주세요.
SNS 계정을 통해 로그인하면 회원가입 없이 댓글을 남길 수 있습니다.
댓글
?
Powered by SocialXE

List of Articles
번호 분류 제목 글쓴이 최근 수정일 조회 수
32 AVR [AVR 강의] AVR 강의용 예제 프로그램 모음 file TUW 2017.06.02 63661
31 AVR [AVR 강의] AVR 강의자료 - 5. 아날로그-디지털 변환기(ADC) file TUW 2017.06.02 31376
30 AVR [AVR 강의] AVR 강의자료 - 4. 타이머/카운터, PWM 3 file TUW 2017.06.02 24384
29 AVR [AVR 강의] AVR 강의자료 - 3. 인터럽트 file TUW 2017.06.02 21818
28 AVR [AVR 강의] AVR 강의자료 - 6. 직렬통신(USART) file TUW 2017.06.02 21188
27 AVR [AVR 강의] AVR 강의자료 - 2. 기본 입출력 file TUW 2021.12.28 19137
26 AVR [AVR 강의] 실습보드 회로도 file TUW 2017.06.02 16237
25 AVR [온도조절 인두기] 4. 문제점 발견 - ADC 입력에 저항분압 회로를 사용할 경우 문제점 file TUW 2017.06.02 15942
24 AVR [온도조절 인두기] 6. 마지막 디버깅 - LM2575 오버슈트(Overshoot) 현상 file TUW 2021.12.28 15094
» AVR ATmega의 ADC에서 결과를 읽을 때 주의할 점 TUW 2015.05.31 14684
22 AVR [온도조절 인두기] 1. 모든 사건(?)의 발단 file TUW 2017.06.02 14607
21 AVR [온도조절 인두기] 3. 하드웨어 디버깅 file TUW 2017.06.02 13908
20 AVR [AVR 강의] AVR 강의자료 - 1. 사전준비 및 오리엔테이션 file TUW 2021.12.28 13529
19 AVR [온도조절 인두기] 5. 소프트웨어 제작 file TUW 2017.06.02 13278
18 AVR [온도조절 인두기] 2. 하드웨어 제작 file TUW 2017.06.02 13054
17 AVR [AVR 강의] AVR 강의노트 file TUW 2021.12.28 12611
목록
Board Pagination Prev 1 2 Next
/ 2

Powered by Xpress Engine / Designed by Sketchbook

sketchbook5, 스케치북5

sketchbook5, 스케치북5