به نام خدا : تو این مطلب از سری مطالب پروژه آرم ، میخوام پروژه های adc میکروکنترلر lpc1768 رو قرار بدم، در مطلب دیگری، آموزش lpc1768 مبحث adc ، اومدم رجیستر ها رو توضیح مفصل دادم تا حد امکان و تو این مطلب پروژه ها رو قرار میدم براتون؛ از هر قسمت و هر حالت ممکن سعی کردم یه پروژه بنویسم و براتون قرار بدم. ( توجه، این مطلب در ۱۰ دی ماه ۹۵ بروز رسانی شده، لطفا قبل از خوندن متن، به ته مطلب برید و از قسمت مشخص شده شروع کنید به مطالعه )
لیست توابع کتابخانه adc میکروکنترلر lpc1768 :
تعریف و توضیح این توابع در ادامه مطلب و سر هر پروژه، هر کدوم رو که نیاز داشته باشیم، توضیحش میدم.
1 2 3 4 5 6 7 |
void init_adc( char Channel, char START, char StartEdge_CAP_MAT, char InterruptChannel ); unsigned long int read_adc_with_polling( char Channel ); unsigned long int read_adc_with_interrupt( char adcChannel ); int read_status_adc_channel( char Channel, char Done_Or_Overrun ); void enable_burst( void ); void disable_burst( void ); void set_start_bits( char Start ); |
فیلم تمام پروژه های زیر
۱) پروژه خواندن adc میکروکنترلر lpc1768 به روش Polling
شماتیک پروژه :
کد پروژه : کد نویسی به نظرم باید اینطوری باشه – پروژه رو تابع تابع کنی و در قالب کتابخونه هایی و هم پروژه اصلی یکم خلوت میشه و پیدا کردن مشکلات و راه اندازیش سریع میشه و هم این که در پروژه های دیگه میتونی این کتابخونه ها رو استفاده کنی.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include<lpc17xx.h> #include "serial.h" #include "adc.h" int main() { initialization( 9600, 0/*autoBaud_Enable*/, 0/*use_AutoBaud_Finish_Interrupt*/, _1Character/*NumberCharRxTrigger*/ ); /* در این پروژه تبدیل رو متوقف میکنم تا هر موقع خواستم دیتا بخونم فعالش کنم و دیتا رو بخونم و دوباره غیر فعال کنم؛ تا میکرو الکی درگیر تبدیل ای دی سی نشه */ init_adc( (1<<ADC1)/*Channel*/, _ADC_START_STOP, 0/*StartEdge_CAP_MAT*/, 0/*InterruptChannel*/ ); while(1) { printNumberln( read_adc_with_polling(ADC1), 10 ); } } |
۲) پروژه خواندن adc میکروکنترلر lpc1768 با Interrupt
شماتیک پروژه : مثل پروژه ۱
کد پروژه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include<lpc17xx.h> #include "serial.h" #include "adc.h" void ADC_IRQHandler(void) { if( read_status_adc_channel(ADC1, ADC_DONE) ) // بررسی این که تبدیل کانال۱ کامل شده یا نه { printNumberln( read_adc_with_interrupt(ADC1), 10 ); // sizeof(unsigned long int) } set_start_bits( _ADC_START_NOW ); // نکته مهم } int main() { initialization( 9600, 0/*autoBaud_Enable*/, 0/*use_AutoBaud_Finish_Interrupt*/, _1Character/*NumberCharRxTrigger*/ ); /* در این حالت باید شروع رو بزاریم رو حالت "الان" چون تو این روش دیگه تابع خوندن دیتا فراخونی نمیشه و از وقفه استفاده میکنیم و هر موقع تبدیل کامل بشه وقفه رخ میده، لذا باید در این مواقع، در هنگام پیکربندی ای دی سی حالت شروع رو بزاریم تو مد "همین الان" تا به مشکلی بر نخوریم */ init_adc( (1<<ADC1)/*Channel*/, _ADC_START_NOW, 0/*StartEdge_CAP_MAT*/, (1<<ADC1)/*InterruptChannel*/ ); NVIC_EnableIRQ( ADC_IRQn ); // Enable ADC Interrupt while(1); } |
۳) پروژه رخ دادن تبدیل با وقفه خارجی ۰ و خواندن adc میکروکنترلر lpc1768 با Interrupt
شماتیک پروژه : بازم مثل شماتیک پروژه ۱ هستش فقط یه دکمه به پایه p2.10 که همون پایه وقفه خارجی ۰ یا همن EINT0 هستش وصل میکنیم.
کد پروژه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include<lpc17xx.h> #include "serial.h" #include "adc.h" void ADC_IRQHandler(void) { if( read_status_adc_channel(ADC1, ADC_DONE) ) { printNumberln( read_adc_with_interrupt(ADC1), 10 ); // sizeof(unsigned long int) } } int main() { initialization( 9600, 0/*autoBaud_Enable*/, 0/*use_AutoBaud_Finish_Interrupt*/, _1Character/*NumberCharRxTrigger*/ ); init_adc( (1<<ADC1)/*Channel*/, _ADC_START_ON_EINT0, 0/*StartEdge_CAP_MAT*/, (1<<ADC1)/*InterruptChannel*/ ); NVIC_EnableIRQ( ADC_IRQn ); // Enable ADC Interrupt LPC_SC->EXTINT = (1<<0); // Clear Pending interrupts LPC_PINCON->PINSEL4 |= (1<<20); // Configure P2.10 as EINT0 LPC_SC->EXTMODE = (1<<0); // Configure EINTx as Edge Triggered LPC_SC->EXTPOLAR = (1<<0); // Configure EINTx as Rising Edge while(1); } |
۴) پروژه راه اندازی مد BURST و خواندن adc میکروکنترلر lpc1768 با Interrupt
شماتیک پروژه : مثل پروژه ۱
کد پروژه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include<lpc17xx.h> #include "serial.h" #include "adc.h" unsigned long int NumberConvert = 0; void ADC_IRQHandler(void) { if( read_status_adc_channel(ADC1, ADC_DONE) ) { printNumberln( read_adc_with_interrupt(ADC1), 10 ); // sizeof(unsigned long int) // متغییر تعداد تبدیل ها رو زیاد کن یه واحد - اگه // دویست تا شد - مد خودکار رو غیر فعال کن - بعد شمارنده رو ۰ کن NumberConvert++; if( NumberConvert == 200 ) { disable_burst(); NumberConvert = 0; } } } int main() { initialization( 9600, 0/*autoBaud_Enable*/, 0/*use_AutoBaud_Finish_Interrupt*/, _1Character/*NumberCharRxTrigger*/ ); init_adc( (1<<ADC1)/*Channel*/, _ADC_START_ON_EINT0, 0/*StartEdge_CAP_MAT*/, (1<<ADC1)/*InterruptChannel*/ ); NVIC_EnableIRQ( ADC_IRQn ); // Enable ADC Interrupt while(1) { if( readData() == '1' ) { // Enable BURST - Convert 200 Number And Then Disable BURST enable_burst(); } } } |
توجه مهم : پایه VREF رو به ۳٫۳ ولت وصل کنید – یادم رفت تو شماتیک لحاظ کنم؛ اگه این کارو نکنید پروژه کار نمیکنه.
خب الان که میبینم جان داش حس توضیح دادن نیست، لذا این قسمت ماستمالی میشه – الته اینم میشه یه تمرین برا شما که پروژه های بالا رو تجزیه و تحلیل کنید، آموزش آماده، پروژه آماده، فقط یه بررسی کوچیک لازم داره…… بررسی کنید، به مشکل خوردید در خدمتیم.
امیدوارم این مطلب براتون مفید بوده باشه و شب یلدا خوبی در کنار خونواده داشته باشید، هزینه این مطلب یه فاتحه برا اموات خودم و خودتون و اصلاح شدن نادانها و نابودی خائنین به اسلام ( که الان هم کم نیستن عده این افراد که در لباس روحانیت دارن به اسلام و کشور خدمت میکنن و حالا چه داخل کشور و چه بیرون ).
فعلا یا علی
بروزرسانی در ۱۰ دی ۹۵
کتابخونه بالا رو من به کاملا ویرایش کردم، از تغییر نام ظاهری اسم توابع تا اضافه شدن یه سری توابع جدید، بر طرف کردن مشکلات توابع قبلی، جدا شدن تابع راه اندازی در مد سخت افزار و نرم افزاری، اضافه شدن قابلیت خوندن تا ۸ پایه در مد نرم افزاری یا همون مد معمولی – در زیر فایل کتابخونه و ۸ پروژه تست شده رو براتون قرار میدم؛ لذا دیگه بیخیال خوندن متون بالا بشید و از همین کتابخونه و پروژه های از این نقطه به پایین شروع کنید به مطالعه.
لیست توابع این کتابخونه به صورت زیر هستش :
1 2 3 4 5 6 7 8 9 |
void adc_init_normal_mode( unsigned char Channels, unsigned char StartEdge_CAP_MAT, unsigned char InterruptChannels ); void adc_enable_this_channel( unsigned char Channel ); void adc_init_burst_mode( unsigned char Channels, unsigned char InterruptChannel ); void adc_enable_burst(void); void adc_disable_burst(void); unsigned long int adc_read_with_polling( unsigned char Channel ); unsigned long int adc_read_with_interrupt( unsigned char Channel ); int adc_read_status_channel( unsigned char Channel, unsigned char Done_Or_Overrun ); void adc_set_start_bits( unsigned char Start ); |
لیست پروژه ها به شرح زیر هستش ( فقط اسمشون رو قرار میدم، برا دیدن کدها، فایل بالا رو دانلود کنید ) :
Read ADC0 PIN IN Burst Mode
Read ADC0 PIN IN Burst Mode With Interrupt
Read All ADC PIN IN Burst Mode
Read ADC0 PIN IN Software Mode
Read ADC0 PIN IN Software Mode With Interrupt
Read All ADC PIN IN Software Mode
Read ADC0 PIN IN Software Mode & Start Convert on EXTI0
Read ADC0 PIN IN Software Mode With Interrupt & Start Convert on EXTI0
مهمان
سلام
اول اینکه دمتون گرم. آموزشهاتون خیلی مفیده.
دوم اینکه من نمیتونم به جز ADC0 هیچ کانال دیگهای رو بخونم. از کتابخونه شما استفاده کردم و تا جایی که فهمیدم بیت آخر ریجستر ADDR مربوط به کانال هیچوقت ۱ نمیشه(تبدیل کامل نمیشه) و با اجرای دستور مثلا adc_read_with_polling(ADC1) میکرو هنگ میکنه. مشکل از کجا میتونه باشه؟
نویسنده این مطلب
سلام-طبق کد شماره 1، خطوط 12 و 15، در توابع init و adc_read_with_polling باید شماره پورت مد نظر رو بدید – مثلا ADC1
مهمان
میکنم این کار رو ولی نمیشه. حتی وقتی adc0 رو init نکردیم و میخونیمش صفر میده ولی وقتی بقیه adc هارو init میکنم و میخونم هنگ میکنه میکرو.
نویسنده این مطلب
شرمنده دیروز نه وقتش بود نه حسش – خب من الان تست کردم، مشکلی نبود – بر چه مبنایی میگی میکرو هنگ میکنه؟ برا من کار میکنه – خواستی فیلم عملکردم میتونم برات بفرستم – رو adc0 و adc1 و adc2 تست کردم موردی نبود.
با Keil v5.28a پروژه رو تست کردم ( چند ساعت پیش دانلودش کردم! )
و از جدید ترین ویرایش! کتابخونه ها هم استفاده کردم.
دانلود پروژه راه اندازی adc میکروکنترلر lpc1768 ( اینو الان تست کردم – خواستی همینو هم تست کن )
مهمان
همین که وقت میذاری جواب میدی خیلیه، واقعا ممنون.
اون یه خط enable کردن رو اضافه کردم حل شد.
یه کاری هم با تایمر میخوام انجام بدم، نمیشه؛ اون رو هم میشه کدش رو به یه طریقی بفرستم نگاه کنی؟
نویسنده این مطلب
اگه از توابع و کتابخونه های این سایت هستش بده بررسی کنم – غیر اون هستش بیخیال – حوصله ندارم بشینم 2 ساعت بررسیش کنم دیتاشیت بخونم و …
مهمان
با کتابخونههای سایته. پس بیزحمت یه پیام بده تو واتس اپ یا تلگرام.
ایمیلم هم هست.
خیلی ممنون.
نویسنده این مطلب
هیچکدومو ندارم.
زیپ کن بفرست بیاد.
mahdedamarchi@gmail.com
مهمان
سلام مهندس من چند مدتی با هدر بردlpc1768 کار میکنم اما وقتی میخوام adc رو راه اندازی کنم ای سی من اعداد متفاوتی نشون میده میخواستم بدونم که ایا این هدر برد پایه ای برای تغذیه جدا گانه avcc دارد اگه دارد اون کدوم پایه است.ممنون اگه لطف کنین روی هدر برد نشون بدین.
نویسنده این مطلب
سلام
اول مطلب لینک یه مطلبی رو گزاشتم – اون مطلب آموزش ADC گفتم که یه دو تا پایه هستش که مربوطن به ولتاژ مرجع – مشکل شما اینه.
مهمان
بله. نگاه کردم اما اینجور چیزی ندیدم فقط اسم این دوتا پایه روی هدر برد چیه؟
نویسنده این مطلب
تو مطلب زیر
https://dmf313.ir/آموزش-آرم-میکروکنترلر-lpc1768-جلسه-۹-adc/
تو قسمت “توضیح پایه های ADC” نوشتم :
مهمان
سلام توی خط زیرمی دونم که منتظریم ADDR_DONE==1بشه ولی این قسمت کهdataبا unsigned long int اند(and)شده…یعنی چی ؟
while( (Data & ((unsigned long int)1<<_ADDR_DONE)) == 0 );
نویسنده این مطلب
سلام
خواستم بیت _ADDR_DONE ام Data رو بخونم.
مهمان
حاجی جدا دمت گرم
باید علم رو اینجوری نشر داد تا یه روز بالاخره دست اون اجنبی های داخلی و خارجی رو کوتاه کرد
خسته نباشی
نویسنده این مطلب
چه عجب بعد عمری یکی نظر داد
مهمان
سلام
بنده خدا ما هنوز یک مقاومت نمیتونیم درست کنیم بعد توقع ساخت این ای سی رو داری