در جلسه گذشته، به راهاندازی واحد تایمر(Timer) در میکروکنترلر STM32f103 پرداختیم و یک کد ساده برای راه اندازی آن به وسیلهی کتابخانه HAL نوشتیم و همچنین بعضی از ویژگی های این واحد توضیح داده شد. در این جلسه قصد داریم تا با استفاده از تایمر، pwm تولید کنیم. لذا در ابتدا به توضیح pwm و کاربردهای آن می پردازیم و سپس نحوه تولید این مدولاسیون شرح داده خواهد شد.
مدولاسیون پهنای پالس (pwm)
pwm یک سیگنال کنترلی به شکل موجی مربعی و متناوب است که در برخی از زمان ها یک( یکِ دیجیتال) است و در باقی دوره تناوب مقدار صفر(صفرِ دیجیتال) را داراست. این موج را می توان به کمک سه پارامتر که عبارتند از: دامنه و فرکانس و دیوتی سایکل(Duty cycle) تعریف نمود. از کاربرد های تولید pwm میتوان به کنترل سرعت چرخش سروو موتورها، کنترل سرعت موتورهای الکتریکی استاندارد و رایج، کنترل نور LED ها و MPPTها و کاربردهای دیگر اشاره کرد.
ساخت پروژه در نرمافزار CubeMX
در گام اول با استفاده از نرم افزار CubeMX پروژه را می سازیم و در ادامه در بخش تنظیم پایه های میکروکنترلر مانند تصاویر زیر تنظیم می کنیم( تایمر ۳ را فعال کرده و خروجی pwm آن را تنظیم می کنیم.)
و تنظیمات آن را در بخش تایمر و به مانند شکل زیر تنظیم می کنیم.
با این کار تایمر۳ را بر اساس کلاک داخلی میکروکنترلر اجرا خواهد کرد. بخش کانالهای این تایمر(channel 1 -4) جهت ایجاد موج در خروجی میکروکنترلر بر اساس تایمر است لذا با فعال کردن کانال ۱ به عنوان مثال، موج خروجی را از پین مربوط به این کانال(PA6) دریافت خواهیم کرد.
حال در ادامه باید حدود شمارش تایمر را مشخص کنیم تا بر اساس مقدار زمان مورد نیاز ما به پردازنده اینترپت دهد. قبل از این کار ابتدا باید فرکانس کاری واحد تایمر را مشخص کنیم. لذا برای این کار به بخش تنظیمات کلاک رفته و با توجه به اینکه این فرکانس از بخش APB1 timer clock که در شکل زیر مشخص شده است تعیین می گردد، مقدارش را برابر ۷۲ مگاهرتز تنظیم میکنیم.
حال دوباره به سراغ تنظیم تایمر می رویم و در بخش تنظیمات تایمر ۳ مقادیر ( ARR, PSC) را برای ساختن تایمری با موج ۲ هرتز تنظیم می کنیم. از آنجایی که موج ۲ هرتز دوره تناوبی برابر ۵۰۰ میلی ثانیه دارد، لذا تایمر را طوری تنظیم میکنیم که اولا برای رجیستر ARR به جهت داشتن دقت بالا در دیوتی سایکل، مقداری مطلوب انتخاب می کنیم و بر اساس آن مقدار رجیستر PSC را محاسبه می کنیم ، (برای مشاهده نحوه تنظیم این مقادیر به مطلب آموزشی جلسه گذشته مراجعه فرمایید.)
لذا با انتخاب ARR+1=10000/2=5000 , PSC+1=7200 خواهیم داشت: ARR=4999, PSC=7200 .
حال مقادیر فوق را در نرم افزار CubeMX وارد کرده و کد را تولید میکنیم.
ادامه پروژه در نرمافزار KEIL
فایل پروژه برای نرمافزار KEIL را از مسیر انتخاب شده و واقع در پوشه MDK-ARM پروژه انتخاب کردن و باز میکنیم.
در بخش فانکشن در نوار سمت چپ نرمافزار زیر گروه stm32f1xx_hal_tim.c را باز کرده و توابع مربوط به این کتابخانه را در آن مشاهده می کنید و توضیحات هر تابع در کد هر قسمت موجود است.
در این پروژه باید ابتدا قبل از فعال کردن pwm باید دیوتی سایکل آن را مشخص کرده و سپس شروع به تولید موج از پایه مرتبط کنیم، لذا از دستورات زیر در پروژه استفاده خواهیم کرد:
HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
HAL_TIM_SetCompare(TIM_HandleTypeDef *htim, uint32_t Channel, CCRx)__
کدهای فوق به ترتیب از بالا به صورت زیر عمل می کنند:
کد اول فرآید تولید موج با مشخصات از قبل تعیین شده را آغاز می کند و با اجرای آن، موج در خروج تولید می گردد.
کد دوم تابعی جهت غیر فعال کردن فرآید تولید موج می باشد
در کد سوم، جهت تعیین مقدار دیوتی سایکل و ثبت آن در رجیستر مربوطه استفاده می گردد.
در این کد با فرض دیوتی ۹۵ درصد، باید دارای مقدار ۰٫۹۵*۴۹۹۹=۴۷۴۹٫۰۵ باشد و از آنجایی که مقدار CCR باید عددی صحیح باشد، عدد ۴۷۴۹ با تقریب، به دلیل تست بودن پروژه، قابل قبول است.
لذا کد زیر را برای تولید یک موج موبعی متناوب(PWM) با فرکانس ۲ هرتز و دیوتی سایکل ۹۵ درصد مینویسیم
در صورتی که بخواهیم درحین فعالیت فرکانس را عوض کنیم یا اینکه مقدار رجیستر ARR جهت مقایسه شدن با مقدار CCR عوض شود، باید از کدهای زیر استفاده کنیم. در ادامه فرامین گفته شده برای تولید یک موج ۲۰ هرتز آورده شده است و می توان از این قطعه کد ها جهت تغییرات گفته شده استفاده کرد.
با ما همراه باشید.
نویسنده: اشکان راکی