Thông báo

Collapse
No announcement yet.

The R/2R DAC Ladder, Bộ DAC dùng điện trở, đơn giản, rẻ tiền mà hiệu quả

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • The R/2R DAC Ladder, Bộ DAC dùng điện trở, đơn giản, rẻ tiền mà hiệu quả

    Chào các bạn!
    Hôm nay tôi post bài về cách dùng DAC, cái này tôi đã làm thực tế và có nhiều bạn hỏi nên tôi thấy có giá trị mang ra cùng trao đổi với các bạn.
    Do là, DAC nếu là ngoại vi thì một số dòng vi điều khiển thông dụng lại không có. Nếu có thì VĐK đó khá đắt hoặc không tương thích với loại CHIP mà các bạn đã chọn. Nếu các bạn chọn loại IC DAC thì rất tốt nhưng giá khá mắc. Để sử dụng được DAC tôi chỉ dùng bộ điện trở thang R/2R và thêm UA741 làm buffer + với 7660 làm nguồn đỗi xứng. Tính ra ta làm được bộ DAC 12bit chỉ cần có 38 điện trở + UA741 + 7660 -> Tầm hơn chục ngàn = Quá tốt phải không nào!

    Về nguyên lý thì mạch được xây dựng dựa trên bộ ghép điện trở dạng thang R/2R tôi đưa vào ứng dụng thực tế sau:



    Vi điều khiển: Atmega8
    Cách ghép nối với các chân tôi làm như trên hình vẽ trên.
    Đây là kết quả:



    Test kết quả:
    Điện áp nuôi VĐK



    Giá trị xuất : 0XFFF

    Last edited by alumen86; 11-11-2013, 11:13.

  • #2
    Giá trị xuất : 0XFFF /2 = 0x7FF



    Giá trị xuất : 0X0000

    Last edited by alumen86; 11-11-2013, 11:14.

    Comment


    • #3
      Code đây các bác nhé!

      /************************************************** ***
      This program was produced by the
      CodeWizardAVR V2.05.3 Professional
      Automatic Program Generator
      ? Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
      HP InfoTech - CodeVisionAVR C Compiler

      Project :
      Version :
      Date : 10/25/2013
      Author : user
      Company : home
      Comments:


      Chip type : ATmega8
      Program type : Application
      AVR Core Clock frequency: 16.000000 MHz
      Memory model : Small
      External RAM size : 0
      Data Stack size : 256
      ************************************************** ***/
      #include <mega8.h>
      #include <delay.h>
      #include <stdlib.h>
      #include <string.h>

      #define LBS PORTB.5
      #define B0 PORTB.5
      #define B1 PORTB.4
      #define B2 PORTB.3
      #define B3 PORTB.2
      #define B4 PORTB.1
      #define B5 PORTB.0

      #define B6 PORTD.7
      #define B7 PORTD.6
      #define B8 PORTD.5
      #define B9 PORTD.4
      #define B10 PORTD.3
      #define B11 PORTD.2
      //#define MBS PORTD.2

      union my_dac{
      struct s_bit
      {
      char b0:1;
      char b1:1;
      char b2:1;
      char b3:1;
      char b4:1;
      char b5:1;
      char b6:1;
      char b7:1;
      char b8:1;
      char b9:1;
      char b10:1;
      char b11:1;
      } b;
      unsigned int value;
      } dac;

      void put_dac(unsigned int v_in)
      {
      dac.value = v_in;
      B0 = dac.b.b0;
      B1 = dac.b.b1;
      B2 = dac.b.b2;
      B3 = dac.b.b3;
      B4 = dac.b.b4;
      B5 = dac.b.b5;
      B6 = dac.b.b6;
      B7 = dac.b.b7;
      B8 = dac.b.b8;
      B9 = dac.b.b9;
      B10 = dac.b.b10;
      B11 = dac.b.b11;
      }

      volatile unsigned int dacTemp = 0;

      // Standard Input/Output functions
      #include <stdio.h>

      // Declare your global variables here

      void main(void)
      {
      // Declare your local variables here

      // Input/Output Ports initialization
      // Port B initialization
      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
      PORTB=0x00;
      DDRB=0xFF;

      // Port C initialization
      // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
      // State6=T State5=T State4=T State3=T State2=T State1=T State0=T
      PORTC=0x00;
      DDRC=0x00;

      // Port D initialization
      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
      PORTD=0x00;
      DDRD=0xFF;

      // Timer/Counter 0 initialization
      // Clock source: System Clock
      // Clock value: Timer 0 Stopped
      TCCR0=0x00;
      TCNT0=0x00;

      // Timer/Counter 1 initialization
      // Clock source: System Clock
      // Clock value: 2000.000 kHz
      // Mode: Normal top=0xFFFF
      // OC1A output: Discon.
      // OC1B output: Discon.
      // Noise Canceler: Off
      // Input Capture on Falling Edge
      // Timer1 Overflow Interrupt: Off
      // Input Capture Interrupt: Off
      // Compare A Match Interrupt: Off
      // Compare B Match Interrupt: Off
      TCCR1A=0x00;
      TCCR1B=0x02;
      TCNT1H=0x00;
      TCNT1L=0x00;
      ICR1H=0x00;
      ICR1L=0x00;
      OCR1AH=0x00;
      OCR1AL=0x00;
      OCR1BH=0x00;
      OCR1BL=0x00;

      // Timer/Counter 2 initialization
      // Clock source: System Clock
      // Clock value: Timer2 Stopped
      // Mode: Normal top=0xFF
      // OC2 output: Disconnected
      ASSR=0x00;
      TCCR2=0x00;
      TCNT2=0x00;
      OCR2=0x00;

      // External Interrupt(s) initialization
      // INT0: On
      // INT0 Mode: Any change
      // INT1: Off
      GICR|=0x40;
      MCUCR=0x01;
      GIFR=0x40;

      // Timer(s)/Counter(s) Interrupt(s) initialization
      TIMSK=0x00;
      /*
      // USART initialization
      // Communication Parameters: 8 Data, 1 Stop, No Parity
      // USART Receiver: Off
      // USART Transmitter: On
      // USART Mode: Asynchronous
      // USART Baud Rate: 9600
      UCSRA=0x00;
      UCSRB=0x08;
      UCSRC=0x86;
      UBRRH=0x00;
      UBRRL=0x67;
      */
      // Analog Comparator initialization
      // Analog Comparator: Off
      // Analog Comparator Input Capture by Timer/Counter 1: Off
      ACSR=0x80;
      SFIOR=0x00;

      // ADC initialization
      // ADC disabled
      ADCSRA=0x00;

      // SPI initialization
      // SPI disabled
      SPCR=0x00;

      // TWI initialization
      // TWI disabled
      TWCR=0x00;

      // Watchdog Timer initialization
      // Watchdog Timer Prescaler: OSC/2048k
      #pragma optsize-
      WDTCR=0x1F;
      WDTCR=0x0F;
      #ifdef _OPTIMIZE_SIZE_
      #pragma optsize+
      #endif

      // Global enable interrupts
      #asm("sei")

      put_dac(4094/2);
      while(1)
      {
      test++;
      #asm("wdr");
      put_dac(0);
      delay_ms(4);
      };

      Comment

      Về tác giả

      Collapse

      alumen86 Tìm hiểu thêm về alumen86

      Bài viết mới nhất

      Collapse

      Đang tải...
      X