Lv. 83 (전무) 70,159 납
26%
Exp. 69,331/70,560 | 26%
회원가입 ID/PW 찾기
AA

제가 사용하는 uc는 AVR128입니다. 이걸로 적외선 센서를 ADC하고있습니다. 센서는 총 발광(5파이) 수광(흑색3파이) 해서 6조입니다.
그리고 컴파일러는 Avrstudio4.13과 AVR-GCC 2007 5월 25일짜를 연동해서 쓰고있습니다.

본론으로 들어가서 제가 필요한 레졸루션값은 센서 6개를 더하고빼고 곱하고 나두고 해도 -150에서 150사이면 되기때문에 AVR128의 10비트의 값은 필요가 없습니다.
그래서 8비트의 256값 정확히는 0부터 255값이면 충분할것 같습니다.

발광을 50us 키고 250us 끄고 이렇게해서 펄스구동을 하고 수광부는 하이패스필터로 읽습니다.
그럼 50us 사이에 수광을 한번 샘플링을 해야하는데 128분주 샘플링을 하면 총 샘플링 시간이 104us정도 걸리는데 그럼 안되는 거잖아요.
그래서 샘플링을 하는 시간을 좀더 줄이고 싶은데 우선 제가 알기로는 샘플링 비트를 좀더 낮게 쓰면 샘플링 시간을 줄일수 있다고 알고있습니다.
10비트 분해능으로 쓸려면 최소한 128분주를 해야 된다고 알고있는데요. 8비트 분해능으로 60us정도 안에 한번 샘플링이 가능하게 할수 있을까요?
그렇게 하려면 최소한 밑에 것이 해결 되야 될거 같은데요;

ADCMUX의 ADLAR=1로 셋트해서 하위 2비트 값을 버리고 쓸려고합니다.
그럼 필요한 ADCH만 읽어오면 되겠죠. 근데 특성상 하위 바이트를 읽고 상위바이트를 읽어야 합니다. 여기서 질문!

result[i]=ADCH; 이렇게만 쓰면 데이터가 안읽혀 지나요? 실험상은 안되는것 같습니다. 방법이 있으면 좀 부탁드리구요.
상위 바이트만 읽어도 되게끔 할수 있을까요?

result[i]=(ADCL+ADCH*256)>>2; 이렇게 해서 쓰면 제가 위에서 하려고 했던거와 다를게 없는 결과 값을 얻을수 있을까요?
근데 이렇게 되면 어차피 10비트로 샘플링하는거기때문에 제가 얻으려고 하는 본래의 값은 아닌거 같구요 샘플링 시간이 문제니..

레지스터 셋팅을 보고 또봐도 8비트로 샘플링값을 셋팅하는건 없는것 같구요.

그냥 ADCH값을 읽으면 절대로 안나옵니다.

말이 길었는데요.. 문제의 요지는 50us~60us 시간동안 8비트의 샘플링값을 얻을수 있느냐가 관건입니다.
아무리 생각해도 답이 안나오네요 ㅠㅡㅠ 도와주세요.

 

댓글 7
  • No Profile
    그럼 50us 사이에 수광을 한번 샘플링을 해야하는데 128분주 샘플링을 하면 총 샘플링 시간이 104us정도 걸리는데 그럼 안되는 거잖아요.

    한번에 수발광 깜박임으로 전체 6개를 하기는 어렵고 또한 그러케 하면 각 값마다 오차가 많으므로 보정을 해줘야 합니다.

    한번 깜박임에 센서 하나씩 샘플링해서 센서개수만큼 샘플링하는게 나을거 같습니다.

    8비트로 쓴다고 해도 이미 avr의 처리속도는 정해져있으니 어쩔수 없습니다.

    더 고속의 adc를 원한다면 외부에 추가로 연결해서 사용하시면 됩니다.

    result[i]=ADCH;

    이러케 하면 ADCH에 있는 값을 RESULT변수에 저장하게 되는데요 아마 값이 저장이 안된다면 ADC레지스터 설정부분이 문제가 있을겁니다.

    ADC 레지스터 세팅 모드보면 8비트 모드가 있습니다. 이걸로 세팅하시면 8비트 모드 됩니다.

    결론, 최대속도로 하면 50US안에 샘플링을 할수는 있지만 값이 좀 불안정할 수 있습니다.

  • No Profile
    글쓴이 레드리네 07.09.19 19:42 댓글 좋아요 0 싫어요 0

     물론 지금 센서 하나를 샘플링 하는시간이 104us 라는건데요; 제가 그말을 안했군요;
    센서 하나를 샘플링하는데 걸리는 시간을 50us 로 총 6조면 300us가 되는데요.
    센서가 꺼져있는 250us의 시간을 감안 한다면 총 6조의 ADC가 완료가 되는 시간은 1800us 즉 1.8ms정도 되는건데요;
    발광이 한번 켜져있다가 꺼지는 타임 이 총 300us입니다.이게 센서 한개를 샘플링하는시간이 되겠구요.
    그럼 이 300us의 시간 안에 8비트의 ADC데이터를 얻을수 있냐는 건데요..

    8bit로 셋팅을 하려면 어케 해야 할까요? 총10비트 샘플링해서 2비트를 버리는거말고 제가 원하는건 0v~5v총 8bit가 나오는걸 원하는데요. 이셋팅이 있다구요? 저는 못찾겠습니다 ㅠㅡㅠ

  • No Profile

    제 기억에는 8비트모드로 세팅하는 레지스터가 있었던거 같습니다..근데 8비트로 세팅하든 10비트로 하든 속도는 차이가 없을겁니다. 104uS는 안정적으로 adc할수 있는 최소시간입니다.

    300us이내에 한개의 센서 샘플링은 할수 있겠지요..

    제가 데이터쉬트를 볼수 잇는 상황이 아니라서 레지스터는 정확히 못집어 드리겠숩니다..

    10비트 값 / 4 해도 8비트로 변경이 되긴 하지요^^;

  • No Profile
    글쓴이 레드리네 07.09.19 21:58 댓글 좋아요 0 싫어요 0

    변경은 되도 ㅎ 제가 원하는값은 얻을수가 없네요 ㅎ
    느려도 10비트로 계속 써야 겠네요 ㅎ
    1023 나누고 더하고 곱하고 해서 원하는값으로 빼야겠네요 ㅎ

  • No Profile

    허접한 저 생각이지만 하위 비트를 버리실려면 result[i]=ADCH 보다 result[i]=ADCW 로 불러와서 쉬프트로 날려버리는게

    낮지 않을까요 ㅋㅋ 저의 생각이에요 ㅋㅋ

  • No Profile
    result[i]=ADCW

    adcw도 실제로는 컴파일러에서 정의된 메크로에요^^; 컴파일러마다 있는것도 있고 없는것도 있고요;;

    자기가 직접 매크로 정의해서 사용해도 되고요^^
  • No Profile
    글쓴이 레드리네 07.09.26 16:57 댓글 좋아요 0 싫어요 0

    ADCW는 코드비전에 있는 매크로 군요 ^^  여러모로 시도해보고 있으니 조만간 결판 날듯합니다 ㅎ
    그리고 상위 2비트를 버리는거 보다는 역시 하위 2비트를 버리는게 원화는 결과값을 얻는것 얻는데는 훨 효과적일듯하네요^^
    바로 튀는 현상이 없을거 같아요 하위 2비트를 버리면 ㅎ

하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
         PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.

search
번호 분류 제목 글쓴이 조회 수 날짜
3 머신러닝, AI & 알고리즘 HOT오목 게임 알고리즘3 새로운하늘 3458 2010.03.29
2 머신러닝, AI & 알고리즘 HOT지하철 최단거리 알고리즘은?2 지워나 2861 2008.06.20
1 머신러닝, AI & 알고리즘 HOT순차 프로그램에 대한 간단한 알고리즘과 재귀 알고리즘의 속도 테스트 - by 아크마7 아크마 3060 2007.08.08
  • 패배를 극복하는 법을 배워야 한다. 그럴때에 당신의 인격이 향상된다.
    - 닉슨
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.