بایگانی ماهیانه: مرداد ۱۳۹۴

پروتکل های ارتباطی در میکروکنترلرهای ARM

یک میکروکنترلر هر چه قدر قدرتمند باشد و سرعت بالایی هم داشته باشد وقتی نتواند به خوبی با دنیای خارج ارتباط برقرار کند چه کارایی می تواند داشته باشد!؟ یا وقتی چند پروتکل ارتباطی را فقط پشتیبانی کند کاربردهای محدودتری خواهد داشت.

در میکروکنترلرهای ARM پروتکل های مختلف ارتباطی پشتیبانی می شود. البته این بستگی دارد کدام مدل را انتخاب کرده اید.  پروتکل های ارتباطی شامل :

UART , I2C ,I2S, SPI , CAN , USB , Ethernet

می باشد. در صنعت تعدادی از این موارد بسیار پرکاربرد هستند. زیرا بایستی با وسایلی ارتباط برقرار کنند که آن وسایل فقط با یک پروتکل خاص می توان با ارتباط برقرار کرد.

ساده ترین کاربرد پورت سریال مانیتورینگ برنامه است. پورت سریال (RS-232) برای ارتباط با ماژول هایی مثل sim900 و Wi-Fi و EM18 و بلوتوث و … مورد استفاده قرار می گیرد. همچنین با استفاده از یک واسطی مثلADM485 یا MAX485 می توان از پروتکل RS485 نیز استفاده نمود.

پروتکل i2c برای ارتباط با ایتوپرام خارجی و دوربینov7670 و … مورد استفاده قرار می گیرد.

پروتکل SPI برای ارتباط با spi Flash ،sd کارت و ماژول NRF و … مورد استفاده قرار می گیرد.

به نظر شما این میکروکنترلرها با وسایلی که بایستی با آنها از پروتکل هایی مثل پروفی باس و مد باس( Modbus RTU و Modbus/TCP ) استفاده کند، چگونه ارتباط برقرار می کند؟

در حال بروز رسانی ..

واحد آنالوگ به دیجیتال(ADC) در lpc1768 و lpc1788

بر اساس اطلاعات یوزر منوال، این میکرو دارای یک واحد ADC دوازده بیتی با نرح ۲۰۰ کیلوهرتز در lpc1768 و ۴۰۰ کیلوهرتز در lpc1788 می باشد. این واحد دارای ۸ کانال ورودی است. همچنین در این واحد حالتی وجود دارد به نام Burst که با فعال کردن آن، نمونه برداری بدون توقف و پشت سر هم انجام خواهد شد.

برای استفاده از این واحد لازم است ابتدا پاور آن در رجیستر PCONP فعال شود. زیرا به صورت پیش فرض پاور ADC در این میکرو غیر فعال است. همچنین لازم است پایه مربوطه در میکروی lpc1768 با رجیستر pinsell و در میکروی lpc1788 با رجیستر IOCON در حالت مربوطه قرار داده شود. بعد از این، تنظیمات در رجیسترهای واحد خود ADC انجام خواهد شد.

تنظیم مربوط به اینکه از کدام کانال استفاده شود و با چه تقسیم فرکانسی، همچنین نحوه اغاز تبدیل در رجیستر ADCR انجام می شود.

وقتی فرمان آغاز تبدیل داده می شود لازم است با یک بیت مرتب چک شود تا به محض فعال شدن آن، عدد تبدیل شده که بین ۰ تا ۴۰۹۵ است از رجیستر مربوطه خوانده شود و مورد استفاده قرار گیرد:

while (!(LPC_ADC->ADGDR & (1UL<<31)));/* Wait for Conversion end */
adGdr = LPC_ADC->ADGDR;
return((adGdr >> 4) & 0XFFF);/* read converted value */

وقتی از یک برنامه در حال استفاده هستید که هر ثانیه از یک کانال تعدادی نمونه برمی دارد و نمایش می دهد، ممکن است به غیر نوساناتی در نتیجه تبدیل، پرشهای را هم مشاهده کنید. مثلا گاهی نتیجه تبدیل ناگهان ۴۰۹۵ شود!

در کل برای اینگونه نمونه برداری ها می توان چندین نمونه گرفت و از آن میانگین گیری کرد. همچنین با حذف چهار رقم کم ارزش از ۱۲ رقم عدد تبدیل شده نیز می توان نوسانات را کم کرد. ولی هر دوی این روشها ایراداتی دارد. با میانگین گیری آن پرش های ناخواسته رفع نمی شود و با حذف چند رقم کم ارزش دقت تبدیل از ۱۲ بیت کاهش می یابد.

با روش های برنامه نویسی می توان این موارد ناخواسته را از میان برد به طوری که به ازای ثابت بودن ورودی آنالوگ، تغییرات در تبدیل انجام شده در حد یکی باشد. نظر شما چیست؟

در ابتدا ذکر شد که برای تبدیل پشت سر هم از مد Burst استفاده می شود. در حالت معمول بعد از هر تبدیل لازم است نتیجه تبدیل بلافاصله در یک آرایه قرار بگیرد و منتظر تبدیل بعدی شود. مثلا ۱۰۰۰ نمونه بردارید و روی آن آنالیز کنید. موردی که در اینجا ممکن است به وجود اید مشغول شدن cpu به انجام این کار است و دیگر در این مدت نمی تواند کار دیگری انجام دهد. اینجاست که بحث استفاده از DMA خود را نشان می دهد.

وقفه lpc1768 و lpc1788

در میکروکنترلر lpc1768 تمام پایه های دو پورت ۰ و ۲ به وقفه gpio اختصاص داده شده است. وقتی که تنظیم مربوطه انجام شود برنامه وارد زیرروال وقفه خارجی ۳ می شود:

void EINT3_IRQHandler(void)

در اینجا بایستی با یک رجیستر مشخص تشخیص داد در کدام پایه وقفه آمده است.

همچنین این میکرو دارای ۴ وقفه خارجی است که هر کدام زیرروال وقفه خاص خود را دارد. این چهار وقفه روی پایه های p2.10,p2.11,p2.12,p2.13 تعریف شده است.

———————————————————

در میکروکنترلر lpc1788 تمام پایه های دو پورت ۰ و ۲ به وقفه gpio اختصاص داده شده است. وقتی که تنظیم مربوطه انجام شود برنامه وارد زیرروال وقفه GPIO می شود:

void GPIO_IRQHandler(void)

همچنین این میکرو دارای ۴ وقفه خارجی است که هر کدام زیرروال وقفه خاص خود را دارد. این چهار وقفه روی پایه های p2.10,p2.11,p2.12,p2.13 تعریف شده است. وقفه ۰ و ۱ را می توان روی پایه های p0.29 و p0.30 نیز تنظیم کرد.

———————————————————

تفاوت وقفه gpio و وقفه خارجی در میکرو lpc :

در وقفه gpio می توان تنظیم کرد که در لبه بالا رونده یا پایین رونده یا هر دو لبه، وقفه اتفاق بافتد. در حالی که در وقفه خارجی یا در لبه بالا رونده یا در لبه پایین رونده می توان این تنظیم را انجام داد.

همچنین در وقفه gpio در صورتی که چندین پایه تنظیم شده باشند که با اعمال لبه در آن وقفه اتفاق بافتد، همگی وارد یک زیروال می شوند و آنجا با یک رجیستر مشخص باید تشخیص داد وقفه روی کدام پایه اتفاق افتاده است. در حالی که در وقفه خارجی به هر پایه یک زیرروال مشخص اخصاص داده شده است.

تنظیم وقفه gpio به سادگی با یک رجیستر انجام می شود در حالی که در وقفه خارجی باید کانفیگ پایه مربوطه نیز تغییر کند. در lpc1768 این تغییر کانفیگ با pinsell و در lpc1788 با IOCON انجام می شود.

———————————————————

سیستم وقفه در میکروی stm32 متفاوت است.