회원가입 ID/PW 찾기
AA

안녕하세요

현재 사용 AVR : ATmega128
프로그램 : AVR Studio

ADC3 에 가변저항을 연결하였습니다. 그리고 PORTB 에 DAC0800 을 연결해서

가변저항 0V~5V까지 변화를 주었을때 DAC 출력에서 0V~10V로 출력되록 프로그램과

회로를 만들었습니다.  즉 가변저항이 5V일때 DAC 출력은 10V가 되도록 할려고 합니다. 

 

AREF 단자는 GND와 104로 연결하였고 AVCC단자는 5V을 연결하였습니다.

 

그런데 가변저항이 1.25V 가 되었을때 DAC 출력이 10V가 됩니다. 여기서 가변저항값을

더올리면 DAC 출력값이 0V로 떨어지고 계속 가변저항 값을 올리면 다시 10V로 올라갑니다.

가변저항이 5V가 될때까지 이런 현상이 3번 반복 하는데 이유를 모르겠습니다.

최종적으로가변저항이 5V가 되었을때는 DAC 출력값을 10V로 출력 됩니다.

 

 

프로그램

#include <avr/io.h>

void MCU_initialize(void)
{
 MCUCR = 0x80;
 XMCRA = 0x44;
 XMCRB = 0x80;

 DDRB = 0xFF;
 PORTB = 0x00;

 DDRF = 0x00;
 PORTF = 0x00;
}

void Delay_us(unsigned char time_us)
{
 register unsigned char i;
 for(i = 0; i < time_us; i++)
 {
  asm volatile("PUSH R0");
  asm volatile("POP  R0");
  asm volatile("PUSH R0");
  asm volatile("POP  R0");
  asm volatile("PUSH R0");
  asm volatile("POP  R0");
 }
}

void Delay_ms(unsigned int time_ms)
{
 register unsigned int i;
 for(i = 0; i < time_ms; i++)
 {
  Delay_us(250);
  Delay_us(250);
  Delay_us(250);
  Delay_us(250);
 }
}

int main(void)
{
 unsigned char i;
 unsigned int sum;
 float volt;


 MCU_initialize();
 Delay_ms(50);

 ADCSRA = 0x85;
 ADMUX = 0x43;
 Delay_us(150);

 while(1)
 {
  sum = 0;

  for(i=0; i<16; i++)
  {
   ADCSRA = 0xD5;
   while((ADCSRA & 0x10) != 0x10);
   sum += ADCL + ADCH*256;
   Delay_ms(1);
  }

  sum = sum >> 4;
  volt = sum*5./1024.;
  PORTB = volt;

  Delay_us(10);

 }
}

댓글 3
  • No Profile

    위의 코드에서

    sum = sum>>4;

    를 하였을 때 sum의 값은 입력 전압이 0..5V일 때 0..1024가 될 것입니다. 즉

    V_in =0   ==>  sum = 0

    V_in=1  ==> sum = 1024*1/5 = 204

    V_in=2  ==> sum = 1024*2/5 = 409

    V_in=3  ==> sum = 1024*3/5 = 614

    V_in=4  ==> sum = 1024*4/5 = 819

    V_in=4.995  ==> sum = 1024*4.995/5 = 1023

    와 같이 되겠지요.

    DAC0800의 주변 회로를 적당히 만들어서 출력이

    DAC_in = 0 ==> V_out = 0

    DAC_in = 255 ==> V_out = 10*255/256

    이 되게 하였다면,

    1024=256*4이므로 PORTB에 출력되어야 하는 값은 sum*5/1024가 아니라 sum/4 = sum>>2가 되어야 할 것입니다.

    즉 위의 코드 중

      sum = sum >> 4;
      volt = sum*5./1024.;
      PORTB = volt;

    부분을 다음과 같이 바꾸어 보시기 바랍니다.

      sum = sum >>4;

      volt = sum>>2;

      // we can combine above two lines as

      // volt = sum>>6;
      PORTB = volt;

    또한 변수 volt의 형을 float로 하지 말고 unsigned 또는 unsigned char로 바꾸시기 바랍니다.

     

    참고로, 이 경우에는 당연히 필요없는 것이기는 한데, 일반적으로 MCU 프로그램을 하면서

    float 형은 사용하지 않는 것이 좋습니다. integer 형과 float 형 사이의 형 변환은 상당히 많은

    프로그램 사이클을 요구하므로, 프로그램의 동작이 느려지게 하고 또한 code size도 불필요하게

    길어지는 문제가 있습니다.

     

     

     

     

     

     

  • No Profile

    답변 감사합니다  그러나  않되네요ㅠㅠ

    누가 좀 도와주실분 없습니까?? 플리즈~~

  • No Profile

    10BIT를 받아서 8비트로 출력하시는데.. ADC를 하위 2비트 버리시고 상위 8비트만 사용해서 그대로 출력해 주시면 어떨까요?  DAC0800 datasheet 보니깐 8bt 입력이고 0xff 일때 바로 10V 출력이 되는군요..

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

search
번호 분류 제목 글쓴이 조회 수 날짜
106 펌웨어 & 코딩언어 HOT객체지향프로그래밍4 끼르 1318 2017.06.19
105 펌웨어 & 코딩언어 HOT적외선 센서에 대한 질문입니다.3 jaemi2010 1200 2016.02.25
104 펌웨어 & 코딩언어 HOT구조체 포인터 캐스팅??1 기다려줄래 951 2015.07.10
103 펌웨어 & 코딩언어 HOTmatlab에서 작성된 m file을 c++로 변환하고 싶습니다.1 마린스토리 1143 2014.04.28
102 펌웨어 & 코딩언어 HOTC언어로된 MPPT제어 프로그램 Code Vision 으로 변환하기 찰떡젤리 1501 2014.04.21
101 펌웨어 & 코딩언어 HOTC 명령어 좀 상세히 알고 싶습니다1 jsp 1020 2014.04.03
100 펌웨어 & 코딩언어 HOT피보나치 수열..2 aNitMotD 2755 2013.10.30
99 펌웨어 & 코딩언어 HOT1D FEM coding 문제 ..원하는 답이 안나와요 수치해석미쵸 4159 2013.09.29
98 펌웨어 & 코딩언어 HOTPIC 16F628A와 CCSC 기반의 프로그래밍 질문입니다. 제발 도와주세요ㅠㅠ 신천동주민 5472 2013.09.24
97 펌웨어 & 코딩언어 HOT비주얼베이직 연산 및 줄바꿈에 대한 질문입니다.1 원할머니보고쌈 1388 2012.11.07
96 펌웨어 & 코딩언어 HOTc언어 질문인데요..3 하하하하히 1089 2012.09.10
95 펌웨어 & 코딩언어 HOTC언어제어3 tbwnaoslwj1 1262 2012.08.09
94 펌웨어 & 코딩언어 HOTmatlab 질문입니다.. 소다수1 1492 2012.06.06
93 펌웨어 & 코딩언어 HOT-(C언어(함수호출)로 만든 크리스*마스*트리*프로그램)-1 리종순2 1981 2011.12.14
92 펌웨어 & 코딩언어 HOT외부 SRAM 컨트롤하는 것좀 도와주세요.1 쩡무 4643 2011.11.15
91 펌웨어 & 코딩언어 HOTunikey program 수정 jjhuem 1614 2011.10.11
90 펌웨어 & 코딩언어 HOTAtmega128에서 Reset 하는 방법 중 궁금한 점이 있습니다!!!4 공돌이의꿈 3854 2011.06.21
89 펌웨어 & 코딩언어 HOTC언어랑 matlab의 차이?1 약곰탱이 4296 2011.06.02
88 펌웨어 & 코딩언어 HOTVHDL 전가산기 설계 질문입니다. 나트륨 5912 2011.03.26
87 펌웨어 & 코딩언어 HOTC 배열이용해서 엑셀 데이터 끌어오는 방법???2 꼬꼴리 2656 2011.03.24
  • 어떤 책들은 맛만 보고, 나머지 책들은 삼켜버리고, 몇몇 소수의 책은 잘 씹어서 소화시켜야 한다.
    - 베이컨
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.