اطلاعیه

Collapse
No announcement yet.

ADC & LM35

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

    ADC & LM35

    سلام و خسته نباشید خدمت دوستان
    من این کد رو نوشتم ولی مشکل داره اینم اینه که دما رو نشون نمیده و روی LCD مینویسه :
    Temp 'C
    اما تاریخ و ساعت رو نشون میده درست .
    به تنهایی هم برنامه ی ADC رو نوشتم ولی نشون نمیداد دما رو میداد 500.0'C تغییر هم نمیکد .
    با مولتی متر هم ولتاژ خروجی ی LM35 رو اندازه گرفتم 291 mV بود.
    کمکم کنید ممنون میشم
    این هم کد :

    Chip type : ATmega16L
    Program type : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 256
    ************************************************** ***/

    #include <mega16.h>
    #include <delay.h>
    #include <stdio.h>
    #include <stdlib.h>

    // I2C Bus functions
    #asm
    .equ __i2c_port=0x18 ;PORTB
    .equ __sda_bit=0
    .equ __scl_bit=1
    #endasm
    #include <i2c.h>

    // DS1307 Real Time Clock functions
    #include <ds1307.h>

    // Alphanumeric LCD Module functions
    #asm
    .equ __lcd_port=0x15 ;PORTC
    #endasm
    #include <lcd.h>

    #include <delay.h>

    #define ADC_VREF_TYPE 0x00

    // Read the AD conversion result
    unsigned int read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);
    // Start the AD conversion
    ADCSRA|=0x40;
    // Wait for the AD conversion to complete
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCW;
    }

    // Declare your global variables here

    void main(void)
    {
    // Declare your local variables here
    char str[10],lcdgo[10];
    float tf;
    unsigned char h,m,s,y,mo,d;
    char buffer[50];


    PORTA=0x00;
    DDRA=0x00;

    PORTB=0x00;
    DDRB=0x80;

    PORTC=0x00;
    DDRC=0x08;

    PORTD=0x00;
    DDRD=0x00;

    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;

    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;

    MCUCR=0x00;
    MCUCSR=0x00;

    TIMSK=0x00;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;

    // ADC initialization
    // ADC Clock frequency: 125.000 kHz
    // ADC Voltage Reference: AREF pin
    // ADC Auto Trigger Source: None
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x86;

    i2c_init();
    rtc_init(0,0,0);
    lcd_init(16);
    while (1)
    {
    // Place your code here
    rtc_get_time(&h,&m,&s);
    rtc_get_date(&y,&mo,&d);
    sprintf(buffer,"%2u:%2u:%2u",h,m,s);
    lcd_gotoxy(0,0);
    lcd_puts(buffer);
    sprintf(buffer,"%2u/%2u/%2u",y,mo,d);
    lcd_gotoxy(0,1);
    lcd_puts(buffer);
    delay_ms(200);
    if (PIND.4 == 0)
    {
    PORTC.3 = ~PINC.3;
    };
    if (PIND.5 == 0)
    {
    tf=read_adc(0);
    tf=(tf*500/1023);
    ftoa(tf,2,str);
    sprintf(lcdgo,"temp %2 \xdfC",str);
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_puts(lcdgo);
    delay_ms(2000);
    lcd_clear();

    }

    };
    }

    #2
    پاسخ : ADC & LM35

    سلام دادا.
    فکر کنم مشکل توی سخت افزارته. در برنامه ولتاژ رفرنس رو روی پین Aref گذاشتی. آیا به پایه Aref ولتاژ دادی؟
    تشکر لازم نیست!

    دیدگاه


      #3
      پاسخ : ADC & LM35

      بله با COdewizard روی AREF قرار هست در مدار هم با خازن 100nf به زمین وصل شده

      دیدگاه


        #4
        پاسخ : ADC & LM35

        سلام دادا.

        اشتباه از همینجاست. اما مهم نیست. بگو پایه AVCC میکرو رو به چی دادی دادا؟
        تشکر لازم نیست!

        دیدگاه


          #5
          پاسخ : ADC & LM35

          سلام عزیز جان
          AVCC رو با سلف 10uH به Vcc وصل کردم و با یک خازن 100nf به زمین

          دیدگاه


            #6
            پاسخ : ADC & LM35

            خوب حله دادا.

            کافیه توی کدویژن ولتاژ رفرنس رو بذاری روی Avcc . من این قسمتو میذارم برات. شما فقط جایگزین کن.

            کد:
            [left]
            // ADC initialization
            // ADC Clock frequency: 125.000 kHz
            // ADC Voltage Reference: AVCC pin
            ADMUX=ADC_VREF_TYPE & 0xff;
            ADCSRA=0x84;
            [/left]
            اگه نشد خودت یه بار دیگه برنامت رو بساز.
            موفق باشید.
            تشکر لازم نیست!

            دیدگاه


              #7
              پاسخ : ADC & LM35

              این قسمت درست شد ممنونم :applause:
              مرسی که کمکم میکنید
              من اگه بخوام این زمان رو به همراه دما در eeprom ذخیره کنم باید بک struc بسازم تا وقتی یک مبکروسئیچ رو زدیم روی LCD نشون بده. حالا چند تا از این ساختمان ها رو میتونم بسازم ؟؟چقدر در eeprom mega 16 جا میشه؟؟؟؟دقیقا نمیدونم باید چیکار کنم؟!

              دیدگاه


                #8
                پاسخ : ADC & LM35

                سلام دادا.
                کاری نداره. توی کدویژن فقط کافیه قبل از نوع متغیر بنویسی eeprom. مثلاً eeprom char i; اونوقت توی eeprom ذخیره میشه. مقدار eeprom میکروها متفتوته و باید از توی datasheet ببینی. مثلاً در مگا 16 این مقدار 512 بایته که معادل 4096 بیته.
                تشکر لازم نیست!

                دیدگاه

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