اطلاعیه

Collapse
No announcement yet.

تداخل در adc

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    تداخل در adc

    با سلام
    خدمت اساتید و دوستان محترم
    بنده قصد دارم با استفاده از واحد adc میکروکنترلر atmega8 ، سنسور نور(LDR) و دما (lm35) را راه اندازی کنم.منتها مشکل اینجاست که هنگام راه اندازی، دو کانال با هم تداخل دارند.یعنی با کاهش نور مقدار دما هم کاهش می یابد. لطفا راهنمایی بفرمایید که این مشکل را چه طور حل کنم.
    با تشکر

    #2
    پاسخ : تداخل در adc

    سلام
    لطفا اطلاعات بیشتری هنگام سوال پرسیدن ارائه کنید
    مثلا کد برنامه...
    اینطوری نمیشه راهنمایی کرد...
    تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

    www.intelart.ir


    ساخت کنترلر دما PID فازی با AVR [آموزشی]

    دیدگاه


      #3
      پاسخ : تداخل در adc

      از دیلی استفاده کن و کلاک adc رو کم کن و چک کن

      دیدگاه


        #4
        پاسخ : تداخل در adc

        نوشته اصلی توسط electronic_2222 نمایش پست ها
        از دیلی استفاده کن و کلاک adc رو کم کن و چک کن
        متاسفانه فایده ای نداشت، نور که کم می شود، مقدار دما هم کم می شود.
        #include <mega8.h>
        #include <delay.h>


        #define DATA_REGISTER_EMPTY (1<<UDRE)
        #define RX_COMPLETE (1<<RXC)
        #define FRAMING_ERROR (1<<FE)
        #define PARITY_ERROR (1<<UPE)
        #define DATA_OVERRUN (1<<DOR)

        // USART Receiver buffer
        #define RX_BUFFER_SIZE 8
        char rx_buffer[RX_BUFFER_SIZE];

        #if RX_BUFFER_SIZE <= 256
        unsigned char rx_wr_index=0,rx_rd_index=0;
        #else
        unsigned int rx_wr_index=0,rx_rd_index=0;
        #endif

        #if RX_BUFFER_SIZE < 256
        unsigned char rx_counter=0;
        #else
        unsigned int rx_counter=0;
        #endif

        // This flag is set on USART Receiver buffer overflow
        bit rx_buffer_overflow;

        // USART Receiver interrupt service routine
        interrupt [USART_RXC] void usart_rx_isr(void)
        {
        char status,data;
        status=UCSRA;
        data=UDR;
        if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
        {
        rx_buffer[rx_wr_index++]=data;
        #if RX_BUFFER_SIZE == 256
        // special case for receiver buffer size=256
        if (++rx_counter == 0) rx_buffer_overflow=1;
        #else
        if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
        if (++rx_counter == RX_BUFFER_SIZE)
        {
        rx_counter=0;
        rx_buffer_overflow=1;
        }
        #endif
        }
        }

        #ifndef _DEBUG_TERMINAL_IO_
        // Get a character from the USART Receiver buffer
        #define _ALTERNATE_GETCHAR_
        #pragma used+
        char getchar(void)
        {
        char data;
        while (rx_counter==0);
        data=rx_buffer[rx_rd_index++];
        #if RX_BUFFER_SIZE != 256
        if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
        #endif
        #asm("cli")
        --rx_counter;
        #asm("sei")
        return data;
        }
        #pragma used-
        #endif

        // USART Transmitter buffer
        #define TX_BUFFER_SIZE 8
        char tx_buffer[TX_BUFFER_SIZE];

        #if TX_BUFFER_SIZE <= 256
        unsigned char tx_wr_index=0,tx_rd_index=0;
        #else
        unsigned int tx_wr_index=0,tx_rd_index=0;
        #endif

        #if TX_BUFFER_SIZE < 256
        unsigned char tx_counter=0;
        #else
        unsigned int tx_counter=0;
        #endif

        // USART Transmitter interrupt service routine
        interrupt [USART_TXC] void usart_tx_isr(void)
        {
        if (tx_counter)
        {
        --tx_counter;
        UDR=tx_buffer[tx_rd_index++];
        #if TX_BUFFER_SIZE != 256
        if (tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
        #endif
        }
        }

        #ifndef _DEBUG_TERMINAL_IO_
        // Write a character to the USART Transmitter buffer
        #define _ALTERNATE_PUTCHAR_
        #pragma used+
        void putchar(char c)
        {
        while (tx_counter == TX_BUFFER_SIZE);
        #asm("cli")
        if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
        {
        tx_buffer[tx_wr_index++]=c;
        #if TX_BUFFER_SIZE != 256
        if (tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
        #endif
        ++tx_counter;
        }
        else
        UDR=c;
        #asm("sei")
        }
        #pragma used-
        #endif

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

        #define FIRST_ADC_INPUT 0
        #define LAST_ADC_INPUT 1
        unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
        // Voltage Reference: AREF pin
        #define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR))

        // ADC interrupt service routine
        // with auto input scanning
        interrupt [ADC_INT] void adc_isr(void)
        {
        static unsigned char input_index=0;
        // Read the AD conversion result
        adc_data[input_index]=ADCW;
        // Select next ADC input
        if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
        input_index=0;
        ADMUX=(FIRST_ADC_INPUT | ADC_VREF_TYPE)+input_index;
        // Delay needed for the stabilization of the ADC input voltage
        delay_us(100);
        // Start the AD conversion
        ADCSRA|=(1<<ADSC);
        }

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

        // Input/Output Ports initialization
        // Port B initialization
        // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
        DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
        // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
        PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

        // Port C initialization
        // Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
        DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
        // State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
        PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

        // Port D initialization
        // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
        DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
        // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
        PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

        // Timer/Counter 0 initialization
        // Clock source: System Clock
        // Clock value: Timer 0 Stopped
        TCCR0=(0<<CS02) | (0<<CS01) | (0<<CS00);
        TCNT0=0x00;

        // Timer/Counter 1 initialization
        // Clock source: System Clock
        // Clock value: Timer1 Stopped
        // Mode: Normal top=0xFFFF
        // OC1A output: Disconnected
        // OC1B output: Disconnected
        // 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=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
        TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
        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=0<<AS2;
        TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
        TCNT2=0x00;
        OCR2=0x00;

        // Timer(s)/Counter(s) Interrupt(s) initialization
        TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);

        // External Interrupt(s) initialization
        // INT0: Off
        // INT1: Off
        MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);

        // USART initialization
        // Communication Parameters: 8 Data, 1 Stop, No Parity
        // USART Receiver: On
        // USART Transmitter: On
        // USART Mode: Asynchronous
        // USART Baud Rate: 9600
        UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
        UCSRB=(1<<RXCIE) | (1<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
        UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
        UBRRH=0x00;
        UBRRL=0x33;

        // Analog Comparator initialization
        // Analog Comparator: Off
        // The Analog Comparator's positive input is
        // connected to the AIN0 pin
        // The Analog Comparator's negative input is
        // connected to the AIN1 pin
        ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);

        // ADC initialization
        // ADC Clock frequency: 62.500 kHz
        // ADC Voltage Reference: AREF pin
        ADMUX=FIRST_ADC_INPUT | ADC_VREF_TYPE;
        ADCSRA=(1<<ADEN) | (1<<ADSC) | (0<<ADFR) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
        SFIOR=(0<<ACME);

        // SPI initialization
        // SPI disabled
        SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

        // TWI initialization
        // TWI disabled
        TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

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

        while (1)
        {
        printf("%d %d \n",adc_data[0],adc_data[1]);
        delay_ms(500);

        }
        }


        جدیدترین ویرایش توسط a.valinezhad; ۱۲:۳۶ ۱۳۹۵/۰۶/۱۲.

        دیدگاه


          #5
          پاسخ : تداخل در adc

          سلام
          برنامت چک کن ببین adc رو در مد دیفرانسیلی راه اندازی نکردی؟ که این مشکل پیش اومده
          امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

          دیدگاه


            #6
            پاسخ : تداخل در adc

            دوست عزیز ایا مشکلتون برطرف شد یا نه؟
            اگه نه فکر کنم بدونم راه حل چیه!

            دیدگاه

            لطفا صبر کنید...
            X