نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
أَللّهُمَّ ارْزُقْنی شَفاعَةَ الْحُسَیْنِ یَومَ الْوُرُودِ
مهدی دمیرچیلو

آموزش آرم میکروکنترلر lpc1768 جلسه ۹ adc

325

به نام خدا : تو این مطلب از سری مطالب آموزش lpc1768 میخوام به آموزش آرم میکروکنترلر lpc1768 جلسه ۹ adc بپرادزم، Adc که چی هستش و …. رو توضیح نمیدونم چون میدونم که میدونید! که چی هستش.
آموزش آرم میکروکنترلر lpc1768 جلسه 9 adc

آموزش آرم میکروکنترلر lpc1768 جلسه ۹ adc


تشکر : با تشکر از آقایان محمدرضا سربندی، حمید نجفی و دیگر دوستان که در تهیه این مطلب کمک کردن.

پیکربندی ابتدایی ADC

پیکربندی ابتدایی ADC

  • POWER : در رجیستر PCONP، بیت PCADC رو فعال کنید.
    توجه : وقتی میکرو ریست میشه، به صورت پیشفرض ADC غیر فعال هستش، برای فعال کردن ADC، ابتدا باید بیت PCADC رو تنظیم کنیم و سپس فعال کنیم ADC رو در رجیستر AD0CR ( بیت PDN )؛ برای غیر فعال کردن ADC ابتدا باید بیت PDN رو پاک کنیم و سپس بیت PCADC رو پاک کنیم.
  • Clock: در رجیستر PCLKSEL0، گزینه PCLK_ADC رو انتخاب کنید؛ To scale the clock for the ADC، بیت CLKDIV رو تنظیم کنید.
  • Pins : فعال کنید نقش ADC0 رو از طریق رجیستر PINSEL؛ برا فعال کردن مقاومت داخلی هم از رجیستر PINMODE میتونید استفاده کنید.
  • Interrupts : برا فعال کردن وقفه در ADC، جدول ۵۳۶ رو ببینید؛ Interrupts are enabled in the NVIC using the appropriate Interrupt Set Enable register. Disable the ADC interrupt in the NVIC using the appropriate Interrupt Set Enable register.
  • DMA : See Section 29.6.4. For GPDMA system connections, see Table 544.
خصوصیات ADC

خصوصیات ADC

  • ۱۲-bit successive approximation analog to digital converter.
  • وجود ۸ کانال ورودی ADC
  • وجود مد Power-down ( برا بحث کاهش جریان مصرفی میکروکنترلر )
  • Measurement range V REFN to V REFP (typically 3 V; not to exceed V DDA voltage level).
  • دقت اندازه گیری = ۱۲ بیت
  • بالاترین سرعت نمونه برداری = ۲۰۰Khz
  • وجود مد تبدیل Burst برای یه تک سیگنال ورودی یا چندین سیگنال ورودی
  • قابلیت شروع تبدیل با سیگنال های مقایسه تایمر و یا بعضی پایه های ورودی ( که در قسمت مربوطه توضیحش میدم )
سوال : در بالا گفتید : "وجود ۸ کانال ورودی ADC"؛ الان مگه خروجی ADC هم داریم؟
جواب : خب سوال خوبی بود، خروجی ADC نداریم ولی خروجی انالوگ داریم، به پایه های ADC میگن ورودی های آنالوگ و یه سری دیگه پایه هستش که بهش میگن خروجی های انالوگ و عکس ADC کار میکنه و بهش میگن DAC، و این DAC ولتاژ مد نظر ما رو پایه هاش ایجاد میکنه.
توجه مهم : لذا یه سری پایه ورودی خروجی دیجیتال داریم که بهشون میگن GPIO و یه سری پایه ورودی خروجی آنالوگ داریم که به ورودی هاش میگن ADC و به خروجی هاش میگن DAC
تکمیل شود...

Description

Basic clocking for the A/D converters is provided by the APB clock.

A programmable divider is included in each converter to scale this clock to the clock (maximum 13 MHz) needed by the successive approximation process.

یه تبدیل صحیح و کامل نیاز به ۶۵ کلاک ADC داره.

توضیح پایه های ADC

توضیح پایه های ADC

توضیح پایه های ADC
پایه های [AD0.[0:7 : این ۸ تا پایه ورودی آنالوگ، پایه های ADC ما هستن که وظیفه انداه گیری ولتاژ رو بر عهده دارن.
هشدار : اگه از این ۸ تا پایه به عنوان ADC استفاده کنید، نباید ولتاژهایی بالاتر از VDDA، به این پایه ها اعمال کنید؛ در غیر این صورت، دیتای خونده شده معتبر نمیباشد؛ اگه مبدل A/D در پروژه استفاده نشه اون وقت the pins associated with A/D inputs can be used as 5 V tolerant digital IO pins.
در شکل زیر مکان پایه های ADC میکروکنترلر LPC1768 رو براتون مشخص کردم ( برید حالشو ببرید ^_^ ) :
پایه های ADC میکروکنترلر LPC1768

پایه های VREFP و VREFN : ولتاژ مرجع؛ این دو پایه ولتاژ مرجع برا ADC و DAC فراهم میکنن.
توجه : اگه از ADC یا DAC استفاده نمیکنید، باید پایه VREFP رو به ولتاژ ۳٫۳ ولت ( پایه VDD) و پایه VREFN رو به پایه VSS وصل کنید.

پایه های VDDA و VSSA : تغذیه + و - آنالوگ؛ این پایه ها عموما باید ولتاژی برابر V DD و V SS داشته باشن، اما باید ازوله بشن برا به حداقل رسوندن نویز و خطا. ( چطوری ایزوله کنیم؟ برا این کار من دوتا مدار پیدا کردم و اولیش رو یکی از دوستان به من داد - من خودم هنوز تست نکردم )
توضیح مختصر تمام رجیستر های ADC

توضیح مختصر تمام رجیستر های ADC
توجه : اگه از ADC یا DAC استفاده نمیکنید، باید پایه VDDA رو به ولتاژ ۳٫۳ ولت ( پایه VDD) و پایه VSSA رو به پایه VSS وصل کنید.

توضیح مختصر تمام رجیستر های ADC

توضیح مختصر تمام رجیستر های ADC

توضیح رجیستر های ADC
ADCR : رجیستر کنترل A/D؛ رجیستر ADCR باید نوشته شود و مد عملیاتی رو تعیین کنه قبل این که تبدیل A/D رخ بده.
ADGDR : رجیستر داده های سراسری A/D؛ این رجیستر شامل بیت DONE و Result برای آخرین تبدیل A/D میباشد.
ADINTEN : رجیستر فعال ساز وقفه A/D؛ این رجیستر شامل بیتهای فعال سازی وقفه هستش که اجازه میده رخ دادن یا ندادن وقفه های DONE (برای تمام کانال ها) رو تعیین کنیم.
ADDR0 : رجیستر اطلاعات کانال ۰ مبدل A/D؛ این رجیستر شامل جواب آخرین تبدیل مربوط به کانال ۰ هستش.
ADDR1 : رجیستر اطلاعات کانال ۱ مبدل A/D؛ این رجیستر شامل جواب آخرین تبدیل مربوط به کانال ۱ هستش.
ADDR2 : رجیستر اطلاعات کانال ۲ مبدل A/D؛ این رجیستر شامل جواب آخرین تبدیل مربوط به کانال ۲ هستش.
ADDR3 : رجیستر اطلاعات کانال ۳ مبدل A/D؛ این رجیستر شامل جواب آخرین تبدیل مربوط به کانال ۳ هستش.
ADDR4 : رجیستر اطلاعات کانال ۴ مبدل A/D؛ این رجیستر شامل جواب آخرین تبدیل مربوط به کانال ۴ هستش.
ADDR5 : رجیستر اطلاعات کانال ۵ مبدل A/D؛ این رجیستر شامل جواب آخرین تبدیل مربوط به کانال ۵ هستش.
ADDR6 : رجیستر اطلاعات کانال ۶ مبدل A/D؛ این رجیستر شامل جواب آخرین تبدیل مربوط به کانال ۶ هستش.
ADDR7 : رجیستر اطلاعات کانال ۷ مبدل A/D؛ این رجیستر شامل جواب آخرین تبدیل مربوط به کانال ۷ هستش.
ADSTAT : رجیستر وضعیت A/D؛ این رجیستر شامل پرچم های DONE و OVERRUN برای تمام کانال های A/D هستش، همچنین وقفه A/D / پرچم DMA
ADTRM : ADC trim register

( A/D Control Register ( AD0CR

( A/D Control Register ( AD0CR

این رجیستر در کامپایلر Keil ( اگه با کامپایلر های دیگه کار میکنید، کد این رجیستر رو قرار بدید لطفا )

(A/D Control Register (AD0CR
بیت ۰ تا ۷ ( SEL ) : تعیین این که کدام یک از پایه ( پایه های ) [AD0.[0:7 مورد استفاده قرار میگیرند؛ با فعال کردن بیت ۰ ام AD0، پایه AD0.0 فعال میشه و ...؛ در مد software-controlled ( مد دستی )، تنها یکی از این بیت ها باید ۱ باشه؛ در مد hardware scan ( مد خودکار یا BURST)، از هر تعداد پایه ADCیی که دوست داشته باشید میتونید استفاده کنید. ( در حالت عادی، پایه AD0.0 انتخاب شده است. )

بیت ۸ تا ۱۵ ( CLKDIV ) :

The APB clock (PCLK_ADC0) is divided by (this value plus one) to produce the clock for the A/D converter, which should be less than or equal to 13 MHz.

Typically, software should program the smallest value in this field that yields a clock of 13 MHz or slightly less, but in certain cases (such as a high-impedance analog source) a slower clock may be desirable.

بیت ۱۶ ( BURST ) :

The AD converter does repeated conversions at up to 200 kHz, scanning (if necessary) through the pins selected by bits set to ones in the SEL field.

The first conversion after the start corresponds to the least-significant 1 in the SEL field, then higher numbered 1-bits (pins) if applicable.

Repeated conversions can be terminated by clearing this bit, but the conversion that’s in progress when this bit is cleared will be completed.

توجه : وقتی BURST = 1 هستش، باید ۰۰۰ = START تنظیم شوند ( تبدیل نباید آغاز شود )؛ اگر BURST = 1 تنظیم شود، بیت ADGINTEN از رجیستر AD0INTEN باید ۰ شود.

بیت ۱۷ تا ۲۰ : رزرو شده.

بیت ۲۱ ( PDN ) : 
۱ : مبدل  A/D در حالت عملیاتی خودش هستش ( فعال هستش )
۰ : مبدل  A/D در مد power-down هستش.

بیت ۲۲ تا ۲۳ : رزرو شده.

بیت ۲۴ تا ۲۶ ( START ) : وقتی بیت BURST مقدارش ۰ هستش، این بیت ها کنترل میکنن که آیا تبدیلی رخ بده یا نه و اگه رخ بده، کی باید رخ داده.
۰۰۰ : تبدیل شروع نشود ( موقع پاک کردن (۰ کردن) مقدار PDN، این مقدار ۰۰۰ باید استفاده شود. )
۰۰۱ : تبدیل رو همین الان شروع کن.
۰۱۰ : وقتی لبه انتخاب شده ( به وسیله بیت ۲۷ همین رجیستر ) در پایه P2.10 / EINT0 / NMI رخ داد، تبدیل رو شروع کن. ( رو پایه P2.10 رو نقش GPIO من نتونستم جواب بگیرم و فقط رو پایه EINTN0 جواب گرفتم، کسی تونست با GPIO جواب بگیره خبر بده )
۰۱۱ : وقتی لبه انتخاب شده ( به وسیله بیت ۲۷ همین رجیستر ) در پایه P1.27 / CLKOUT / USB_OVRCRn / CAP0.1 رخ داد، تبدیل رو شروع کن. ( رو پایه P1.27 رو نقش GPIO من نتونستم جواب بگیرم، کسی تونست با GPIO جواب بگیره خبر بده )
۱۰۰ : وقتی لبه انتخاب شده ( به وسیله بیت ۲۷ همین رجیستر ) در پایه MAT0.1 رخ داد، تبدیل رو شروع کن؛ Note that this does not require that the MAT0.1 function appear on a device pin
۱۰۱ : وقتی لبه انتخاب شده ( به وسیله بیت ۲۷ همین رجیستر ) در پایه MAT0.3 رخ داد، تبدیل رو شروع کن؛ Note that it is not possible to cause the MAT0.3 function to appear on a device pin
۱۱۰ : وقتی لبه انتخاب شده ( به وسیله بیت ۲۷ همین رجیستر ) در پایه MAT1.0 رخ داد، تبدیل رو شروع کن؛ Note that it is not possible to cause the MAT1.0 function to appear on a device pin
۱۱۱ : وقتی لبه انتخاب شده ( به وسیله بیت ۲۷ همین رجیستر ) در پایه MAT1.1 رخ داد، تبدیل رو شروع کن؛ Note that it is not possible to cause the MAT1.1 function to appear on a device pin
تجربه مهم :
۱) وقتی از وقفه استفاده نمیکنید و به صورت عادی ADC رو میخونید، بهتره که در هنگام تنظیم ADC، بیت های START رو بزارید رو حالت ۰۰۰ ( تبدیل شروع نشود ) و هر موقع خواستید مقدار ADC رو بخونید، تبدیل رو میزارید رو حالت ۰۰۱ ( تبدیل رو همین الان شروع کن )، یک بار نمونه برداری انجام میشه و شما میتونید برید دیتا رو بخونید، حالا اگه بخواین دوباره یه تبدیل دیگه رخ بده، باید دوباره بیت های Start رو، رو حالت ۰۰۱ ( تبدیل رو همین الان شروع کن ) تنظیم کنید، تا دوباره یه تبدیل جدید انجام بشه و شما بتونید دیتا رو بخونید ( حالا اگه دیتای قبلی رو نخونده باشید و تبدیل جدید رو شروع کرده باشید، خطای OverRun رخ میده )
۲) حالا فرض کنید اومدین از وقفه کامل شدن تبدیل ( DONE ) استفاده کردید، در این حالت باید هنگام تنظیم ADC، بیت های START رو بزارید رو حالت ۰۰۱ ( تبدیل رو همین الان شروع کن ) یا این که خودتون یه جای برنامه، بیت های Start رو رو حالت ۰۰۱ ( تبدیل رو همین الان شروع کن ) تنظیم کنید؛ چون تو این حالت اگه رو مقدار ۰۰۱ تنظیم نکنید و رو ۰۰۰ تنظیم کنید، هیچ موقع وقفه رخ نمیده، چون هیچ موقع تبدیلی کامل نمیشه ( وقفه DONE یی نمیده )؛ حالا فرض میکنیم ما کار های لازمه ای که تا الان گفتم رو انجام دادم و تبدیلی کامل شد و وقفه DONE رخ داد و تابع وقفه اجرا شد، در داخل تابع وقفه، بعد از این که اطلاعات رو خوندیم، حتما باید دوباره تبدیل رو شروع کنیم، یا این که باید یه جای پروژمون تبدیل رو شروع کنیم، در غیر این صورت، غیر از اون یکبار رخ دادن تبدیل، برای دفعات بعد تبدیلی رخ نمیده.
۳) حالا فرض کنید هنگام تنظیم ADC اومدید، بیت های START رو، رو حالت ۰۱۰ ( EINT0 ) تنظیم کردید، در این حالت هر موقع وقفه خارجی رخ بده، تبدیل شروع میشه و وقتی تبدیل تموم شد، وقفه DONE رخ میده و تابع وقفه اجرا میشه و ما اونجا میتونیم مقدار ADC رو بخونیم، و در این حالت دیگه نیاز نیست دوباره بیت START رو تنظیم کنیم.
نتیجه گیری : اگه بیت های START رو، رو حالت ۰۰۰ و ۰۰۱ تنظیم کنیم، باید بعد از هر تبدیلی دوباره، تبدیل جدید رو شروع کنیم ( بیت های START رو دوباره تنظیم کنیم ) ولی در حالت های دیگه، این کار نیازی نیست.

بیت ۲۷ ( EDGE ) : این بیت تنها زمانی کاربرد دارد که بیت های START از همین رجیستر مقداری بین ۰۱۰ تا ۱۱۱ داشته باشن، در این صورت :
۱ : شروع تبدیل با رخ دادن لبه falling روی پایه CAP/MAT انتخاب شده.
۰ : شروع تبدیل با رخ دادن لبه rising روی پایه CAP/MAT انتخاب شده.

بیت ۲۸ تا ۳۱ : رزرو شده.

( A/D Global Data Register ( AD0GDR

( A/D Global Data Register ( AD0GDR

این رجیستر در کامپایلر Keil ( اگه با کامپایلر های دیگه کار میکنید، کد این رجیستر رو قرار بدید لطفا )

The A/D Global Data Register holds the result of the most recent A/D conversion that has completed, and also includes copies of the status flags that go with that conversion.

پاسخ تبدیل ADC از ۲ راه قابل خواندن هستش :
یه راه اینه که از رجیستر (A/D Global Data Register (AD0GDR استفاده کنیم و تمام اطلاعات رو بخونیم.
راه دیگه استفاده از رجیسترهای ([A/D Data Registers (AD0DR[0:7 هستش.
آن مهم هستش که استفاده کنیم فقط از یه روش زیرا پرچم های DONE و OVERRUN میتونن

because the DONE and OVERRUN flags can otherwise get out of synch between the AD0GDR and the A/D Channel Data Register s, potentially causing erroneous interrupts or DMA activity.

(A/D Global Data Register (AD0GDR

( A/D Interrupt Enable register ( AD0INTEN

( A/D Interrupt Enable register ( AD0INTEN

این رجیستر در کامپایلر Keil ( اگه با کامپایلر های دیگه کار میکنید، کد این رجیستر رو قرار بدید لطفا )

(A/D Interrupt Enable register (AD0INTEN
نحوه مقدار دهی بیت های ۰ تا ۷ این رجیستر به صورت زیر هستش : 
۰ : غیر فعال کردن وقفه مربوطه.
۱ : فعال کردن وقفه مربوطه.

بیت ۰ ( ADINTEN0 ) : فعال/غیر فعال کردن وقفه کامل شدن تبدیل روی کانال ADC0
بیت ۱ ( ADINTEN1 ) : فعال/غیر فعال کردن وقفه کامل شدن تبدیل روی کانال ADC1
بیت ۲ ( ADINTEN2 ) : فعال/غیر فعال کردن وقفه کامل شدن تبدیل روی کانال ADC2
بیت ۳ ( ADINTEN3 ) : فعال/غیر فعال کردن وقفه کامل شدن تبدیل روی کانال ADC3
بیت ۴ ( ADINTEN4 ) : فعال/غیر فعال کردن وقفه کامل شدن تبدیل روی کانال ADC4
بیت ۵ ( ADINTEN5 ) : فعال/غیر فعال کردن وقفه کامل شدن تبدیل روی کانال ADC5
بیت ۶ ( ADINTEN6 ) : فعال/غیر فعال کردن وقفه کامل شدن تبدیل روی کانال ADC6
بیت ۷ ( ADINTEN7 ) : فعال/غیر فعال کردن وقفه کامل شدن تبدیل روی کانال ADC7

بیت ۸ ( ADGINTEN ) : خب این بیت، بیت جالبی هستش، توضیحات زیر رو بخونید.
۰ : تنها بیت های ۰ تا ۷ این رجیستر میتونن باعث رخ دادن وقفه DONE مربوط به کانال های ۰ تا ۷ ADC بشن ولاغیر!؛ اگه توجه کرده باشید در رجیستر های ADDR ( که برا هر کانال یه دونه از این رجیستر ها داشتیم) بیتی با نام DONE داشتیم که وقتی تبدیل کامل میشد به صورت خودکار مقدارش ۱ میشد ( و وقتی میومدیم رجیستر دیتا رو بخونیم مقدار این بیت پاک میشد، چون این بیت هم تو ریجستر دیتا قرار داره و با خوندن رجیستر انگار کل بیت ها رو خوندیم )؛ لذا بیت DONE موجود در رجیسترهای ADDR نمیتونن وقفه DONE رو فعال کنن، اگه بیت ADGINTEN = 0 باشد، فقط به کمک بیت های ۰ تا ۷ همین رجیستر میتونیم وقفه DONE کانال های ۸ گانه رو فعال کنیم.
۱ : تنها به کمک پرچم سراسری DONE در رجیستر ADDR میتونه وقفه ای رو فعال و تولید کنه.

توجه : در مد BURST ( وقتی که بیت BURST از رجیستر AD0CR مقدارش ۱ باشه )، این بیت باید ۰ باشد. ( چرا؟ )
۱ : تنها بیت DONE موجود در رجیسترهای ADDR میتونن به صورت خودکار وقفه DONE رو فعال کنن ( ما دخالتی نداریم )؛ لذا در این حالت، وقفه DONE تمام کانال هایی که ازشون استفاده میکنیم فعال هستن. ( مشکل یبزرگ این گزینه همینه، شاید ما دوست داشتیم کانال ۰ وقفه DONE اش فعال باشه و بقیه کانال ها غیر فعال و ... که این گزینه زیاد گزینه مناسبی نیست و بهتره در این موارد مقدار ADGINTEN رو ۰ تنظیم کنیم )

( A/D Data Registers ( AD0DR

( [A/D Data Registers ( AD0DR[0:7

این رجیستر در کامپایلر Keil ( اگه با کامپایلر های دیگه کار میکنید، کد این رجیستر رو قرار بدید لطفا )

([A/D Data Registers (AD0DR[0:7
بیت ۰ تا ۳ : رزرو شده.

بیت ۴ تا ۱۵ ( RESULT ) : وقتی بیت DONE مقدارش ۱ بشه، یعنی تبدیل کامل شده و اطلاعات محاسبه شده، داخل این ۱۲ تا بیت قرار میگیره.

بیت ۱۶ تا ۲۹ : رزرو شده.

بیت ۳۰ ( OVERRUN ) : این بیت ۱ هستش در مد Brust اگر نتیجه یک یا چند تبدیل از دست بره و بازنویسی بشه اطلاعات در بیت های RESULT از همین رجیستر قبل این که بیت های RESULT همین رجیستر خونده بشه؛ با خوندن این بیت، مقدارش پاک میشه.

بیت ۳۱ ( DONE ) : این بیت ۱ میشه وقتی که تبدیل A/D کامل بشه ؛ با خوندن این بیت، مقدارش پاک میشه.

سوال : این بیت DONE، برا کدوم کانال هستش؟
جواب : خب رجیستر ها برا هر کدوم از ۸ تا کانال Adc جدا هستش دیگه - مثلا رجیستر AD0DR.0 که برا پایه شماره صفر ADC هستش، اگه بیت DONE اش ۱ بشه خب یعنی عملیات تبدیل مربوط به پایه صفر ADC کامل شده دیگه؛ حالا اگه از رجیستر AD0DR.6 استفاده کنی، بیت DONE این رجیستر خبر از پایان عملیات تبدیل روی پایه ADC.6 میده ( و نه پایه های دیگه، فقط و فقط ADC.6 )
توجه مهم : بعضی وقتا نیازه وضعیت کانال های ADC رو بدونیم، ولی اگه از این رجیستر استفاده کنیم، دیتا هم خونده میشه ( دیتا بعد از خونده شدن، از این رجیستر پاک میشه )؛ برا این کار، یه رجیستر دیگه با نام ADSTAT هستش که در صورت نیاز میتونیم ازش استفاده کنیم؛ که اطلاعات تمام کانال های ADC رو به ما میده.

توجه فوق مهم : با یکبار خوندن این رجیستر ( ADDR ) پرچم DONE پاک میشه؛ ولی با خوندن رجیستر ADSTAT، این پرچم پاک نمیشه؛ رجیتسر ADGDR رو هم خودتون بررسی کنید.

( A/D Status register ( ADSTAT

( A/D Status register ( ADSTAT

این رجیستر در کامپایلر Keil ( اگه با کامپایلر های دیگه کار میکنید، کد این رجیستر رو قرار بدید لطفا )

ریجستر وضعیت A/D اجازه میده که بررسی کنیم وضعیت تمام کانال های A/D رو به صورت همزمان.
پرچم های DONE و OVERRUN برای هر کانال A/D در رجیستر ADDRn قرار دارن که عینا در این رجیستر ( ADSTAT ) قرار داده شدن.
(A/D Status register (ADSTAT
بیت ۰ ( DONE0 ) : پرچم وضعیت DONE برای کانال ۰ ( این بیت در داخل رجیستر AD0DR0 بود )
بیت ۱ ( DONE1 ) : پرچم وضعیت DONE برای کانال ۱ ( این بیت در داخل رجیستر AD0DR1 بود )
بیت ۲ ( DONE2 ) : پرچم وضعیت DONE برای کانال ۲ ( این بیت در داخل رجیستر AD0DR2 بود )
بیت ۳ ( DONE3 ) : پرچم وضعیت DONE برای کانال ۳ ( این بیت در داخل رجیستر AD0DR3 بود )
بیت ۴ ( DONE4 ) : پرچم وضعیت DONE برای کانال ۴ ( این بیت در داخل رجیستر AD0DR4 بود )
بیت ۵ ( DONE5 ) : پرچم وضعیت DONE برای کانال ۵ ( این بیت در داخل رجیستر AD0DR5 بود )
بیت ۶ ( DONE6 ) : پرچم وضعیت DONE برای کانال ۶ ( این بیت در داخل رجیستر AD0DR6 بود )
بیت ۷ ( DONE7 ) : پرچم وضعیت DONE برای کانال ۷ ( این بیت در داخل رجیستر AD0DR7 بود )

بیت ۸ ( OVERRUN0 ) : پرچم وضعیت OVERRUN برای کانال ۰ ( این بیت در داخل رجیستر AD0DR0 هستش )
بیت ۹ ( OVERRUN1 ) : پرچم وضعیت OVERRUN برای کانال ۱ ( این بیت در داخل رجیستر AD0DR1 هستش )
بیت ۱۰ ( OVERRUN2 ) : پرچم وضعیت OVERRUN برای کانال ۲ ( این بیت در داخل رجیستر AD0DR2 هستش )
بیت ۱۱ ( OVERRUN3 ) : پرچم وضعیت OVERRUN برای کانال ۳ ( این بیت در داخل رجیستر AD0DR3 هستش )
بیت ۱۲ ( OVERRUN4 ) : پرچم وضعیت OVERRUN برای کانال ۴ ( این بیت در داخل رجیستر AD0DR4 هستش )
بیت ۱۳ ( OVERRUN5 ) : پرچم وضعیت OVERRUN برای کانال ۵ ( این بیت در داخل رجیستر AD0DR5 هستش )
بیت ۱۴ ( OVERRUN6 ) : پرچم وضعیت OVERRUN برای کانال ۶ ( این بیت در داخل رجیستر AD0DR6 هستش )
بیت ۱۵ ( OVERRUN7 ) : پرچم وضعیت OVERRUN برای کانال ۷ ( این بیت در داخل رجیستر AD0DR7 هستش )
توجه : در مد معمولی و BURST، خطای OVERRUN وقتی رخ میده که تبدیل رو شروع کنید ولی دیتا رو نخونید و در تبدیل بعدی، دیتای جدید روی دیتای قدیمی بازنویسی میشه، لذا اون وقت خطای OVERRUN رخ میده؛ هر بار که دیتای جدید رو دیتای قدیمی بازنویسی میشه این خطا رخ میده.

بیت ۱۶ ( ADINT ) : پرچم وقفه A/D؛ این بیت مقدارش وقتی ۱ میشه که حداقل یه وقفه کامل شدن تبدیل ( DONE ) رخ داده باشه ( برا کدوم کانال هستش زیاد مهم نیست، حداقل ۱ دونه باید وقفه DONE رخ داده باشه، حداکثرش هم ۸ تا هستش، به تعداد کل کانال های ADC ) و enabled to contribute to the A/D interrupt via the ADINTEN register

بیت ۱۷ تا ۳۱ : رزرو شده.

( A/D Trim register ( ADTRIM

( A/D Trim register ( ADTRIM

این رجیستر در کامپایلر Keil ( اگه با کامپایلر های دیگه کار میکنید، کد این رجیستر رو قرار بدید لطفا )

(A/D Trim register (ADTRIM

Accuracy vs. digital receiver

The ADC function must be selected via the PINSEL registers in order to get accurate voltage readings on the monitored pin.

The PINMODE should also be set to the mode for which neither pull-up nor pull-down resistor is enabled.

For a pin hosting an ADC input, it is not possible to have a have a digital function selected and yet get valid ADC readings.

An inside circuit disconnects ADC hardware from the associated pin whenever a digital function is selected on that pin.

DMA control

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

A DMA transfer request is generated from the ADC interrupt request line.

To generate a DMA transfer the same conditions must be met as the conditions for generating an interrupt (see Section 29.6.2 and Section 29.5.3).

توجه : اگه از DMA استفاده میکنید، باید وقفه ADC در NVIC غیرفعال شود.

For DMA transfers, only burst requests are supported.

The burst size can be set to one in the DMA channel control register (see Section 31.5.20).

If the number of ADC channels is not equal to one of the other DMA-supported burst sizes (applicable DMA burst sizes are 1, 4, 8 - see Section 31.5.20), set the burst size to one.

The DMA transfer size determines when a DMA interrupt is generated.

The transfer size can be set to the number of ADC channels being converted (see Section 31.5.20).

Non-contiguous channels can be transferred by the DMA using the scatter/gather linked lists (see Section 31.5.19).

ملاحظات مد BURST و مد دستی adc میکروکنترلر lpc1768

ملاحظاتی که در هنگام فعال کردن “مد BURST” باید رعایت شود :
۱) در مد hardware scan، میتوان بیش از ۱ پایه ADC رو فعال نمود ( به کمک بیتهای SEL از رجیستر AD0CR )
۲) باید بیت های START از رجیستر AD0CR بر روی ۰۰۰ تنظیم شوند ( تبدیل نباید دستی آغاز شود؛ چون به صورت خودکار توسط مد BURST به صورت سخت افزاری تبدیل شروع میشه )؛ لذا شروع شدن و نحوه شروع شدن تبدیل دست ما نیستش دیگه، فقط میتونیم با فعال کردن و غیر فعال کردن مد BURST، شروع و یا پایان تبدیل رو تعیین کنیم.
۳) بیت ADGINTEN از رجیستر AD0INTEN باید ۰ شود ( دلیل این کار رو من دقیقا خودمم هم نفهمیدم )

ملاحظاتی که در هنگام فعال کردن “مد دستی(معمولی)” باید رعایت شود :
۱) در مد software-controlled، تنها یکی از پایه های ADC فعال شده باشد ( به کمک بیتهای SEL از رجیستر AD0CR )
۲) شروع و توقف تبدیل دست خودمون هستش، از بیت های بیت های START از رجیستر AD0CR باید استفاده کنیم؛ حتی میتونیم نوع شروع شدن تبدیل رو هم تعیین کنیم ( شروع شدن تبدیل با رخ دادن لبه انتخاب شده روی پایه های CAP/MAT/EINT0 که قبلا در این باره توضیح دادم ) به کمک همین بیت START، که در مد BURST هچین چیزی نبود.

خلاصه رجیستر های adc میکروکنترلر lpc1768

تکمیل شود…

فعلا مطلب به همین صورت بمونه، به مرور زمان تصحیح و تکمیلش میکنم، اگه دیدم این مطلب برا عده ای مفید هستش که این عمل زود انجام میشه و در غیر این صورت هر موقع حسش بود…

تعداد مطالب : 367 تا
جنگ ما فتح قدس را به همراه خواهد داشت. [ امام خمینی (ره) ]
ارسال دیدگاه
22
نظرات این مطلب بسته شده است.
  1. میلاد

    مهمان

    میلاد

    سلام دارم الان دیتاشیت رو میخونم و خواستم کمکی کرده باشم تو قسمت burst (hardware scan mode ) تو رجیستر adcr توضیحش به این صورته که تو این نوع مد ما میتونیم تا 200khz تبدیل رو انجام بدیم
    تبدیل از کوچیک ترین بیتی که تو قسمت sel 1 شده شروع میشه و در صورت وجود میره به سمت بیت های بالا تر
    ما با صفر کردن این بیت تکرار تبدیل رو متوقف میکنیم و اگر تبدیلی در حال انجام بود با 0 کردن این بیت اون تبدیل تکمیل میشه .

  2. احسان

    مهمان

    احسان

    سلام دوست عزیز اگه من بخوام روی دیتا های دریافتی تغیراتی داخل کدوم قسمت از کد adc باید تغییرات رواعمال کنم؟ مثلا با سنسور lm35 دمای محیط رو میگیرم یک ولتاژ میده که هر 10 mv یعنی یک درجه کجا باید دستوراتمو اعمال کنم که مقدار دقیق دما رو بدست بیارم؟

    مشاهده پاسخ ها (1)
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      متوجه نشدم – خیلی وقته LPC کار نمیکنم – نیمدونم

  3. milad

    مهمان

    milad

    سلام ممنونم
    در مورد این متنت:
    ۰۱۰ : وقتی لبه انتخاب شده ( به وسیله بیت ۲۷ همین رجیستر ) در پایه P2.10 / EINT0 / NMI رخ داد، تبدیل رو شروع کن. ( رو پایه P2.10 رو نقش GPIO من نتونستم جواب بگیرم و فقط رو پایه EINTN0 جواب گرفتم، کسی تونست با GPIO جواب بگیره خبر بده )
    ۰۱۱ : وقتی لبه انتخاب شده ( به وسیله بیت ۲۷ همین رجیستر ) در پایه P1.27 / CLKOUT / USB_OVRCRn / CAP0.1 رخ داد، تبدیل رو شروع کن. ( رو پایه P1.27 رو نقش GPIO من نتونستم جواب بگیرم، کسی تونست با GPIO جواب بگیره خبر بده )
    تو user manual جدید خودش نوشته که همون پایه ها فقط جواب میدن :
    Start conversion when the edge selected by bit 27 occurs on the P2.10 / EINT0 / NMI pin.
    Set the pin function to EINT0 in PINSEL4 register.
    011 Start conversion when the edge selected by bit 27 occurs on the P1.27 / CLKOUT /
    USB_OVRCRn / CAP0.1 pin. Set the pin function to CAP0.1 in PINSEL3 register

  4. حسین عهدی

    مهمان

    حسین عهدی

    توجه فوق مهم : با یکبار خوندن این رجیستر ( ADDR ) پرچم DONE پاک میشه؛ ولی با خوندن رجیستر ADSTAT، این پرچم پاک نمیشه؛ رجیتسر ADGDR رو هم خودتون بررسی کنید.
    حاجی اینم درست نیست به نظرم تو دیتا شیت چیزی ننوشته دربارش
    یه کتاب هم دارم که خلافش رو میگه

    مشاهده پاسخ ها (3)
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      تو دیتاشیت نوشته
      DONE is negated when the ADDR is read
      ولی برا رجیستر ADGDR حرفی نزده – باید در عمل تست کرد تا مطئن شد- منم دقییقا خاطرم نیست که برداشتم این بوده یا ترجمه این بوده یا در عمل تست کردم – دقیقا منبع حرفم خاطرم نیست.

      • حسین عهدی

        مهمان

        حسین عهدی

        نه من ADSTAT رو میگم که با خوندن پاک میشه

        • مهدی دمرچیلو

          نویسنده این مطلب

          مهدی دمرچیلو

          ADSTAT : The A/D Status register allows checking the status of all A/D channels simultaneously. The DONE and OVERRUN flags appearing in the ADDRn register for each A/D channel are mirrored in ADSTAT. The interrupt flag (the logical OR of all DONE flags) is also found in ADSTAT.
          درباره این که، اگه این رجیستر رو بخونی پرچم ها پاک میشن هم حرفی نزده – در عمل تستش کن و نتیجه رو اعلام کن

  5. حسین عهدی

    مهمان

    حسین عهدی

    سلام
    ۱ : تنها به کمک پرچم سراسری DONE در رجیستر ADDR میتونه وقفه ای رو فعال و تولید کنه.
    این غلطه به نظرم
    تنها به کمک پرچم سراسری DONE در رجیستر ADGDR میتونه وقفه ای رو فعال و تولید کنه

    مشاهده پاسخ ها (1)
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام- متن خود دیتاشیت.
      Only the global DONE flag in ADDR is enabled to generate an interrupt

  6. حسین عهدی

    مهمان

    حسین عهدی

    because the DONE and OVERRUN flags can otherwise get out of synch between the AD0GDR and the A/D Channel Data Register s, potentially causing erroneous interrupts or DMA activity.
    زیرا پرچم های done , overrun درغیراینصورت میتونند هماهنگی بین رجیستر های AD0GDR و ADDR رو از بین ببره و اساسا باعث اینتراپت های غلط یا DMA بشن

  7. حسین عهدی

    مهمان

    حسین عهدی

    اگه بیت ADGINTEN = 0 باشد، و فقط به کمک بیت های ۰ تا ۷ همین رجیستر میتونیم وقفه DONE کانال های ۸ گانه رو فعال کنیم.
    حاجی اینم بگو چیه ؟؟جمله بندیت غلطه
    ممنونتم
    مگه بیت ADGINTEN نباید یک باشه تا وفقه فعال باشه که شما میگی صفر ؟؟؟؟

    مشاهده پاسخ ها (1)
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      مطلب رو بروزرسانی کردم – قسمت مربوطه رو دوباره بخون.

  8. حسین عهدی

    مهمان

    حسین عهدی

    “آن مهم هستش که استفاده کنیم فقط از یه روش زیرا پرچم های DONE و OVERRUN میتونن”
    حاجی این چیه نوشتی؟؟؟!!!؟؟

    مشاهده پاسخ ها (1)
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      این قسمت ترجمش ناقصه – اگه دیده باشی متن انگلیسی زیرش قرار دادم و صورتی ررنگه
      آن مهم هستش که استفاده کنیم فقط از یه روش زیرا پرچم های DONE و OVERRUN میتونن
      because the DONE and OVERRUN flags can otherwise get out of synch between the AD0GDR and the A/D Channel Data Register s, potentially causing erroneous interrupts or DMA activity

  9. حسین عهدی

    مهمان

    حسین عهدی

    DMA چیه؟

    مشاهده پاسخ ها (1)
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      تا جایی که فهمیدم یه جور برداشتن پردازش از روی cpu – تا میکرو زیاد درگیر جیزای دیگه نشه – فک ککنم.

  10. حسین عهدی

    مهمان

    حسین عهدی

    سلام
    تو این بخش Description که گفتی کلاک میکرو یا adc
    کلاک adc هستش
    ۶۵ تا از کلاک adc

    مشاهده پاسخ ها (2)
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      چه عجب کسی مطلب رو خوند shout
      سلام good

      • حسین عهدی

        مهمان

        حسین عهدی

        حاجی من میخونم اونم چند دفعه
        بی زحمت کاملش کن یواش یواش

  11. محمد

    مهمان

    محمد

    سلام
    آیا
    آموزش stm متوقف شده

    مشاهده پاسخ ها (1)
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام.نه.برا نویسنده مشکلی رخ داده و مشغول کار دیگه ای بودن و وقت نمیکردن مطالب رو بزارن…ان شا الله به زودی ادامه مطالب رو قرار میدهند….متاسفانه دوستان هم حمایت نکردن…خب بنده خدا از کجا بدونه کسی این مطالب رو میخونه یا نه