توضیحات adc شرح پروتکل ADC

22.12.2023 مانیتورها

میکروکنترلرهای STM32 دارای یک ماژول قدرتمند ADC هستند که عملکرد واقعا خوب و ویژگی های جالبی دارد:

  • 18 کانال ورودی (16 کانال خارجی و 2 کانال داخلی)
  • وضوح 12 بیت
  • حالت های مختلف تبدیل:
    1. سر وقت
    2. مداوم
    3. توسط ماشه
    4. توسط تایمر
  • تراز راحت بیت های نتیجه
  • البته، تولید انواع وقفه ها و سیگنال ها برای DMA
  • سرعت دیجیتالی - تا 0.9 MSPS با زمان ضبط و تبدیل قابل برنامه ریزی
  • کالیبراسیون خودکار
  • حالت اسکن لیست ورودی
  • نگهبان آنالوگ

نیاز به این ماژول اغلب به وجود می آید: صرفاً به این دلیل که طبیعت اطراف ما گسسته نیست، بلکه پیوسته است و انواع حسگرها معمولاً یک سیگنال آنالوگ تولید می کنند. این امر به ویژه در مورد صدا صادق است، اما همین کار را می توان برای مثال با یک اسیلوسکوپ انجام داد: اسیلوسکوپ USB محبوب چینی DSO Nano به طور خاص بر روی STM32F103 ساخته شده است.

ساختار داخلی

اندازه گیری و ولتاژ مرجع

اصل دیجیتالی شدن بسیار ساده است: ولتاژ ورودی با ولتاژهای مرجع V_REF- و V_REF+ مقایسه می شود:

  • V_REF - باید به زمین متصل شود
  • V_REF+ اختیاری: یا به منبع تغذیه پردازنده (شناور و پر سر و صدا است، بنابراین این گزینه فقط برای اندازه گیری های نادرست مناسب است)، یا به منبع ولتاژ مرجع خارجی (REV)

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

ولتاژ ورودی V_In نسبت به V_REF- و V_REF+ اندازه گیری می شود و نتیجه تبدیل به نسبت زیر به رجیستر خروجی اضافه می شود:

به عنوان مثال، 1.2 ولت هنگام تغذیه ADC از 3.3 ولت به 1490 تبدیل می شود.

ADC در STM32 ثبت می شود

SR - ثبت وضعیت

بیت 0: پرچم AWD (Analog WatchDog). سیگنال ورودی از مقادیر رجیسترهای LTR یا HTR عبور کرده است.

1 بیت: پرچم EOC (پایان تبدیل). پس از تکمیل تبدیل، به 1 تغییر می کند. به صورت دستی یا هنگام خواندن رجیستر DR بازنشانی می شود.

بیت 4: پرچم STRT (شروع). سیگنال شروع تبدیل.

CR1 - ثبت اولین تنظیمات

0..4 بیت: مقدار AWDCH (آنالوگ WatchDog Channel). شماره کانال را برای ردیابی توسط Watchdog تنظیم می کند.

5 بیت: EOCIE (End Of Conversion Interrupt Enable). یک وقفه در پایان تبدیل را فعال می کند.

6 بیت: AWDIE (فعال کردن وقفه آنالوگ WatchDog). وقفه نگهبان آنالوگ را فعال می کند.

7 بیت: JEOCIE.

8 بیت: اسکن. حالت اسکن کانال را مطابق فهرست موجود در رجیسترهای SQR1، SQR2، SQR3 فعال می کند.

9 بیت: AWDSGL (آنالوگ WatchDog Single). نوع راه اندازی سگ نگهبان را در حالت اسکن تنظیم می کند: برای یک کانال (1) یا برای همه (0).

10 بیت: JAUTO.

11 بیت: DISCEN (حالت ناپیوسته فعال است). حالت عملیات "پاره" را فعال می کند - ADC توسط یک ماشه خارجی روشن می شود.

12 بیت: JDISCEN.

13..15 بیت: DISCNUM (حالت ناپیوسته تعداد کانال). تعداد کانال برای تبدیل در حالت "پارگی".

16..19 بیت: DUALMOD (انتخاب حالت دوگانه). حالت عملکرد مشترک دو ADC را تنظیم می کند.

22 بیت: JAWDEN.

23 بیت: AWDEN (آنالوگ WatchDog فعال است). شامل نگهبان آنالوگ است.

CR2 - ثبت تنظیمات دوم

0 بیت: ADON (روشن/خاموش مبدل آنالوگ/دیجیتال). ADC را فعال می کند.

1 بیت: CONT (پوشش مداوم). حالت اندازه گیری تکی (0) یا حلقه ای (1) را فعال می کند.

بیت 2: CAL (کالیبراسیون). تنظیم روی 1 کالیبراسیون را فعال می کند. پس از اتمام کالیبراسیون، به 0 بازنشانی می شود. ابتدا باید رجیسترها را ریست کنید.

بیت 3: RSTCAL (تنظیم مجدد کالیبراسیون). با تنظیم مجدد رجیسترهای کالیبراسیون، به همین ترتیب آن را روی 1 قرار دهید و منتظر تنظیم مجدد باشید.

8 بیت: DMA. DMA را فعال می کند.

11 بیت: ALIGN. داده ها را در لبه راست (0) یا چپ (1) کیس تراز می کند.

12..14 بیت: JEXTSEL.

15 بیت: JEXTTRIG.

17..19 بیت: EXTSEL (انتخاب رویداد خارجی). شماره رویداد را به راه‌انداز اختصاص می‌دهد (TIM1 CC1، TIM1 CC2، TIM1 CC3، TIM1 CC4، TIM3 TRGO، TIM4 CC4، EXTI_11، SWSTART).

20 بیت: EXTTRIG (ماشه خارجی). تبدیل توسط یک ماشه خارجی را فعال می کند.

21 بیت: JSWSTART.

22 بیت: SWSTART (شروع تبدیل). تحول را آغاز می کند. پس از اتمام دوباره تنظیم می شود.

23 بیت: TSVREFE (حسگر دما و V_REF فعال است). شامل سنسور دما و ION داخلی است.

DR - ثبت نتیجه اندازه گیری

SMPR1، SMPR2 - زمان تبدیل

ثبت تنظیم زمان تبدیل برای هر کانال.

HTR و LTR - محدودیت های سگ نگهبان

حد بالا و پایین برای نگهبان آنالوگ مشابه رجیستر DR است.

SQR1، SQR2، SQR3 - لیست کانال هایی که باید اسکن شوند

حالت اسکن (بیت SCAN در رجیستر CR1)

تمرین: ADC را روشن کنید

ساده ترین مورد استفاده از ADC: بدون وقفه، بدون هیچ حالت پیچیده - ما فقط آن را می گیریم و در یک چرخه اندازه می گیریم.

مقداردهی اولیه

  1. کلاک ماژول ADC را روشن کنید
  2. پیکربندی پارامترهای ماژول
  3. ماژول ADC را روشن کنید
  4. پیکربندی ورودی (شماره کانال ADC)
  5. ما کالیبراسیون را انجام می دهیم

من فرض می کنم که پایه های کریستالی پیکربندی نشده اند، یعنی در حالت پیش فرض "ورودی آنالوگ" هستند. این دقیقا همان رژیمی است که ما به آن نیاز داریم.

فقط برخی از پایه های STM32 می توانند به عنوان ورودی ADC کار کنند، آنها با نماد ANx تعیین می شوند (x = 0..15، این رقم شماره کانال است). تخمین این مورد در برنامه STM32Cube راحت است.

Void adc_init() RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE)؛ // تنظیمات ADC ADC_InitTypeDef ADC_InitStructure; ADC_StructInit(&ADC_InitStructure =DC_InitStructure./ADC_Initpendent); ADC_InitStructure مستقل .ADC_ScanConvMode = DISABLE // کانال ها را اسکن نکنید فقط یک کانال ADC_InitStructure.ADC_ContinuousConvMode = DISABLE // اندازه گیری یکباره ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None // بدون ماشه خارجی ADC_InitStructureA_Conv; // نتیجه تراز بیت - به سمت راست فشار دهید ADC_InitStructure.ADC _NbrOfChannel = 1 ; ADC1)؛ در حالی که (ADC_GetCalibrationStatus(ADC1)); )

پس از انجام این عملکرد، ADC1 پیکربندی، کالیبره شده و برای اندازه گیری در کانال هشتم آماده می شود.

اندازه گیری

اندازه گیری ساده است:

  1. شروع تحول
  2. ما منتظر پایان دیجیتالی شدن هستیم (پرچم EOC = End Of Conversion را بررسی کنید)
  3. خواندن نتیجه از رجیستر DR
uint16_t get_adc_value() ( ADC_SoftwareStartConvCmd(ADC1, ENABLE)؛ while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET؛ بازگشت ADC_GetConversionValue(ADC1)؛

ساده ترین استفاده از این توابع عبارتند از:

Void main() (adc_init(); uint16_t مقدار = 0؛ while(1) value = get_adc_value(); )

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

بازدید پست: 309

ADC یک پروتکل مبتنی بر متن برای شبکه های کلاینت-سرور، شبیه به Neo-Modus" Direct Connect (NMDC) است. هدف این است که یک پروتکل ساده ایجاد کنیم که بار مشتری و سرور را بر عهده نگیرد و بتوان آن را گسترش داد. برخی از راه حل های ضعیف پروتکل NMDC را اصلاح می کند، اما نه همه آنها.

همان تعاملات در نظر گرفته می شود: مشتری-مشتری و مشتری-سرور. این مستندات به دو بخش تقسیم می شود. بخش اول ساختار پروتکل را تشریح می کند، بخش دوم ویژگی سیستم پروتکل برای استفاده از این ساختار. Advanced Direct Connect اولین نسخه است و به تدریج بهبود خواهد یافت.

بیشتر ایده ها برای پروتکل از پروژه DCTNG (جان ویدار کری) آمده است پروتکل NMDC

مزایای پروتکل

  • SID و همچنین نام دستورات پروتکل از چهار کاراکتر لاتین با حروف بزرگ تشکیل شده است. این پروتکل برای پیاده سازی در زبان SI کاملاً مناسب است. طبق استاندارد زبان SI، sizeof(char) == 1، یعنی 4 کاراکتر 4 بایت را اشغال می کند یا می تواند به صورت یک عدد صحیح چهار بایتی نمایش داده شود. تبدیل رشته به عدد و پشت به طور قابل توجهی کار با دستورات را ساده و بهینه می کند و امکان ذخیره یک دستور را به صورت یک اتحادیه فراهم می کند.

معایب پروتکل

  • جداکننده های پروتکل کاراکترهای بسیار رایجی هستند (فاصله و خط فاصله) که باید با \s و \n جایگزین شوند. از آنجایی که این کاراکترها در پیام های چت بسیار رایج هستند، تعداد جایگزین ها همیشه زیاد خواهد بود که در پروتکل NMDC چنین نبود.
  • در مقایسه با پروتکل NMDC، پروتکل ADC این قابلیت را دارد که یک منوی خاص را در UserCommand حذف کند. با این حال، هنوز گزینه ای برای حذف یک منوی خاص وجود ندارد در یک زمینه خاص.

تاریخچه نسخه

نسخه های بعدی این سند و همچنین نسخه های متوسط ​​و قدیمی تر را می توان از: . این نسخه برای بازبینی ارائه شده است:

نسخه 1.0.1، 02-05-2008

  • برنامه های افزودنی در یک سند جداگانه برجسته شده اند.
  • مشخصات به یک پروژه جداگانه در SourceForge جدا شده است.

نسخه 1.0، 01-12-2007

  • اولین انتشار

ساختار پروتکل

  • تمام دستورات پروتکل با چهار حرف شروع می شوند. حرف اول نحوه ارسال دستور را مشخص می کند، سه حرف بعدی نشان می دهد که چه کاری باید انجام شود.
  • پارامترها با فاصله از هم جدا می شوند و هر دستور با یک خط شکست (کد 0x0a) به پایان می رسد. عناصری که فرار می کنند عبارتند از: "\s" - space، "\n" - newline و "\\" - backslash. این نسخه از پروتکل تمام کاراکترهای فرار شده دیگر را برای استفاده احتمالی در آینده ذخیره می کند. هر دستوری که حاوی کاراکترهای ناشناخته فرار است باید نادیده گرفته شود.
  • همه دستورات ارسالی باید با رمزگذاری UTF-8 ارسال شوند - یونیکد با نرمال سازی C کدگذاری شده است.
  • کلاینت ها باید دستورات ناشناخته/نامعتبر را نادیده بگیرند. هاب ها باید دستورات نامعتبر را نادیده بگیرند و باید دستورات ناشناخته را با توجه به نوع آنها (پیشوند) ارسال کنند.
  • آدرس‌های سرویس گیرنده باید با نماد اعشاری نقطه‌دار ("x.x.x.x") برای IPv4 یا در قالب RFC (1884) برای IPv6 مشخص شود. آدرس‌های هاب باید با پیوندی با پیشوند "adc" در جلو تعریف شوند که مشخصات این پروتکل را نشان می‌دهد ("adc://server:port/").
  • اعداد به عنوان رشته ها مطابق با استاندارد ممیز شناور ارسال می شوند، با یک نقطه "." . اعداد صحیح اعدادی هستند بدون جزء کسری و بدون جمع نمایی. برنامه ها باید بتوانند روی اعداد مثبت 64 بیتی و اعداد ممیز شناور 64 بیتی کار کنند. پیشوند نفی علامت "-" است.

د (پیام مستقیم)هاب باید این دستور را برای کاربر با SID مشخص شده ارسال کند.

E (پیام اکو)هاب باید دستور را برای کاربران با sid و my_sid ارسال کند.

F (پخش ویژه)هاب باید این دستور را برای همه کلاینت هایی ارسال کند که از (+)/(-) این مشخصه پشتیبانی نمی کنند. پشتیبانی مشتری از یک ویژگی خاص از فیلد SU تعیین می شود که در دستور INF ارسال شده توسط مشتری وجود دارد.

H (پیام هاب)کلاینت ها باید از این نوع برای ارسال دستوری که فقط برای هاب در نظر گرفته شده است استفاده کنند.

من (پیام اطلاعات)هاب ها باید از این نوع برای ارسال دستوری استفاده کنند که توسط کلاینت دیگری ارسال نشده است.

U (پیام UDP)کلاینت ها باید از این دستور فقط برای اتصالات مستقیم UDP استفاده کنند.

توابع هش

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

شناسایی مشتری

هر مشتری با سه شناسه مختلف شناسایی می شود: یک شناسه جلسه - شناسه جلسه (SID)، یک شناسه شخصی - شناسه خصوصی (PID) و یک شناسه مشتری - شناسه مشتری (CID).

فایل ها

نام فایل ها از ریشه نسبی (ساختی) در سهم کاربر شمارش می شود. "/" - جداکننده دایرکتوری؛ نام هر فایل یا دایرکتوری باید در زمینه‌ای که به حروف بزرگ و کوچک حساس نیست منحصر به فرد باشد. همه کاراکترهای قابل چاپ، از جمله فاصله، در نام فایل مجاز هستند. کلاینت ها باید از فیلترهای نام برای سیستم فایل خود استفاده کنند و نام فایل های دریافتی از سایر کلاینت ها نیز باید از این قوانین پیروی کنند. نام های خاص "." و ".." را نمی توان در یک فهرست یا نام فایل قرار داد. هر فایل لیستی که حاوی این نام ها باشد باید نادیده گرفته شود. تمام نام دایرکتوری ها باید به "/" ختم شود.

فایل های به اشتراک گذاشته شده نسبت به ریشه بی نام "/" ("/dir/subdir/filename.ext") شناسایی می شوند، در حالی که appends می تواند نام ریشه را اضافه کند. به عنوان مثال، "TTH/..." برای افزونه های TIGR از نام ریشه "TTH" برای شناسایی فایل ها با "Tiger Tree Hash" آنها استفاده می کند. این برای نام‌هایی از یک ریشه بی‌نام که در یک اشتراک با یک شناسه توسط چک‌سوم گنجانده شده‌اند، قابل قبول نیست.

بدون نام فایل ریشه، "files.xml" یک فایل برگه کامل را با فرمت XML، با کد UTF-8 مشخص می کند. به مشتریان توصیه می شود از افزونه ها برای فشرده سازی این فایل شیت استفاده کنند.

افزونه‌ها می‌توانند پسوندهای خود را به نام فایل اضافه کنند، معمولاً برای جلوگیری از تکرار نام‌ها.

نوع خاص "list" برای مشاهده لیست فایل ها استفاده می شود. یک لیست فایل جزئی همان ساختار یک لیست معمولی را دارد، اما دایرکتوری ها را می توان با ویژگی ناقص = "1" تگ کرد که نشان دهنده جزئی بودن است. فقط دایرکتوری های بدون فایل ریشه می توانند با کاراکتر "/" شروع شوند. محتویات چنین دایرکتوری متعاقباً به مشتری درخواست کننده در عمقی که او انتخاب کرده ارسال می شود (این فقط برای ارسال سطح مورد نیاز کاربر ضروری است). ویژگی "Base" برای فیلد "FileListing" تعیین می کند که این فایل به کدام فهرست خاص تعلق دارد.

ویژگی های متمایز کننده:

  • زمان تبدیل سریع: حداکثر 1.4 میکرو ثانیه
  • عملکرد نمونه/انجماد داخلی
  • بدون از دست دادن کد
  • نیازی به تنظیم کاربر ندارد
  • تک منبع +5 ولت
  • بدون نیاز به ساعت خارجی
  • سازگاری آسان با ریزپردازنده ها

زمینه های استفاده:

  • پردازش سیگنال دیجیتال
  • سیستم های جمع آوری سریع داده ها
  • مخابرات
  • مدارهای کنترل سروو با سرعت بالا
  • سیستم های صوتی

نمودار عملکردی:

پین کردن مکان ها:

شرح:

آی سی ADC0820 یک مبدل 8 بیتی آنالوگ به دیجیتال (ADC) با سرعت بالا و سازگار با ریزپردازنده است که از فناوری نیمه فلاش برای دستیابی به زمان تبدیل 1.4 میکرو ثانیه استفاده می کند. مبدل دارای طیفی از سیگنال های ورودی آنالوگ از 0 ولت تا + 5 ولت و یک منبع تغذیه 5 + ولت است.

سیستم نمونه/نگهداری داخلی با سرعت حرکت تا 100 mV/μs نیاز به سیستم نمونه/نگهداری خارجی را از بین می‌برد.

این ADC به دلیل قابلیت دسترسی به آن به عنوان سلول حافظه یا پورت I/O بدون نیاز به منطق تطبیق خارجی، به راحتی با ریزپردازنده ها سازگار است. خروجی های داده دارای مراحل بافر با سه حالت منطقی و سطوح ثابت هستند که به شما امکان می دهد آی سی را مستقیماً به گذرگاه داده ریزپردازنده یا به پورت داده ورودی/خروجی سیستم متصل کنید. خروجی سرریز ADC توانایی آبشاری IC ها را برای دستیابی به سطوح وضوح بالاتر فراهم می کند.

ADC0820 ماکسیم با ADC0820 ملی نیمه هادی سازگار است و عملکرد عالی ارائه می دهد. آی سی در بسته بندی های زیر موجود است: 20 پین SO، DIP، CERDIP.

ابتدا باید اجزایی که برای ایجاد فریمور استفاده کرده ایم را بشناسیم. و ما فقط از یک جزء استفاده کردیم - PWM8. PWM مخفف Pulse Width Modulator است که به معنی Pulse Width Modulator است. ماهیت دستگاه این است که به شما امکان می دهد عرض پالس های تولید شده توسط میکروکنترلر را تغییر دهید. بنابراین، تغییر ولتاژ خروجی برای دستگاه هایی که به فرکانس حساس نیستند.
به عنوان مثال: فرکانس کاری میکروکنترلر 1 هرتز است (یعنی دوره تولید پالس 1 ثانیه است)، عرض پالس 0.5 ثانیه، ولتاژ پالس 5 ولت است.

سپس متوسط ​​ولتاژ خروجی در هر ثانیه 2.5 ولت است. و این مقدار به سادگی به دست می آید: با اضافه کردن نواحی زیر پالس و تقسیم آنها بر کل دوره زمانی. در هر صورت، من آن را با جزئیات بیشتر می نویسم. بیایید بگوییم که ما یک دوره زمانی 1 ثانیه را در نظر گرفتیم که می توانیم ببینیم که اولین پالس 0.5 طول کشید. ما 0.5s * 5V (ولتاژ پالس) را ضرب می کنیم و همه اینها را بر فاصله زمانی تقسیم می کنیم. 0.5s*5V/1s = 2.5V. اگر به ولتاژ خروجی 3.33 ولت نیاز داشته باشیم، باید ناحیه پالس را تا 75 درصد افزایش دهیم. اصطلاح چرخه وظیفه اغلب در ادبیات ظاهر می شود. بنابراین، چرخه وظیفه نسبت مدت زمان پالس به مدت زمان پتانسیل صفر است، به عنوان مثال، برای مورد اول، 50٪ بود، برای دوم - 75٪.

من فکر می کنم که تئوری در حال حاضر کافی است و هیچ مشکلی برای نصب PWM روی مدار وجود ندارد. اما تنظیمات خود مؤلفه ارزش بررسی جزئیات بیشتری را دارد. برای انجام این کار، من یک اسکرین شات با مشخص شدن پارامترهای تغییر یافته ارائه خواهم کرد.

ساعت، فرکانس کاری PWM است. به همین دلیل تقسیم‌کننده‌های فرکانس و فیلد ساعت اختراع شدند. SysClk فرکانس سیستم تنظیم شده در برگه منابع جهانی است. جالب است بدانید که در لیست کشویی Clock فیلدهایی مانند Row_0_Input_0 وجود دارد. این بدان معناست که مولد ساعت ماژول می‌تواند خارج از تراشه باشد و از طریق گذرگاه Row_0_Input_0 همگام‌سازی می‌شود.

فعال کردن - سطح واحد منطقی این بلوک. معمولاً از دو استاندارد استفاده می شود: High = 5V و Low = 3V. به هر حال خود میکروکنترلر را نیز می توان به یکی از حالت های High یا Low تغییر داد.

CompareOut - خروجی تعدیل کننده عرض پالس.

ممکن است این سوال پیش بیاید که چرا نظریه فوق ارائه شد در صورتی که در عمل هرگز در جایی از آن استفاده نکرده ایم؟ و پاسخ این است که ما از مقادیر پیش فرض برای طول پالس و زمان دوره (فیلدهای Period و PulseWidth) 0 0 استفاده کردیم. با چنین مقادیری، خروجی PWM یک سیگنال جامد برابر با یک سیگنال منطقی خواهد داشت. همچنین می توانید با استفاده از توابع PWM8_1_WritePeriod() و PWM8_1_WritePulseWidth() زمان پریود و مقادیر عرض پالس را به صورت برنامه ای در حالت عملکرد میکروکنترلر تغییر دهید.

ADC یا ADC

ADC - مبدل آنالوگ به دیجیتال (یا مبدل آنالوگ به دیجیتال ADC) دستگاهی است که به شما امکان می دهد سیگنال آنالوگ را به دیجیتال تبدیل کنید. هر کمیت فیزیکی (فشار، سرعت، زاویه چرخش، ولتاژ، جریان، شدت نور) آنالوگ هستند و وظیفه ADC تبدیل آنها به سیگنال دیجیتال است. در عمل معمولاً از مقدار ولتاژ برای تبدیل به سیگنال دیجیتال استفاده می شود.
از بسیاری از ویژگی های یک ADC، سه ویژگی اصلی باید برجسته شود:

  1. عمق بیت کوچکترین واحد سیگنال آنالوگ است که می تواند توسط ADC تشخیص داده شود که معمولاً در بیت اندازه گیری می شود.
  2. فرکانس تبدیل - تعداد اندازه‌گیری‌ها در ثانیه، اندازه‌گیری شده در SPS (نمونه در ثانیه)
  3. محدوده عملیاتی - محدوده مقادیری که این مبدل در آن کار می کند.

از آنجایی که ADC دیگر دستگاهی به سادگی PWM نیست. ما باید برخی از جنبه های نظری میکروکنترلر و برخی از ویژگی های خود ADC را بررسی کنیم.

مشخصات کلی میکروکنترلر

فهرستی از مفاهیم و نام‌هایی که باید هنگام کار با تراشه‌های PSoC بدانید (به هر حال، و نه تنها همه چیز زیر برای میکروکنترلرهای AVR صادق است)

در توضیحات و نمودارهای مدار در دیتاشیت ها، نام هایی مانند Vcc، Vdd، Vss، AGND اغلب ظاهر می شوند. و گاهی اوقات تفاوت بین آنها واضح ترین نیست. Vcc ولتاژ تغذیه میکروکنترلر (cc - جمع کننده به جمع کننده)، همان Vdd است، از نظر تاریخی اتفاق افتاده است که همان مقدار دارای 2 نام است. Vss حداقل پتانسیل در میکروکنترلر است که اغلب اتفاق می افتد که این مقدار معادل AGND است. حرف "A" در مخفف AGND نشان می دهد که زمین مصنوعی است یا زمین مصنوعی. شایان ذکر است این ولتاژ روی مدار که معمولاً به آن BandGap می گویند. BandGrap یک مرجع ولتاژ است. ولتاژ مرجع به این معنی است که بدون توجه به ولتاژ تغذیه MK، دما و سایر شاخص های خارجی ثابت می ماند. Vref ولتاژ مرجع تک تک ماژول مورد بررسی است. برای مدت طولانی نمی‌توانستم بفهمم Rail-to-Rail چیست. و من با این عبارت در زمینه هایی مانند: "این ماژول می تواند در حالت Rail-to-Rail کار کند" برخورد کردم. بنابراین Rail-to-Rail به این معنی است که عنصر می تواند در کل محدوده ولتاژ از Vcc تا AGND کار کند.

مثال 2: اندازه گیری ولتاژ

وظیفه: ولتاژ پتانسیومتر متصل به صفحه اشکال زدایی را اندازه بگیرید و مقدار را روی صفحه نمایش دهید.

اینجاست که جالب تر می شود. طبق معمول، ما طراح را راه اندازی می کنیم و یک پروژه ایجاد می کنیم. به User Modules -> Misc Data -> LCD بروید و برای کشیدن آن روی میکروکنترلر کلیک چپ کنید. LCD یک ماژول بسیار کاربردی و ساده است و علاوه بر این، فضایی را روی بلوک دیجیتال اشغال نمی کند. می توانید آن را در تب Workspace Explorer ببینید. از تنظیمات او فقط باید LCDPort = Port_2 را انتخاب کند. حالا به فایل main.c بروید، بگذارید یادآوری کنم که در Workspace Explorer -> [Project name] -> Source Files -> main.c قرار دارد. و کد زیر را به تابع main() اضافه کنید.

LCD_Start(); LCD_Position(0,0); LCD_PrCString ("ولتاژ اندازه گیری شده")؛

کد را کامپایل می کنیم و میکروکنترلر را فلش می کنیم. اگر همه چیز به درستی انجام شد، خطی را که در بالا نوشته شده بود روی صفحه نمایش خواهیم داد. آنها نمی توانستند راه ساده تری برای کنترل صفحه نمایش بیاندیشند. و خوشحال می شود. حالا نوبت به ADC است. User Modules -> Legacy -> ADCINC12 را انتخاب کنید و آن را روی کنترلر بیندازید. ممکن است این سوال پیش بیاید: "چرا ما فقط ADCINC و ADCINC12 را انتخاب نکردیم و علاوه بر این، از پوشه Legacy، دلیل آن در پیچیدگی اولیه ماژول ها، یک ماژول پیچیده تر و انعطاف پذیرتر است که نیاز به دقت بیشتری دارد؟ و پیکربندی کامل در پوشه Legacy که به معنای میراث است، قبلاً یک ماژول وجود دارد که انعطاف پذیری کمتری دارد، اما پیاده سازی آن آسان تر است، سپس، بدون فکر کردن، به پوشه تقویت کننده ها بروید و آن را در مدار PGA قرار دهید. نه برای تقویت، بلکه برای افزایش امپدانس ورودی به طوری که مقدار جریان در مدار بر دقت اندازه گیری تأثیر نمی گذارد.
تنظیمات PWM را مانند تصویر تنظیم کنید.

  1. فاکتور سود - سود.
  2. ورودی - ورودی دستگاه.
  3. مرجع - ولتاژ مرجع.

تنظیمات ADC را به صورت زیر تنظیم می کنیم:

  1. ساعت TMR - فرکانس ساعت تایمر.
  2. ورودی - ورودی دستگاه (متصل به PGA).
  3. ساعت CNT - فرکانس شمارنده.

آخرین چیزی که برای عملکرد عادی نیاز داریم یک منبع جهانی به نام Ref Mux است. Ref Mux محدوده ولتاژ کاری بلوک های آنالوگ است. اگر مقدار (Vdd/2)+/-(Vdd/2) را تنظیم کنیم، اختلاف ولتاژ کامل از 0 تا 5 ولت به دست می آید. اما این یک عیب قطعی دارد. از آنجایی که ولتاژ منبع تغذیه به عنوان ولتاژ مرجع در نظر گرفته می شود. اگر ولتاژ Vdd شناور باشد، این روی دقت نتایج تاثیر می گذارد. در این مورد، BandGap برای ما مفید خواهد بود. اما بیایید فعلا نگران آن نباشیم و (Vdd/2)+/-(Vdd/2) را تنظیم کنیم.
برای بررسی مجدد، من یک اسکرین شات از تعویض بلوک های آنالوگ در نتیجه ارسال می کنم.

به main.c بروید و کد زیر را به تابع main() اضافه کنید:

PGA_Start(PGA_HIGHPOWER)؛ //شروع PGA ADCINC12_Start(ADCINC12_HIGHPOWER); //شروع ADC ADCINC12_GetSamples(0); //تنظیم ADC روی عملکرد پیوسته M8C_EnableGInt ; // برای فعال کردن وقفه های جهانی while(1) // حلقه سیستم عامل اصلی ( if (ADCINC12_fIsDataAvailable() != 0) // داده ها را در ADC بررسی کنید (نتیجه = ADCINC12_iGetData() + 2048; ADCINC12_ClearFlag; 1,0 //تنظیم موقعیت خروجی LCD_PrHexInt(نتیجه خروجی به صورت هگز)

2048 به داده‌های تابع iGetData() اضافه می‌شود تا داده‌ها را به یک معادل بدون علامت تبدیل کند (اگر می‌خواهید به Google "متغیرهای علامت‌دار و بدون علامت c++" نگاه کنید).

پتانسیومتر را به صورت زیر به برد وصل می کنیم.

میکروکنترلر را فلش می زنیم و نتیجه کار را ارزیابی می کنیم.

تنها چیزی که باقی می ماند تبدیل هگز ها به ولتاژ و بررسی صحت داده ها با تستر است. ما به این هدف کاملاً تجربی دست خواهیم یافت. بیایید شرایط را برای خودمان راحت کنیم و پتانسیل صفر را به عنوان مقدار 0x0000 در خروجی ADC در نظر بگیریم. سپس برنامه نوشته شده خود را اجرا می کنیم، پتانسیومتر را به حداکثر می رسانیم و به مقادیر حاصل نگاه می کنیم. مثلا من 0x0FEC گرفتم. سپس یک تستر می گیریم و ولتاژ واقعی را روی پتانسیومتر اندازه می گیریم. من 4.78 ولت گرفتم. اکنون 4.78/0x0FEC را تقسیم می کنیم (برای کسانی که با سیستم های حساب دیفرانسیل و انتگرال مشکل دارند، به شما توصیه می کنم پمپاژ کنید) و مرحله کوانتیزاسیون را می گیریم، یعنی واحد ولتاژی که یک مقدار خروجی ADC با آن مطابقت دارد. من 0.0011727183513248 گرفتم، این شماره است. اکنون به سادگی نتیجه حاصل از ADC را در این مقدار ضرب می کنیم و آن را روی صفحه نمایش می دهیم. برای انجام این کار، متغیرهایی را به فیلد دید جهانی اضافه کنید (این همه چیزی است که خارج از تابع main() است).