اطلاعیه

Collapse
No announcement yet.

مشکل با adc در mega32

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

    مشکل با adc در mega32

    سلام
    من دارم رو یه پروژه کار می کنم که نیاز دارم ولتاژ یه ترمیستور رو بخونم و بر اساس اون یه با pid یه موج pwm بسازم جهت کنترل دما.

    اما adc ولتاژ ترمیستور رو نمی خونه. , pwm با همون مقدار اولیه که دادم کار می کنه.

    برنامه به این شکله که تو بدنه اصلی برنامه اول pwm با یه مقدار اولیه راه می افته. adc پیکره بندی میشه و وقفه ی اتمام adc فعال می شه-سپس خود adc استارت میشه.

    تو وقفه اتمام adc مقدار جدید ocr بر اساس مقدار خوانده شده محاسبه شده و ذخیره می شه. سپس وقفه تطابق تایمر(برای pwm) فعال میشه.

    تو وقفه تطابق تایمر مقدار جدید ocr اعمال شده ، وقفه تطابق تایمر غیر فعال میشه.

    ولتاژ مرجع adc رو avcc انتخاب کردم که با سلف و خازن از vcc وصل شده.

    نکته قابل ذکر اینه که ولتاژ آنالوگ بین 2 تا 5 ولته- آمما جریانی که می تونه به adc بده زیر یک میلی آمپره. چون ترمیستور 10کیلو اهمه که ولتاژ 5 ولت روشه. یعنی جریانش حدود نیم میلی آمپره.
    اگه کسی میتونه راهنمایی کنه ممنون می شم.
    اینهم کد من:

    #2
    پاسخ : مشکل با adc در mega32


    #include <mega32.h>
    #define xtal 8000000

    int adc_in=0x00;
    float err=0x00;
    float ern=0x00;
    int si=0x00;
    int u=0x0380;;

    interrupt [ADC_INT] void adc_int_isr(void)
    {
    adc_in = ADCW;
    ern = err;
    err = 0x01FF - adc_in;

    //calculate u
    si+=err;
    u=(2.93*err)+(9.45*si);
    if (u>=0x03FF){
    u=0x03FF;
    }

    if (u<=0x0330){
    u=0x0330;
    }


    TIMSK = 0x08;//enable OCF1B

    }

    interrupt [TIM1_COMPB] void timer1_compb_isr(void)
    {
    OCR1B = u;

    TIMSK = 0x00;//disable OCF1B

    ADCSRA |= 0x40;
    }

    void main(void)
    {
    //section 1: pwm start on set point value: OCR=900

    PORTD=0x00;
    DDRD=0x10;

    //fast PWM 10bit - OC1A: disconnected - OC1B: None-Inverted

    TCCR1A = 0x23;
    TCCR1B = 0x0A;

    OCR1BH = 0x03;
    OCR1BL = 0x84;

    //section 2: config ADC
    //single mode - interrupt enable - prescale 64
    //pin ADC(0) as input - ADC ref : AVCC



    PORTA = 0x00;
    DDRA = 0x00;

    ADMUX = 0x40; // set ADC(0) as input pin - ADC ref : AVCC
    ADCSRA = 0x8E; // ADEN, ADIE, prescale:64

    //start ADC conversion
    #asm("sei&quot
    ADCSRA |= 0x40;

    while(1);
    }

    دیدگاه

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