ربات سازان: طراح و تولیدکننده موتورهای الکتریکیربات سازان: طراح و تولیدکننده موتورهای الکتریکیربات سازان: طراح و تولیدکننده موتورهای الکتریکیربات سازان: طراح و تولیدکننده موتورهای الکتریکی
  • صفحه نخست
  • محصولات
    • درایورهای موتور DC
    • درایورهای موتور Stepper
    • کنتـــرلرها
    • عملگر خطی | سروو جک
    • الکتروموتور و دینام
    • ربـــات‌ها
  • مقالات آموزشی
    • مستندات آموزشی محصولات
      • مستندات آموزشی درایور PMD90
      • مستندات آموزشی درایور MD10/AMD10
      • مستندات آموزشی درایور PMD60A
      • مستندات آموزشی درایور MSD02
      • مستندات آموزشی مولد پالس
      • مستندات آموزشی درایور PMD30
      • مستندات آموزشی درایور MDC20
      • مستندات آموزشی سرو درایور MHD4830
      • مستندات آموزشی درایورهای استپر پنج فاز
      • مستندات آموزشی درایور MD5
      • مستندات آموزشی ربات روهان
    • موتورهای الکتریکی و کاربردهای آن
      • موتورهای الکتریکی DC
      • موتورهای الکتریکی AC
      • موتورهای الکتریکی Stepper
      • سایر موتورهای الکتریکی
    • مقالات آموزشی الکترونیک
    • آموزش میکروکنترلر
      • آموزش میکروکنترلرهای AVR
      • آموزش میکروکنترلرهای ARM سری LPC
      • آموزش میکروکنترلرهای ARM سری STM
    • آموزش کاربردی آردوینو
    • رباتیک و معرفی ربات‌های کاربردی
    • آموزش مفاهیم پایه در مکانیک
    • آموزش مفاهیم پایه در کنترل
    • آموزش برنامه‌نویسی
    • ایده‌های ربات سازان جهت جذب سرمایه گذار
    • سایر مقالات آموزشی
  • تماس با شرکت
✕

۲-۶ ADC در میکروکنترلرهای AVR

  • صفحه نخست
  • بلاگ ربات سازان
  • میکروکنترلر
  • ۲-۶ ADC در میکروکنترلرهای AVR
۱-۶ آشنایی مقدماتی با سیگنال‌های آنالوگ و مفهوم ADC
۱-۶ آشنایی مقدماتی با سیگنال‌های آنالوگ و مفهوم ADC
۲۶ بهمن ۱۳۹۷
۳-۶ راه‌اندازی سنسور فاصله سنج IR با واحد ADC
۳-۶ راه‌اندازی سنسور فاصله سنج IR با واحد ADC
۲۶ بهمن ۱۳۹۷

۲-۶ ADC در میکروکنترلرهای AVR

۲۶ بهمن ۱۳۹۷
blank
دسته‌بندی‌ها
  • میکروکنترلر
برچسب‌ها
  • آموزش میکروکنترلرهای AVR
2-6 ADC در میکروکنترلرهای AVR

2-6 ADC در میکروکنترلرهای AVR

در میکرو کنترلر­ها و به‌طور‌ خاص در واحد ADC در لحظات مختلف از این سیگنال نمونه بر­می­‌داریم. در‌واقع به‌جای در نظر گرفتن تمام نقاط سیگنال تنها نقاط خاصی را به عنوان نماینده‌ی سیگنال اصلی در نظر می‌گیریم.

حال اگر به‌شکل ۲ (در این صفحه) نگاه‌کنید یک سیگنال دیجیتال شده از یک سیگنال آنالوگ سینوسی را مشاهده خواهید‌کرد. حال واضح است هرچه تعداد نمونه­‌های ما بیشتر باشند سیگنال ما به سیگنال واقعی نزدیکتر است.

به تعداد نمونه­‌های برداشته­ شده در واحد زمان نرخ نمونه برداری می‌گویند.

حال اگر به Data sheet میکروکنترلرهای AVR کمی نگاه بیندازید، پایه‌هایی را می­‌بینید که با نام ADC در روبروی خود مشخص شده اند.

مثلا در میکروکنترلر ATmega32 یا ATmega16 با شکلی شبیه زیر مواجه خواهید شد:

 

بخش ADC در میکروکنترلر ATMEGA32

شکل ۴: بخش ADC در میکروکنترلر ATMEGA32

 

همان­طور که می‌بینید پایه‌های پورت A دارای این قابلیت هستند. در واقع شما می­‌توانید از پایه‌های پورت A هم به عنوان ورودی/خروجی استفاده کنید و یا از آن به عنوان واحد ADC استفاده کنید. برای راه‌اندازی واحد ADC ابتدا باید پایه­‌ی AVCC را به ولتاژ 5+ ولت متصل کنید.

همچنین پایه­‌های شماره‌ی ۳۱ که همان GND می­‌باشد، باید به Ground و پایه­‌ی AREF را به ولتاژ مرجع مورد نظر باید وصل کرد. در ادامه با AREF بیشتر آشنا خواهید شد.

همان­‌طور که ملاحظه فرمودید در یک میکروکنترلر مثل ATmega16 تعداد ۸ کانال مربوط به ADC وجود دارد و هریک از این کانال­ها می­‌توانند به تنهایی عمل کنند و یک ولتاژ آنالوگ را دریافت و عملیات مربوطه را بر روی آن انجام دهند. در میکروکنترلر ATmega16 براساس یک تبدیل خاص تمام ولتاژهای بین صفر ولت تا AREF به یک عدد بین ۰ تا ۱۰۲۳ تبدیل می­‌شوند. در واقع در میکروکنترلر ATmega16 یک حافظه­‌ی ۱۰ بیتی برای ذخیره سازی مقدار تبدیل یافته ولتاژ آنالوگ روی هر پایه استفاده شده­‌است که می‌­تواند اعدادی بین ۰ تا ۱۰۲۳ را در خود جای‌دهد.

 

در واقع این عدد از رابطه‌­ی زیر به دست می­‌آید:

ADC = (Vin×1024)/Vref

در فرمول بالا کلمات به شرح زیرمی­‌باشند:

ADC: همان عدد به دست آمده پس از تبدیل

Vin: ولتاژ روی پایه­‌ی مخصوص مثلا پین A.0

Vref: همان ولتاژ مرجع متصل شده به پایه­‌ی AREF

 

حال با استفاده از فرمول بالا می­‌توان در‌صورت داشتن عدد ADC مقدار ولتاژ روی هر پایه­ راحساب کرد.

در واقع داریم:

Vin = (ADC×Vref)/1024

 

با استفاده از این فرمول می­‌توانیم بسیاری از سنسورهایی را که خروجی ولتاژ را به عنوان جواب می­‌دهند، راه ­اندازی کنیم، در ادامه در‌این‌ باره بیشتر صحبت خواهیم کرد. اگر بخواهیم خلاصه‌­ای از مطالب قبل را ذکر کنیم بهتر است به شکل زیر نگاه بیندازید:

 

نحوه‌ی انجام تبدیلات و مفهوم آن

شکل ۵: نحوه ی انجام تبدیلات و مفهوم آن

 

در واقع در شکل ۵ نحوه‌ی انجام تبدیلات و مفهوم آن مدل شده است. حال کمی به دنیای شبیه­ سازی وارد می­‌شویم.

اگر نرم‌­افزار CodeVision را راه­‌اندازی کنیم و پس از اجرای Code Wizard وارد بخش ADC شویم و پس از انتخاب گزینه‌ی ADC enabled با شکلی شبیه زیر مواجه خواهیم شد:

 

انتخاب ADC در یک میکروکنترلر AVR

شکل ۶: انتخاب ADC در یک میکروکنترلر AVR

 

در صفحه‌ی قبل همان­طور که مشاهده می­‌کنید چند گزینه برای انتخاب وجود دارد که خلاصه‌ای از کاربرد هریک به شرح زیر است:

گزینه­‌‌ی use 8 bits: برای تبدیل دقت ۱۰ بیت به ۸ بیت برای ذخیره­ سازی مقدار ADC

گزینه‌ی Volt. Ref: برای انتخاب ولتاژ مرجع میکرو که اگر درحالت AREF pin باشد پایه­ی AREF را به‌عنوان ولتاژ مرجع و یا Vref در فرمول انتخاب خواهدکرد.

گزینه­­‌ی Clock: در واقع مشخص کننده­‌ی نرخ نمونه برداری یا فرکانس نمونه برداری است.

 

هرچه فرکانس نمونه برداری بیشتر باشد احتمال بروز خطا بیشتر و دقت کمتر است ولی در عوض تعداد نمونه‌ها در واحد زمان بیشتر است.

این‌که شما دقت بیشتر را ترجیح می­‌دهید یا سرعت بالاتر را، به کاری که در حال انجام آن هستید بستگی دارد.

حال با ساختن یک پروژه کار خود را ادامه می­‌دهیم.

در این پروژه قصد داریم میزان ولتاژ روی پایه‌ی PORTA.0 که همان معرف ADC0 است را بر روی LCD نشان دهیم.

ابتدا مدار زیر را در Proteus می‌بندیم:

 

بستن مدار در Proteus

شکل ۷: بستن مدار در Proteus

 

همان­طور که در شکل می­‌بینید پایه­‌های AREF و AVCC هردو به 5+ ولت متصل شده ­اند. پایه‌­ی GND در شبیه­ سازی Proteus به طور پیش‌­فرض به زمین متصل شده است. به پایه­‌ی PA0 یا ADC0 ولتاژ 1+ ولت را متصل کرده‌­ایم. برای این کار یک منبع متغیر ولتاژ DC را به پایه‌ی A.0 متصل کردیم.

حال به فرمول Vin = (ADC×Vref)/1024 بار‌دیگر نگاه بیندازید.

در این فرمول طبق این پروژه مقدار Vref برابر 5+ ولت است. همچنین مقدار ADC را می­‌توان از طریق تابع (read_adc (port No به‌دست آورد. که در این­جا مقصود از port No همان شماره­‌ی پایه در واحد ADC است. مثلا برای خواندن مقدار ADC برای PORTA.0 یا همان ADC0 باید تابع را به نحو زیر فراخوانی کنیم:

;(int ADC_amount=read_adc(0

 

در واقع با‌ چنین فراخوانیی مقدار ADC محاسبه شده برای PORTA.0 بر روی متغیر ADC_amount که از‌ نوع integer است قرار‌ خواهد گرفت.

حال به کد زیر نگاه کنید:

[php]
// Declare your global variables here

char str[20];
void main(void)
{
// Declare your local variables here

while (1)
{
sprintf(str,"ADC_amount:%d",read_adc(0));
lcd_puts(str);
delay_ms(5000);
lc_clear();
}
}
[/php]


در این کد سعی بر‌آن است که یک مقدار خوانده­ شدهADC از PORTA.0 بر روی LCD نمایش داده شود و پس‌ از آن LCD پاک شده و دوباره مقدار ADC بر روی LCD چاپ گردد.

حال اگر این کد را بر روی شبیه­ سازی Proteus بریزیم با نتیجه‌ای مشابه شکل ۸ مواجه خواهیم شد.

 

8_Result_Proteus

شکل ۸

 

حال اگر نگاهی به مقدار عدد داده شده بیندازید می‌­بینید که این عدد در واقع حدود یک پنجم عدد ۱۰۲۴ است پس در واقع یک پنجم Vref نیز خواهد بود که می­‌شود همان ۱ ولت که همان ولتاژ مورد نظر ما است.

حال به بررسی ادعای مطرح شده در بالا می‌­پردازیم.

در این بخش سعی می­‌کنیم علاوه بر محاسبه‌ی مقدار ADC مقدار ولتاژ روی پایه‌ی ADC0 یا PORTA.0 را اندازه‌گیری کنیم.

به قطعه کد زیر نگاه بیندازید:

[php]
// Declare your global variables here

char str[20];
int Voltage;
void main(void)
{
// Declare your local variables here

while (1)
{
Voltage=(read_adc(0)*5/1024);
sprintf(str,"ADC=%d,Volt=%d",read_adc(0),Voltage);
lcd_puts(str);
delay_ms(5000);
lc_clear();
}
}
[/php]

 

در کد بالا ابتدا از طریق فرمول معرفی شده مقدار ولتاژ محاسبه شده است و به همراه آن مقدار ADC بر روی LCD چاپ شده ­است.

در شکل ۹ نتایج شبیه‌سازی با این قطعه کد را مشاهده خواهید‌کرد.

 

شکل 9

شکل ۹

 

همان­طور که می­‌بینید مقدار ولتاژ در شبیه­ سازی برابر ۱ ولت به دست آمده است که همان چیزی است که انتظارش را داشتیم.

به‌یاد داشته باشید ما بر روی PORTA.0 تنها می­‌توانیم مقادیر ولتاژ‌های بین صفر ولت تا ۵ ولت را اندازه‌گیری کنیم چراکه ولتاژ مرجع خود را به 5+ ولت متصل کرده ­ایم.

حال با دوبار کلیک کردن بر روی منبع ولتاژ متصل به پایه­ ی A.0 مقدار ولتاژ آن را به ۲.۳۶۸ تغییر می­‌دهیم.

این‌کار با تغییر مقدار عدد که در شکل داخل کادر قرمز آمده است امکان­پذیر است.

 

شکل 10

شکل ۱۰

 

با تغییر مقدار عدد ۱ داخل کادر قرمز به عدد ۲.۳۶۸ کار خود را آغاز می­‌کنیم.

ابتدا به قطعه کد زیر نگاه کنید:

[php]
// Declare your global variables here

char str[20];
float Voltage;
void main(void)
{
// Declare your local variables here

while (1)
{
Voltage=(read_adc(0)*5.0/1024);
float(Voltage,3,str);
lcd_putsf("Voltage is:")
lcd_puts(str);
delay_ms(5000);
lc_clear();
}
}
[/php]


در قطعه کد بالا مقدار Voltage که به صورت float نیز می­‌باشد توسط فرمول محاسبه شده‌است.

 

در محاسبه­‌ی ولتاژ چون تمامی مقادیر از‌ قبیل مقدار بازگشتی تابع ()read_adc ، مقدار ۵ ولت ولتاژ مرجع و عدد ۱۰۲۴ که همگی از نوع integer هستند، درنهایت مقدار نهایی محاسبه شده نیز طبق قواعد زبان C مقداری integer خواهد داشت.

برای این‌که بتوانیم از فرمول بالا مقداری float به‌دست بیاوریم باید در صورت یا مخرج کسر حداقل یک مقدار float داشته باشیم. بنابراین جلوی عدد ۵ یک ممیز شناور به همراه مقدار اعشار ۰ گذاشتیم تا این عدد به حالت float رفته و نتیجه­‌ی نهایی نیز یک عدد float باشد. حال برای نمایش دادن یک عدد float بر‌روی LCD ابتدا باید مقدار float را به یک رشته تبدیل کنیم تا بتوانیم آن را روی LCD نمایش دهیم.

در قبل با تابع ()itoa آشنا شدیم، اما آن تابع مقادیر integer را به رشته تبدیل می­‌کرد، اما اکنون برای تبدیل یک مقدار float به رشته باید از تابع ()ftoe استفاده کنیم.

این تابع در کتابخانه‌ی stdlib.h موجود است. بنابراین آن‌ را در ابتدای برنامه‌ی خود در قالب <include <stdlib.h# به برنامه‌ی خود اضافه کنید.

 

نحوه­‌ی استفاده از تابع به‌شکل زیر است:

(void ftoe (float n, unsigned char decimals, char *str

 

همان‌طور که در تعبیر بالا می­‌بینید این تابع هیچ مقداری را به عنوان مقدار بازگشتی ندارد.

همچنین برای انجام عمل تبدیل شما باید ابتدا عدد float که می­‌خواهید عمل تبدیل بر روی آن انجام گیرد را به عنوان متغیر اول به این تابع پاس دهید.

ورودی دوم این تابع یک عدد از نوع integer است که تعداد رقم­هایی بعد از اعشاری است که قرار است در این تبدیل از عدد float اعمال شوند را مشخص می­‌کند.

مثلا اگر می‌خواهید این ورودی را برای تبدیل عدد ۲.۳۶۸۷ به یک رشته بدهید باید این عدد را برابر ۴ قرار دهید. ورودی سوم نیز اشاره‌گر به یک رشته و یا به تعبیر ساده‌تر نام یک رشته است که در قبل تعریف شده ­است.

پاسخ اعمال این کد در نرم­‌افزار Proteus شبیه شکل ۱۱ خواهد بود.

 

شکل 11

شکل ۱۱

 

محمود حسن پور دهنوی
محمود حسن پور دهنوی
من کارشناس ارشد مهندسی کنترل هستم و علاقمند به تولید و خلق ایده های ناب. امیدوارم بتونم مطالب خوب و مفیدی در اختیار شما بگذارم.

مطالب و مقالات مرتبط

4-9 راه‌اندازی ماژول SRF08 Range finder

4-9 راه‌اندازی ماژول SRF08 Range finder

۲۹ بهمن ۱۳۹۷

۴-۹ راه‌اندازی ماژول SRF08 Range finder


مشاهده مطلب ...
3-9 معرفی توابع I2C در CodeVision

3-9 معرفی توابع I2C در CodeVision

۲۹ بهمن ۱۳۹۷

۳-۹ معرفی توابع I2C در CodeVision


مشاهده مطلب ...
2-9 راه‌اندازی پروتکل I2C در CodeVision

2-9 راه‌اندازی پروتکل I2C در CodeVision

۲۹ بهمن ۱۳۹۷

۲-۹ راه‌اندازی پروتکل I2C در CodeVision


مشاهده مطلب ...

دیدگاهتان را بنویسید لغو پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

جستجو در مطالب ربات سازان

✕

آخرین نوشته‌های ربات سازان

  • انتخاب بهینه‌ترین هیت‌سینک برای کاربردهای الکترونیک قدرت0
    انتخاب بهینه‌ترین هیت‌سینک برای کاربردهای الکترونیک قدرت
    ۳ آبان ۱۴۰۲
  • خواندن پلاک الکتروموتورهای سه فاز0
    خواندن پلاک الکتروموتورهای سه فاز
    ۱۳ تیر ۱۴۰۱
  • خواندن دیتاشیت موتور دی سی1
    خواندن دیتاشیت موتور دی سی
    ۱۳ خرداد ۱۴۰۱
  • محاسبه نسبت گیربکس2
    محاسبه نسبت گیربکس
    ۸ خرداد ۱۴۰۱
  • محاسبه سرعت استپ موتور بر حسب دور بر دقیقه0
    محاسبه سرعت استپ موتور بر حسب دور بر دقیقه
    ۲ خرداد ۱۴۰۱

لوگوی ربات سازان

درباره ربات سازان

شرکت ربات سازان فعالیت خود را از سال ۱۳۹۳ شروع کرده است. در ابتدا حوزه کاری شرکت طراحی و ساخت ربات‌های پلتفرم آزمایشگاهی بود که به مرور با بومی‌سازی درایور موتورهای استفاده شده در این ربات‌ها محصولی جدید به سبد محصولات شرکت اضافه شد. پس از آن شرکت به صورت تخصصی شروع به طراحی و ساخت انواع درایورهای موتورهای الکتریکی دی سی و استپر کرد و اکنون پس از گذشت ۸ سال از فعالیت شرکت توانسته‌ایم با پوشش دادن رنج وسیعی از درایورهای موتورهای الکتریکی در ولتاژ، جریان و توان‌های مختلف نیازهای صنعت کشور عزیزمان را در زمینه‌های مختلف برطرف نماییم.

blankblankblankblank

دسترسی سریع

  • صفحه اصلی
  • بلاگ ربات سازان
  • همه محصولات ربات سازان
  • ارتباط با ما
تمامی حقوق مادی و معنوی مطالب این وبسایت متعلق به ربات سازان می‌باشد.
      ✕

      ورود

      گذرواژه خود را فراموش کرده اید؟

      می خواهید یک حساب کاربری ایجاد کنید؟