پروژه دماسنج با استفاده از میکروکنترلر ARM

اکثر دماسنج های دیجیتال بر اساس یک سنسور دمای آنالوگ کار می کنند. سنسور دما بر حسب دما، یک خروجی آنالوگ (ولتاژ یا جریان) تولید می کند. این مقدار توسط مبدل آنالوگ به دیجیتال (ADC) به مقدار متناظر آن تبدیل می شود و پس از تبدیل و اعمال ضرایب، دما بدست می آید.

در این پروژه قصد اندازه گیری دمای محیط و نمایش آن بر روی نمایشگر LCD و همینطور نوشتن دما در پورت سریال را داریم. سنسور مورد استفاده سنسور دمای LM35 می باشد. این سنسور یک خروجی ولتاژ خطی متناسب با دمای محیط تولید می کند. به ازای تغییر هر یک درجه سانتیگراد از دمای محیط، خروجی این سنسور 10 میلی ولت تغییر می کند. این سنسور انواع مختلفی دارد که قادر به اندازه گیری دماهای مختلفی هستند بعضی از مدل ها توانایی اندازه گیری دمای -55 تا 150 درجه سانتیگراد را دارند.

در برنامه این پروژه بعد از پیکربندی بخش های مختلف در یک حلقه دوبار مقدار دما را می خوانیم و میانگین آنها را به عنوان دمای محیط بر روی نمایشگر و پورت سریال نمایش می دهیم. برای خواندن دما مقدار خروجی سنسور را با استفاده از مبدل آنالوگ به دیجیتال میکرومنترلر ARM بدست می آوریم و آن را به دمای محیط تبدیل می کنیم.

پیکربندی پروژه

در این پروژه از برد آموزشی میکروکنترلر ARM به عنوان سخت افزار مورد نیاز استفاده شده است. این برد خود دارای یک سنسور LM35 متصل به مبدل ADC می باشد. در نرم افزار این پروژه می خواهیم از پورت سریال، نمایشگر LCD، مبدل آنالوگ به دیجیتال و وقفه ی آن استفاده کنیم بنابراین باید آنها را پیکر بندی کنیم. در زیر کد مربوط به پیکربندی این بخش ها در فایل main.c را مشاهده می کنید.

TRACE_CONFIGURE(DBGU_STANDARD, 9600, BOARD_MCK);   
 
//LCD configuration
lcd_init();
lcd_clear();
lcd_gotoxy(1,1);
lcd_putsf("WWW.NAMINIC.COM");
lcd_gotoxy(2,1);
lcd_putsf("Temp: ");
 
#ifdef PINS_ADC //PINS_ADC is array of ADC pins as PIN structure (defined in board.h)
PIO_Configure(pinsADC, PIO_LISTSIZE(pinsADC));
#endif
 
//initialize ADC
ADC_Initialize( AT91C_BASE_ADC,
                AT91C_ID_ADC,
                AT91C_ADC_TRGEN_DIS,
                0,
                AT91C_ADC_SLEEP_NORMAL_MODE,
                AT91C_ADC_LOWRES_10_BIT,
                BOARD_MCK,
                BOARD_ADC_FREQ,
                10,
                1200);
 
//using ADC channel4
ADC_EnableChannel(AT91C_BASE_ADC, ADC_CHANNEL_7);
 
//enable interrupt for ADC
AIC_ConfigureIT(AT91C_ID_ADC, 0, ISR_Adc);
AIC_EnableIT(AT91C_ID_ADC);

خط 99 پورت سریال را با نرخ تبادل اطلاعات 9600 پیکربندی می کند.

خط 102 تا 107 مربوط به راه اندازی نمایشگر و نوشتن مقادیر اولیه در آن است.

خط 110 پین های مربوط به مبدل آنالوگ به دیجیتال میکرو را پیکربندی می کند.

خطوط 114 تا 126 مبدل آنالوگ به دیجیتال کانال 7 میکرو را در حالت 10 بیتی با سرعت 6 مگاهرتز (BOARD_ADC_FREQ) پیکربندی می کند.

خطوط 129 و 130 وقفه مبدل آنالوگ به دیجیتال را فعال می کند. هرگاه که ADC تبدیل را به اتمام رساند تابع ISR_Adc فراخوانی می شود.

اندازه گیری دما و نمایش آن

در زیر حلقه ی اصلی برنامه را می بینید که به صورت مداوم دما را اندازه می گیرد و نمایش می دهد.

while (1)
{
    temp1 = readTemp();
    delay_ms(200);         
    temp2 = readTemp();
    
    //average temp.
    temp1 = (temp1+temp2)/2;
 
    //write temperature in serial port
    printf("Temperature: %4.2f Cn", temp1);
    lcd_gotoxy(2,6);    //set cursor position on LCD
    sprintf(tempStr,"%4.2f ", temp1);   //write temp. in buffer for writing to LCD
    lcd_putsf(&tempStr);    //write temp in LCD
 
    //just delay
    delay_ms(500);         
}

خطوط 138 تا 143 دما را با استفاده از تابع readTemp در دو مرحله اندازه میگیرد و مقدار میانگین این دو را به عنوان دمای محیط در متغییر temp1 ذخیره می کند.

خط 146 دما را بر روی پورت سریال می نویسد. و در خط 149 دما بر روی LCD نمایش داده می شود. این کار به صورت مداوم هر 500 میلی ثانیه (خط 159) تکرار می شود.

خواندن دما از سنسور

تابع readTemp که وظیفه خواندن دما از مبدل آنالوگ به دیجیتال را دارد در زیر نمایش داده شده است.

static float readTemp()
{
    float temp=0;
    conversionDone = 0; //global variable, will set whenever ADC is done
    ADC_EnableIt(AT91C_BASE_ADC, ADC_CHANNEL_7);
    // Start measurement
    ADC_StartConversion(AT91C_BASE_ADC);
    //wait for ADC to finish
    while ( conversionDone != ((1<<ADC_CHANNEL_7)));
        
    //read ADC data
    temp = ConvHex2mV(ADC_GetConvertedData(AT91C_BASE_ADC, ADC_CHANNEL_7));
    temp = temp /10; //10mv -> 1 celsius
    
    return temp;
}

در خط 80 متغییری که نشان دهنده اتمام کار مبدل است 0 می شود و در خط 81 و 83 مبدل ADC شروع به کار می کند. خط 85 باعث می شود تا روند اجرای ادامه برنامه تا زمانی که کار مبدل تمام نشده است متوقف شود. خط 88 مقدار تبدیل شده سنسور LM35 را با استفاده از تابع ADC_GetConvertedData می خواند. از آنجا که ADC در حالت 10 بیتی تنظیم شده است، این مقدار عددی بین 0 تا 1023 خواهد بود. که در آن مقدار 0 به معنی آن است که ولتاژ تبدیل شده 0 ولت بوده است و مقدار 1023 نشان دهنده آن است که ولتاژ اندازه گیری شده برابر با ولتاژ مرجع است که در این پروژه مقدار آن 3.3 ولت می باشد. بنابراین برای آنکه مقدار ولتاژ سنسور LM35 را بر حسب میلی ولت بدست آوریم باید جدول تناسب زیر را محاسبه کنیم. این کار توسط تابع ConvHex2mV صورت می گیرد.

تبدیل مقدار خروجی مبدل انالوگ به دیجیتال به ولتاز متناظر

حال که مقدار ولتاژ خروجی سنسور LM35 را بدست آوردیم باید آن را به دما تبدیل کنیم. هر 1000 میلی ولت خروجی در LM35 نشان دهنده 100 درجه سانتیگراد است. بنابراین با یک تناسب ساده دیگر می توان دما را بدست آورد. این کار در خط 89 انجام شده است.

خطوط 63 تا 74 برنامه هم مربوط به وقفه ADC می باشد. این تابع مقدار متغییر conversionDone را ست می کند و بدین صورت تابع readTemp از اتمام کار ADC آگاه می شود و دما را می خواند.

دانلود سورس کد برنامه دماسنج دیجیتال

با کلیک بر روی عکس زیر فیلم راه اندازی این پروژه را مشاهده کیند.

فیلم راه اندازی دماسنج دیجیتال با ARM

Tags: , , , , , , , , ,