آموزش STM32آموزش های ARMپروژه های ARMپروژه های STM32

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

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

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

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

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

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

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

PWM چیست ؟

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

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

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

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

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

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

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

برای کسب اطلاعات بیشتر، مقاله PWM چیست را بخوانید.

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 ورودی وجود دارد که برای ورودی های آنالوگ استفاده می شود.

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

تصویر زیر شماتیک پروژه کنترل سرعت فن 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
1 GND GND
2 VCC 5V
3 VEE پین پتانسیومتر برای کنتراست
4 Register Select (RS) PB11
5 Read/Write (RW) GND
6 Enable (EN) PB10
7 DB0 بدون اتصال
8 DB1 بدون اتصال
9 DB2 بدون اتصال
10 DB3 بدون اتصال
11 DB4 PB0
12 DB5 PB1
13 DB6 PC13
14 DB7 PC14
15 LED مثبت 5V
16 LED منفی 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
قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

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

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

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

ابتدا کتابخانه کریستال مایع که مربوط به ال سی دی است را فراخوانی میکنیم و سپس پین های 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

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

5 (4 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

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

3 نظر

  1. طراحی سخت افزار برد الکترونیکی و نرم افزاری با استفاده از STM32 با قابلیت ارتباط کن باس جهت کنترل دما به همراه قرائت سنسور دما و مقایسه با دمای ست پوینت و خروجی دادن برای کنترل میزان چرخش چندین step motor، کنترل سرعت چرخش Blower Motor, تغییر مسیر عبور هوا از رادیاتور های سرد و گرم جهت تامین دمای مورد نظر و در نهایت نشان دادن درجه سرعت چرخش فن، دمای تنظیم شده و وضعیت دمپرها که توسط step motor ها حرکت نموده اند و در موقعیتی قرار گرفته اند، روی صفحه نمایش LCD با گرافهای از قبل تعریف شده مورد درخواست میباشد
    09121814286

    1. سلام عزیز
      در انجمن قسمت درخواست پروژه توضیحات پروژه را ارائه کنید.

  2. با سلام من یه پروژه میخوام در STM32F4 و Keil , میخوام از سنسور DHt11 مقادیر بخونم و با PID کنترلر یا هر گونه فیلتر ریاضی میانگین رو تو oled ببینم و میخوام که اگه درجه مثلا25 شد کار کنه و تا 20 درجه توسط فن سرد بشه در این مورد چه کمکی میتونید بکنید یا بجای PID چه نوع کنترل کننده دیگه ای میتونم استفاده کنم

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

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