آموزش, ARM, STM32, آموزش STM32 با توابع LL, توصیه شده, مقاله های سیسوگ

راه‌اندازی PWM در STM32 | قسمت بیست و یکم آموزش STM32 با توابع LL

راه‌اندازی PWM در STM32 | قسمت بیست و یکم آموزش STM32 با توابع LL

در قسمت قبلی راه‌اندازی LCD Nokia به کمک واحد SPI (نمایش انیمیشن روی LCD Nokia) را به صورت کامل یاد گرفتیم و در بخش‌های قبلی با تایمرها آشنا شدیم و برخی کاربردهای آن‌ها را دیدیم. یکی دیگر از کاربردهای تایمر، حالت PWM (Pluse width Modulation) یا همان مدولاسیون پهنای پالس است. در این بخش با نحوه استفاده از این حالت آشنا خواهیم شد.

 

همانطور که در شکل بالا مشخص است، به وسیله PWM میتوانیم از طریق کنترل Duty Cycle یا زمان on بودن و off بودن موج مربعی، ولتاژ متوسطی که اعمال می‌کنیم را کنترل کنیم. این عمل کاربردهای بسیار زیادی دارد که از جمله آن‌ها می‌توان به کنترل شدت روشنایی، کنترل سرعت موتور و .. اشاره کرد.

در ادامه این آموزش با چگونگی کنترل شدت روشنایی یک LED آشنا می‌شویم.

 

 ایجاد پروژه

مراحل ساخت پروژه را مانند قبل طی می‌کنیم، کلاک و دیباگ را تنظیم می‌کنیم. سپس تایمر1 را به صورت زیر در حالت PWM تنظیم می‌کنیم:

 

بعد از تنظیم تایمر، بقیه بخش‌ها را نیز مانند گذشته تنظیم می‌کنیم و وارد محیط Keil می‌شویم.

 

نوشتن کد

برای استفاده از PWM قبل از هر چیز ، باید شمارنده و خروجی تایمر1 را فعال کنیم، همچنین متغیرهای مورد نیاز را تعریف کنیم؛

درون متغیر Max مقدار رجیستر ARR به اضافه یک  را قرار داده‌ایم. اکنون به وسیله این مقدار، میتوانیم تعیین کنیم که به چه Duty Cycle ای نیاز داریم. به وسیله کد زیر، شدت نور LED به آرامی زیاد میشود تا به بیشترین مقدار خود برسد و این عمل تکرار می‌شود. همانطور که توضیح داده شد این عمل از طریق مدولاسیون پهنای پالس و کنترل میانگین ولتاژ اعمال شده به LED انجام می‌شود؛

در بخش بعدی در مورد نحوه ایجاد شکل موج‌های مختلف توسط تایمر در حالت PWM صحبت خواهیم کرد.

لینک پروژه در گیت هاب

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

4 دیدگاه در “راه‌اندازی PWM در STM32 | قسمت بیست و یکم آموزش STM32 با توابع LL

  1. Avatar for هارونی هارونی گفت:

    سلام
    از آموزش کامل و روانتان متشکرم.
    یه سوالی دارم
    وقتی میخوام توی فایل اصلی و تابعِ main، مقدارِ متغیری رو توی تابع LL_TIM_OC_SetCompareCH1
    بریزم کامپایلر ارور میده.
    میشه لطفا توضیح بدید که متغیری که میخوام مقدارشو به این تابع بدم، باید از چه نوعی باشه و کجا تعریفس کنم؟
    متشکرم

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

      سلام دوست عزیز
      اگر متن خطا رو بگید خیلی بهتر میشه به دلیل اون پی برد 🙂

  2. Avatar for محمد محمد گفت:

    این آموزش خیلی کاربردی و مفید هست. مرسی.
    فقط مدتی هست که آموزش جدید نذاشتید، امیدوارم ادامه دار باشه این سری LL
    اگر پروتکل های ارتباطی دیگه مثل CAN و… هم بگید خیلی خوب میشه.
    واقعیت سیسوگ از همه جا بهتر مفاهیم رو توضیح میده، مشخصه که وقت زیادی صرف گردآوری مطالب و … میکنید.
    مرسی از تیم خوبتون.

    1. Avatar for Sisoog Os Sisoog Os گفت:

      خواهش میکنم دوست عزیز
      شما لطف دارید
      ولی ما که داریم این آموزش را ادامه میدیم خیلی وفته و امیدواریم تمومش هم بکنیم :-))

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

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