뉴티씨



  • HOME
  • 고객지원
  • 질문답변

 

 
ad변환질문
 글쓴이 : 관리자
작성일 : 18-03-20 19:31
조회 : 8,557  
안녕하세요? 고객님,
저희 뉴티씨 제품을 이용하여 주셔서 감사합니다.

AVR에서 ADC할 때에 ADMUX랑 ADCSRA 레지스터 설정하고  100us 정도 딜레이를 줘야 합니다.
또한, ADC가 인에이블되고나서, ADCSRA에서 ADSC를 쓰고 나서는 첫번째 변환에서는 25 클럭사이클이 걸립니다만, 보통때는 13 ADC클럭이 걸립니다. 변환중에 값을 읽게되면, 당연히 전번것을 가져오게 됩니다.
안그러면, 칩의 시그널이 안정화가 안되서 조금씩 밀리게 됩니다.

감사합니다.



>
>
> #include <avr/io.h>
>
> #define F_CPU 8000000UL
>
> #include <avr/interrupt.h>
>
> #include <avr/iom8a.h>
>
> #include <util/delay.h>
>
> #include <string.h>
>
> #include <stdio.h>
>
>
>
>
>
> int main(void)
>
> {
>
>  int al, ah;
>
>  int ad_val = 0;
>
>
>
>  DDRB = 0xff; //port B를 전부다 출력으로 씀
>
>  DDRC = 0x00; //port C를 전부다 입력으로 씀
>
>
>
>
>
>  PORTB = 0xff;//포트b첫출력 ff로 LED꺼짐
>
>
>
>  UCSRA = 0x00;//통신설정
>
>  UCSRB = 0x18;//수신 및 송신 인에이블
>
>  UCSRC = 0x06;//비동기모드 및 전송비트수 8비트 설정
>

>
>  UBRRH = 0;
>
>  UBRRL = 25; //8mhz크리스탈 보레이트 19200
>

>
>  //----------------------AD변환설정----------------------
>
>  ADMUX = 0x40;//단극성 PC0입력 및 외부의 AVCC단자로 입력된 전압을 사용
>
>  ADCSRA = 0x87;//변환대기 10000111(맨 앞의 1비트는 ADEN으로 1이면 동작허용 0이면 동작정지 / 마지막111은 분주비 결정 111의 분주비는 128)
>
>  //------------------------------------------------------------------
>

>
>  str[0] = 0x05;
>
>  str[1] = 0x52;
>
>  str[2] = 0x04;
>
>
>

>
>    /* Replace with your application code */
>
>    while (1)
>
>    {
>
>  for(int i=0; i<3; i++)
>
>  {
>
>   
>
>    while((UCSRA & 0x80) == 0);
>
>    ch_str[i] = UDR;
>
>   
>
>    if(ch_str[i] != str[i])
>
>    {
>
>    break;
>
>    }
>
>    else
>
>    {
>
>
>
>    if(i==2)
>
>    {
>
>      ADCSRA = 0xc7;//변환시작
>
>      while((ADCSRA & 0x10) == 0);
>
>      ad_val = (int)ADCL;
>
>      ad_val |= ((int)ADCH << 8);
>
>     
>
>      ah = ad_val >> 8;
>
>      al = ad_val % 256;
>
>     
>
>     
>
>      while((UCSRA & 0x20) == 0);
>
>      UDR = 0x06;
>
>     
>
>      while((UCSRA & 0x20) == 0);
>
>      UDR = 0x44;
>
>     
>
>      while((UCSRA & 0x20) == 0);
>
>      UDR = ah;
>
>     
>
>      while((UCSRA & 0x20) == 0);
>
>      UDR = al;
>
>     
>
>      while((UCSRA & 0x20) == 0);
>
>      UDR = 0x04; 
>
>
>
>    }
>
>    }
>
>  }
>

>
>    }
>
> }
>
> atmega8a 사용중입니다.
>
> 코드는 위와 같구요.  가변저항값을 받아서 통신으로 뿌려주는 코드입니다.
>
>
> 통신으로 0x05 0x52 0x04 3바이트를 받으면 0x06 0x44 0x??(변환값상위비트) 0x??(변환값하위비트) 0x04 5바이트를 보내는 코드입니다.
>
>
> 다 정상적으로 동작하는데 한가지 문제가 있습니다.
>
> 예를들어 처음 통신을 했을떄 가변저항값이 03aa였습니다.
>
> 가변저항을 02aa로 변경후 통신을하면 03aa가 들어오고
>
> 이상태에서 가변저항을 한번더 01aa로 변경하고 통신을 하면 그제서야 02aa가 들어옵니다.
>
> 가변저항 변화없이 한번더 보내면 01aa가 들어옵니다.
>
> 이런식으로 한단계씩 이전 데이터가 들어오는데
>
> 이유가 뭘까요?
>
>
> 알고리즘이 돌아가는 순서는 중간중간 통신을 넣어서 확인해보았는데 순서대로 잘돌아가는데.... 이유를 도통 모르겠습니다.
>

 
   
 

 


1