سیسوگ در قسمت نوزدهم آموزش میکروکنترلر STM8 راه اندازی PWM با تایمر 2 در میکروکنترلر STM8 را توضیح داد و نتیجه عملکرد آن را با 3 عدد LED چشمکزن تست کرد. در این قسمت آموزش میکروکنترلر STM8 سیسوگ قصد دارد راه اندازی PWM با تایمر 1 را مورد بررسی قرار دهد. با سیسوگ همراه باشید.
PWM تایمر 1 :
تایمر 1 یک تایمر پیشرفته است، بنابراین PWM هایی که با این تایمر تولید میشوند دارای ویژگیهای اضافی نسبت به دیگر تایمرها هستند. به عنوان مثال، امکان تولید PWMهای مکمل با TIM1 وجود دارد. بیش از 3 مجموعه PWM مکمل در میکروکنترلر STM8 میتوان تولید کرد. به عنوان مثال، PWMهای مورد استفاده در طراحی مبدل سه فاز، یکسوکنندهها و … . PWMهای تولید شده با TIM1 برای برنامههای کنترل موتور بسیار مفید هستند. همچنین میتوان dead_time و brake را نیز اضافه نمود. علاوه بر اینها، TIM1 میتواند PWMهایی را مانند PWMهای ساخته شده توسط تایمر GP ایجاد کند. در این حالت، خروجیهای PWM به صورت آزاد در دسترس نیست و تا چهار کانال PWM مستقل میتواند در دسترس قرار گیرد.
در این مثال، خواهیم دید که چگونه میتوان PWM های مکمل را در کانال 1 TIM1 PWM ایجاد کرد.
اتصالات سخت افزاری
نمونه کد PWM تایمر 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #include "STM8S.h" #include "stm8s_it.h" void clock_setup(void); void GPIO_setup(void); void TIM1_setup(void); void main(void) { int j; signed int i = 0; clock_setup(); GPIO_setup(); TIM1_setup(); while(TRUE) { for(i = 0; i < 1000; i += 1) { TIM1_SetCompare1(i); for(j=1;j<0x5FFF;j++); } for(i = 1000; i > 0; i -= 1) { TIM1_SetCompare1(i); for(j=1;j<0x5FFF;j++); } }; } void clock_setup(void) { CLK_DeInit(); CLK_HSECmd(DISABLE); CLK_LSICmd(DISABLE); CLK_HSICmd(ENABLE); while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == FALSE); CLK_ClockSwitchCmd(ENABLE); CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, ENABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE); } void GPIO_setup(void) { GPIO_DeInit(GPIOC); GPIO_Init(GPIOC, GPIO_PIN_3|GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_FAST); } void TIM1_setup(void) { TIM1_DeInit(); TIM1_TimeBaseInit(16, TIM1_COUNTERMODE_UP, 1000, 1); TIM1_OC1Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE, 1000, TIM1_OCPOLARITY_LOW, TIM1_OCNPOLARITY_LOW, TIM1_OCIDLESTATE_RESET, TIM1_OCNIDLESTATE_RESET); TIM1_CtrlPWMOutputs(ENABLE); TIM1_Cmd(ENABLE); } |
توضیحات
این بار از تمام 16 مگاهرتز سرعت HSI برای کلاک داخلی و CPU استفاده میکنیم:
1 2 3 4 5 | CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); …. …. CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, ENABLE); |
مانند مثالهای قبل، پینهای GPIO خروجی PWM به عنوان خروجی تنظیم میشوند.
1 2 3 4 5 6 | void GPIO_setup(void) { GPIO_DeInit(GPIOC); GPIO_Init(GPIOC, GPIO_PIN_3 |GPIO_PIN_6 , GPIO_MODE_OUT_PP_HIGH_FAST); } |
تنظیم اولیه کانال TIM1 و OC درست همانند مثال قبلی با برخی تفاوتهای جزئی است. به نظر میرسد که بخش تولید زمان نیاز به استدلالهای اضافی دارد. به این دلیل است که:
- بر خلاف تایمرهای دیگر، مقدار precaler TIM1 مقدار ثابتی نیست و میتواند ضریبی از 2 باشد.
- شمارنده علاوه بر شمارش رو به بالا ، شمارش به صورت معکوس را نیز دارد.
- تایمر 1 شمارنده تکرار شونده نیز دارد.
- به جز تایمر اصلی تمامی تایمرهای STM8 دارای 16 بیت هستند.
اگر فایل هدر تایمر 1 را باز کنید، توابع بسیاری را خواهید دید. بسیاری از این فانکشنها منحصراً برای تایمر 1 هستند. که بیانگر قدرت این تایمر پیشرفته است.
به همین ترتیب، برخی از اطلاعات اضافی که در هنگام تنظیم کانالهای OC مورد نیاز است وجود دارد. حتی اگر از کانالهای مکمل استفاده نکنیم به اطلاعات آنها نیاز داریم. میتوان پلاریته را برای PWM در حالت پیش فرض قرار داد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | void TIM1_setup(void) { TIM1_DeInit(); TIM1_TimeBaseInit(16, TIM1_COUNTERMODE_UP, 1000, 1); TIM1_OC1Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE, 1000, TIM1_OCPOLARITY_LOW, TIM1_OCNPOLARITY_LOW, TIM1_OCIDLESTATE_RESET, TIM1_OCNIDLESTATE_RESET); TIM1_CtrlPWMOutputs(ENABLE); TIM1_Cmd(ENABLE); } |
برای تغییر چرخه کار کانال، باید این تابع را فراخوانی کنیم:
1 | TIM1_SetCompareX(duty_cycle); // where X represents channel ID (1, 2, 3 or 4) |
خروجیها به صورت جفتی اتفاق میافتند و آنها کاملاً به هم وابسته هستند. به همین دلیل هیچ عملکرد جداگانهای برای خروجی با برچسب N وجود ندارد.
سیسوگ در قسمت بیستم و یکم از مجموعه آموزش میکروکنترلر STM8 قصد دارد به بررسی اجمالی ارتباطات بپردازد. با سیسوگ همراه باشید.
لینکهای دانلود
مطالب مرتبط
- قسمت اول − میکروکنترلر STM8 چیست و از کجا آمده است؟
- قسمت دوم − معرفی بردهای Discovery میکروکنترلر STM8
- قسمت سوم − کامپایلر و پروگرامر
- قسمت چهارم − STM8CubeMX
- قسمت پنجم − آماده سازی ابزارهای نرمافزاری برای STM8
- قسمت ششم − چگونه برنامه خود را روی STM8 آپلود کنیم؟
- قسمت هفتم− LED چشمکزن
- قسمت هشتم − کلاک سیستم (CLK)
- قسمت نهم − وقفه خارجی (EXTI)
- قسمت دهم − Beeper
- قسمت یازدهم − LCD کاراکتری
- قسمت دوازدهم − مبدل آنالوگ به دیجیتال (ADC)
- قسمت سیزدهم − تایمر نگهبان آنالوگ (AWD)
- قسمت چهادهم − تایمر نگهبان (IWDG)
- قسمت پانزدهم − تایمر نگهبان محدوده ای (WWDG)
- قسمت شانزدهم− اصول اولیه تایمرها
- قسمت هفدهم− تایمر 2
- قسمت هجدهم −تایمر 4
- قسمت نوزدهم −PWM
- قسمت بیست و یکم − بررسی اجمالی ارتباطات
- قسمت بیست و دوم − رابط سریال (UART)
- قسمت بیست و سوم − رابط کاربری سریال (SPI)
- قسمت بیست و چهارم − رابط I2C
- دوره رایگان آموزش میکروکنترلر STM8 – سیسوگ
سلام من کد بالا رو در نرم افزار میزنم ارور هم نمیده اما pwm برام کار نمیکنه مشکل ازکجاس؟
قطعا جایی مشکل هست مثل فعال کردن تایمر یا کال کردن یه روتین یا همچین چیزی
سلام و عرض ادب. با تشکر از مطالب آموزشی مفید شما. در بخش تایمرها امکان این هست که توضیحاتی در مورد شمارش تعداد پالسهای ورودی هم داشته باشیم. بطور مثال یک شمارنده برای تعداد پالسهای ورودی به سیستم.
سلام دوست عزیز
اگر آموزش ادامه پیدا کرد بله حتما چرا که نه !
واقعا نهایت تشکر رو از شما دارم، خیلی سایتتون آموزنده هست و این آموزش زمانی ارزش چند برابر به خودش میگیره که شما آموزش ها رو زحمت کشیدین و سپس رایگان در اختیار عموم قرار دادین، تجربه شخصی خودم در مورد آموزش stm8 اینکه آموزش متنی و رایگان شما از فیلم و سی دی بعضی از فروشگاه ها که حتی با تضمین صد در صد تبلیغ محصول خود را مینمایند و جوابگوی سوالات نیز نیستن و من نیز نام نمیبرم خیلی بهتر برام بوده و صمیمانه آرزوی بهترینها رو برایتان دارم.همچنین STM32 را نیز با کمک سایت شما فرا آموختم .
سلام دوست عزیز
خیلی ممنونم برای کامنت انرژی بخشتون – ما رو برای پیمودن ادامه راه دلگرم میکنه 🙂
خوشحالم که بخشی از آموزش ها تونسته براتون مفید باشه و باید تشکر کنم از تمام دوستانی که در این راه ما رو راهنمایی و کمک کردن
سلام
توضیحات عالی هست فقط من خروجی pwm روی برد دست ساز خودم ندارم یه جا خوندم که می گفت باید byte option ها رو تنظیم کنید تا خروجی pwm داشته باشید لطفا راهنمایی کنید
ممنون
سلام دوست عزیز
تا اونجا که من اطلاع دارم – این میکروکنترلر آپشن بایتی برای این موضوع نداره و بیشتر بحث برمیگرده تنظیمات خود تایمر که همه به شکل نرم افزاری انجام میشه
با سلام و خدا قوت
TIM 1 بنده کانال 1 و 2 اش کار نمیکنه ودر صورتی که PWM کانال 3 و 4 به خوبی کار میکنن .STM8S003
ممنون میشم راهنمایی بفرمائید
سلام عرفان. اگه کدتون رو درست نوشته باشید ممکن است فیزیکالی این کانالها دچار مشکل شده باشن.
لطفا مطلب بیشتری در این رابطه قرار بدین
مثلا شما درباره I2C چیزی نگفتین. (راه اندازی یه E2PROM یا هر چیزی که با I2C کار میکنه)
سعی میکنیم مطالبی که بیان نشده را طی آموزش های دیگری منتشر کنیم.
سپاس از همراهی شما
سلام خسته نباشید
آموزش هاتون خیلی خوبه _ کاملا مفید هست _ امیدوارم ادامه دار باشه
ممنون
سلام ممنون از لطف شما
قسمت های آموزشی میکروکنترلر STM8 تقریبا رو به پایان است و در روزهای آینده قسمت بعدی را منتشر میکنیم.