به نام خدا : تو این مطلب از سری مطالب پروژه آرم ، میخوام پروژه های adc میکروکنترلر lpc1768 رو قرار بدم، در مطلب دیگری، آموزش lpc1768 مبحث adc ، اومدم رجیستر ها رو توضیح مفصل دادم تا حد امکان و تو این مطلب پروژه ها رو قرار میدم براتون؛ از هر قسمت و هر حالت ممکن سعی کردم یه پروژه بنویسم و براتون قرار بدم. ( توجه، این مطلب در ۱۰ دی ماه ۹۵ بروز رسانی شده، لطفا قبل از خوندن متن، به ته مطلب برید و از قسمت مشخص شده شروع کنید به مطالعه )
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
شماتیک پروژه :
کد پروژه : کد نویسی به نظرم باید اینطوری باشه – پروژه رو تابع تابع کنی و در قالب کتابخونه هایی و هم پروژه اصلی یکم خلوت میشه و پیدا کردن مشکلات و راه اندازیش سریع میشه و هم این که در پروژه های دیگه میتونی این کتابخونه ها رو استفاده کنی.
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 ); } } |
شماتیک پروژه : مثل پروژه ۱
کد پروژه :
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); } |
شماتیک پروژه : بازم مثل شماتیک پروژه ۱ هستش فقط یه دکمه به پایه 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); } |
شماتیک پروژه : مثل پروژه ۱
کد پروژه :
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
جنگ ما فتح قدس را در پی خواهد داشت (امام خمینی) >>>>>> اگر از صدام بگذریم، اگر مسأله قدس را فراموش کنیم، اگر از جنایت های امریکا بگذریم از آل سعود نخواهیم گذشت. انشاالله اندوه دلمان را را در وقت مناسب با انتقام از امریکا و ال سعود برطرف خواهیم کرد و داغ و حسرت حلاوت این جنایت بزرگ را بر دلشان خواهیم گذاشت و با برپایی جشن پیروزی حق بر جنود کفر و نفاق و آزادی کعبه از دست نااهلان و نامحرمان به مسجد الحرام وارد خواهیم شد (امام خمینی)
فعلا دارم رو USB و میکرو LPC کار میکنم، 3 تا موضوع مطرح هستش ( که تو ذهنمه هر3شو برم ) :
1) میکرو در نقش Device ( فعلا محوریت کار من این مورد هستش )
2) میکرو در نقش Host
3) میکرو در نقش OTG
و باز 2 تا موضوع مطرح هستش، برا راه اندازی usb دو تا راه داریم ( که تو ذهنمه هر2شو برم ) :
1) استفاده از میکروکنترلر ( فعلا محوریت کار من این مورد هستش که از LPC1768 استفاده میکنم )
2) استفاده از آیسی های مختص اینکار.
فعلا کارم با دیتاشیت usb تموم شده، دارم کلاس های usb رو مطالعه میکنم، کلاس cdc رو ماستمالی کردیم و یه پروژه ازش منتشر کردیم، الان رو کلاس HID ریز شدم و دارم مطالعه میکنمش و پروژه ازش میزارم تو سایت.
جزئیات داستان رو در لینک زیر میتویند ببینید :
===
به علت اثطغبال بیش از حد دوستان از موضوع usb؛ فعلا یکم سرگرم طراحی قالب جدید سایت شدم ^_^
حاجی جدا دمت گرم
باید علم رو اینجوری نشر داد تا یه روز بالاخره دست اون اجنبی های داخلی و خارجی رو کوتاه کرد
خسته نباشی
چه عجب بعد عمری یکی نظر داد
سلام
بنده خدا ما هنوز یک مقاومت نمیتونیم درست کنیم بعد توقع ساخت این ای سی رو داری
سلام توی خط زیرمی دونم که منتظریم ADDR_DONE==1بشه ولی این قسمت کهdataبا unsigned long int اند(and)شده…یعنی چی ؟
while( (Data & ((unsigned long int)1<<_ADDR_DONE)) == 0 );
سلام
خواستم بیت _ADDR_DONE ام Data رو بخونم.
سلام مهندس من چند مدتی با هدر بردlpc1768 کار میکنم اما وقتی میخوام adc رو راه اندازی کنم ای سی من اعداد متفاوتی نشون میده میخواستم بدونم که ایا این هدر برد پایه ای برای تغذیه جدا گانه avcc دارد اگه دارد اون کدوم پایه است.ممنون اگه لطف کنین روی هدر برد نشون بدین.
سلام
اول مطلب لینک یه مطلبی رو گزاشتم – اون مطلب آموزش ADC گفتم که یه دو تا پایه هستش که مربوطن به ولتاژ مرجع – مشکل شما اینه.
بله. نگاه کردم اما اینجور چیزی ندیدم فقط اسم این دوتا پایه روی هدر برد چیه؟
تو مطلب زیر
http://dmf313.ir/آموزش-آرم-میکروکنترلر-lpc1768-جلسه-۹-adc/
تو قسمت “توضیح پایه های ADC” نوشتم :