پروژه الکترونیکپروژه های ARMپروژه های STM32

پروژه کنترل سرعت موتور DC با STM32 (راه اندازی PWM)

سلام. پروژه کنترل سرعت موتور DC یا روشنایی LED با STM32 (راه اندازی PWM) را آماده کردیم.

آموزش تغییر سرعت فن DC با میکروکنترلر STM32

در این پروژه ARM، یاد میگیریم چطور سرعت یک موتور DC یا روشنایی یک ال ای دی را با استفاده از STM32 با کد آردوینو و راه اندازی PWM کنترل کنیم. همانطور که میدانیم دو نوع سیگنال وجود دارد : سیگنال آنالوگ و دیجیتال. سیگنال های آنالوگ دارای ولتاژی مثل 1 ولت، 3 ولت و … هستند و سیگنال های دیجیتال دارای 0 و 1 هستند. خروجی سنسور ها آنالوگ است و با استفاده از مبدل آنالوگ به دیجیتال به سیگنال های دیجیتال تبدیل میشوند زیرا میکروکنترلر ها فقط سیگنال ها دیجیتال را میفهمند. پس از تبدیل به شکل دیجیتال، دوباره باید سیگنال های دیجیتال به سیگنال های آنالوگ تبدیل شوند تا بتوانیم دستگاه های آنالوگ را هدایت کنیم. برای همین ما از روش های مختلفی مثل مبدل های دیجیتال به آنالوگ، PWM و … استفاده میکنیم.

فیلم عملکرد پروژه در انتهای صفحه قرار گرفته است.

PWM چیست ؟

ما قبلاً بارها در مورد PWM صحبت کرده ایم و بحث PWM را برای آردوینو و AVR به طور کامل آموزش داده ایم.

چرخه وظیفه چیست ؟ Duty Cycle

به تصویر بالا نگاه کنید. اگر سوئیچ به طور مداوم طی یک مدت زمان بسته باشد، ال ای دی در این مدت به صورت مداوم روشن خواهد ماند. اگر سوئیچ به مدت نیم ثانیه بسته باشد و برای نیم ثانیه دیگر باز باشد، ال ای دی فقط در نیمه اول یک ثانیه روشن خواهد شد. به نسبت روشن بودن ال ای دی در کل زمان ، چرخه وظیقه یا Duty Cycle گفته میشود. چرخه وظیفه را میتوانید به صورت زیر محاسبه کنید.

چرخه وظیفه = زمان روشن /  (زمان روشن + زمان خاموش)

چرخه وظیفه = (0.5 / (0.5 + 0.5)) = 50٪

بنابراین متوسط ​​ولتاژ خروجی 50٪ ولتاژ باتری خواهد بود.

این حالت برای یک ثانیه اتفاق می افتد و می توانیم شاهد باشیم که LED برای نیمی از ثانیه خاموش و LED در نیمه دوم روشن است. اگر فرکانس این عمل از یک بار در ثانیه به 50 بار در ثانیه تبدیل شود، چشم انسان نمی تواند این فرکانس را ثبت کند. برای یک چشم معمولی، چراغ LED طوری بنظر میرسد که انگار فقط با نصفه ولتاژ روشن است. یعنی فکر میکنیم دارای نیمی از روشنایی اصلی است. بنابراین با کاهش بیشتر زمان روشن بودن ال ای دی، درخشندگی بسیار کمتر به نظر میرسد.

PWM در STM32

STM32F103C8 دارای 15 پین PWM و 10 پین ADC است. 7 تایمر وجود دارد و هر خروجی PWM توسط یک کانال به 4 تایمر متصل می شود. PWM  دارای دقت 16 بیتی (2 به توان 16) است ، یعنی شمارنده ها و متغیرها می توانند به بزرگی 65535 باشند. با سرعت ساعت 72 مگاهرتز ، یک خروجی PWM می تواند حداکثر دوره حدود یک میلی ثانیه داشته باشد.

  • بنابراین مقدار 65535 روشنایی کامل LED و نهایت سرعت فن DC را میدهد (100 درصد از چرخه وظیفه)
  • مقدار 32767 روشنایی نیمه LED و نصف سرعت فن DC را میدهد (50 درصد از چرخه وظیفه)
  • مقدار 13107 روشنایی 20 درصدی LED و 20 درصد سرعت فن DC را میدهد (20 درصد از چرخه وظیفه)

PWM در STM32

پین های PWM در STM32

جزئیات پین های STM32

همانطور که می بینیم پین های PWM با فرمت موج (~) نشان داده شده اند، 15 پین PWM وجود دارد. پین های ADC با رنگ سبز نشان داده شده اند ، 10 پین ADC ورودی وجود دارد که برای ورودی های آنالوگ استفاده می شود.

حتما ببینید :  آموزش ارتباط همتا به همتا رزبری پای و آردوینو با LoRa

توضیحات شماتیک مدار پروژه

تصویر زیر شماتیک پروژه کنترل سرعت فن DC و روشنایی LED با STM32 را نشان میدهد.

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

آموزش تغییر سرعت فن DC با میکروکنترلر STM32

پتانسیومتر موجود در سمت چپ مدار به عنوان تنظیم کننده ولتاژ استفاده می شود که ولتاژ را از پین 3.3 ولت میگیرد و تنظیم می کند. خروجی از پتانسیومتر به پین ​​ADC PA4 STM32 وصل می شود. پین خروجی STM32 PWM PA9 از طریق یک مقاومت سری و یک خازن به پین ​​مثبت LED وصل می شود. یک مقاومت به صورت سری و یک خازن به طور موازی به LED متصل می شوند تا موج صحیح آنالوگ را در خروجی PWM تولید کنند زیرا خروجی آنالوگ وقتی که مستقیماً از پین PWM تولید می شود خالص نیست.

پین خروجی STM32 PWM PA8 به پین ​​ورودی IN1 ULN2003 وصل شده و پین خروجی مربوطه OUT1 ULN2003 به سیم منفی موتور DC متصل است. پین مثبت فن دی سی به پین ​​COM از ULN2003 متصل شده و باتری خارجی (9V DC) نیز به همان پین COM ULN2003 متصل شده است. پین GND ULN2003 به پین ​​GND برد STM32 وصل شده و منفی باتری به همان پین GND وصل شده است.

اتصالات ال سی دی با STM32

پتانسیومتر در سمت راست برای کنترل کنتراست صفحه نمایش LCD استفاده می شود. در جدول زیر ارتباط بین LCD و STM32 نشان داده شده است.

شماره پین LCDنام پین LCDنام پین STM32
1GNDGND
2VCC5V
3VEEپین پتانسیومتر برای کنتراست
4Register Select (RS)PB11
5Read/Write (RW)GND
6Enable (EN)PB10
7DB0بدون اتصال
8DB1بدون اتصال
9DB2بدون اتصال
10DB3بدون اتصال
11DB4PB0
12DB5PB1
13DB6PC13
14DB7PC14
15LED مثبت5V
16LED منفیGND

در این آموزش از پتانسیومتر برای تغییر چرخه وظیفه PWM تولیدی توسط STM32 استفاده میکنیم تا میزان روشنایی LED و سرعت یک فن DC را تغییر دهیم. همچنین یک LCD کاراکتری برای نمایش مقدار ADC و مقدار PWM استفاده میشود.

موتور DC: فن دی سی که در اینجا مورد استفاده قرار می گیرد فن BLDC از یک کامپیوتر قدیمی است .این نیاز قن به یک منبع خارجی دارد بنابراین ما از باتری 9 ولت DC استفاده می کنیم.

موتور درایور ULN2003: از این موتور برای هدایت موتور به یک جهت استفاده می شود زیرا موتور dc  یک طرفه است و همچنین برای فن نیز به نیروی خارجی احتیاج است.

LED: از یک ال ای دی برای مشاهده تاثیر PWM بر روشنایی آن استفاده میشود.

قطعات مورد نیاز

  1. STM32 – برد توسعه (BluePill) (STM32F103C8T6)
  2. ال سی دی کاراکتری 16*2
  3. IC درایور موتور ULN2003
  4. پتانسیومتر
  5. ال ای دی
  6. فن DC

کد آردوینو PWM برای STM32

مانند آموزش آموزش برنامه نویسی STM32 با پورت USB،برد  STM32F103C8 را با Arduino IDE از طریق پورت USB و بدون استفاده از پروگرامر FTDI برنامه ریزی میکنیم. کد کامل در انتهای صفحه در فایل دانلودی قرار گرفته است. در اینجا بعضی از قسمت های کد را بررسی میکنیم.

در این پروژه STM32 می خواهیم مقدار آنالوگ ورودی را از پین ADC PA4 بدست آوریم که به پین ​​وسط پتانسیومتر متصل شده و سپس مقدار آنالوگ (0-3.3V) را به قالب دیجیتال یا عدد صحیح (0-4095) تبدیل می کنیم. این مقدار دیجیتال بعنوان خروجی PWM برای کنترل روشنایی LED و سرعت فن دی سی ارائه می شود. یک ال سی دی کاراکتری نیز برای نمایش مقدار آنالوگ به دیجیتال و PWM استفاده میشود.

حتما ببینید :  پروژه شناسایی چهره با OpenCV و رزبری پای + فیلم عملکرد

ابتدا کتابخانه کریستال مایع که مربوط به ال سی دی است را فراخوانی میکنیم و سپس پین های LCD را تعریف میکنیم. در مورد ارتباط LCD با STM32 بیشتر بدانید.

#include <LiquidCrystal.h> 
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; 
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

سپس نام پین ها را وارد میکنیم و متغیر ها را تعریف میکنیم.

const int analoginput   = PA4;  // ورودی از پتانسیومتر
const int led           = PA9;  // LED خروجی به
const int fan           = PA8;  // خروجی به فن

اکنون در داخل setup() ، باید چند پیام را نمایش دهیم و بعد از چند ثانیه پاک کنیم و پین های ورودی و پین خروجی PWM را مشخص کنیم.

    lcd.begin(16,2);          //استفاده از ال سی دی 16*2
    lcd.clear();          //پاکسازی ال سی دی
    lcd.setCursor(0,0);          //موقعیت در ستون اول ردیف اول
    lcd.print("IRENX.IR");          //نمایش پیام دلخواه
   lcd.setCursor(0,1);          //موقعیت در ستون اول ردیف دوم
    lcd.print("PWM USING STM32");   //نمایش پیام
    delay(2000);          // زمان تاخیر
    lcd.clear();        //پاکسازی ال سی دی
    pinMode(analoginput, INPUT);          // تعریف پین پتانسیومتر به عنوان ورودی
    pinMode(led, PWM);          // تعریف پین ال ای دی به عنوان خروجی 
    pinMode(fan, PWM);        // تعریف پین فن به عنوان خروجی 

پین ورودی آنالوگ (PA4) توسط pinMode به عنوان ورودی تنظیم می شود ، پین LED به عنوان خروجی PWM توسط تنظیم می شود و پین فن نیز به عنوان خروجی PWM توسط تنظیم می شود. در اینجا پین های خروجی PWM به ال ای دی (PA9) و فن (PA8) متصل می شوند.

سپس در تابع void loop () ، ما سیگنال آنالوگ را از پین ADC PA4 می خوانیم و آن را در یک متغیر عدد صحیح ذخیره می کنیم که ولتاژ آنالوگ را به مقادیر عدد صحیح دیجیتالی (0-4095) تبدیل می کند.

نکته مهمی که باید در اینجا ذکر شود پین های PWM است که کانال های STM32 دارای وضوح 16 بیتی (0-65535) می باشد ، بنابراین باید آن را با مقادیر آنالوگ با استفاده از عملکرد map مانند زیر تعریف کنیم.

 int result = map(valueadc, 0, 4095, 0, 65535). 

اگر از عملکرد map استفاده نشود ، ما با تغییر پتانسیومتر سرعت کامل فن یا روشنایی کامل LED را به دست نخواهیم آورد.

سپس با استفاده از توابع pwmWrite، خروجی PWM را روی LED می نویسیم. سرانجام با استفاده از دستورات زیر ، مقدار ورودی آنالوگ (مقدار ADC) و مقادیر خروجی (مقادیر PWM) را روی صفحه LCD نشان می دهیم

    lcd.setCursor(0,0);          //موقعیت در ستون اول ردیف اول
    lcd.print("ADC value= ");           //نمایش متن
    lcd.print(valueadc);          //نمایش مقدار آنالوگ به دیجیتال
    lcd.setCursor(0,1);           //موقعیت در ستون اول ردیف 
    lcd.print("Output =   ");          //نمایش متن
    lcd.print(result);      // نمایش مقدار PWM

فیلم عملکرد پروژه

فیلم زیر نحوه کنترل سرعت فن DC و روشنایی LED با استفاده از STM32 و PWM را نشان میدهد.

دانلود فیلم عملکرد کنترل سرعت موتور DC با STM32

موارد موجود در فایل : شماتیک کامل مدار ، سورس کامل

برای دانلود فایل های پروژه ثبت نام کنید، تنها چند ثانیه زمان لازم است. از طریق فرم زیر اقدام کنید.

ایمیل خود را وارد کنید

نظرتان را در مورد این مطلب با ستاره دادن اعلام کنید امیدوارم این مطلب برای شما مفید بوده باشد. نظرات ، مشکلات و پیشنهادات خود را در پایین صفحه اعلام کنید
برچسب ها

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید)

دیدگاهتان را بنویسید

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

دکمه بازگشت به بالا
بستن
بستن