سیسوگ در قسمت هجدهم آموزش میکروکنترلر STM8 تایمر 4 را به شما معرفی کرد و برنامه آن را با هم بررسی کردیم. در این قسمت از مجموعه مقالات آموزش میکروکنترلر STM8 قصد دارد ویژگی پرکاربرد PWM را بررسی کند. با سیسوگ همراه باشید.
PWM :
تایمر 2 یا به عبارتی PWM جز ویژگی های مهم هر میکروکنترلر است. PWM کاربردهای بسیاری از جمله کنترل موتور، SMPS ها، کنترل روشنایی، تولید صدا، تولید موج و غیره را دارد. برخلاف دیگر میکروکنترلرها که کانال های PWM محدودی دارند، STM8 دارای چندین کانال PWM است، که تعدادی از آن ها به عنوان تایمر 2 (تایمر عمومی) هستند. به عنوان مثال، STM8S003F دارای سه کانال PWM مستقل است.
PWMهایی که توسط تایمر عمومی تولید می شوند، PWMهای اولیه هستند. اینها می توانند برای کارهای ساده ای همچون کنترل روشنایی LED، کنترل موتور سروو و غیره مورد استفاده قرار گیرند. که نیازی به ویژگی های پیشرفته مانند dead-time، brake یا تولید زمان موج را ندارد. در این بخش نحوه استفاده از تایمر 2 برای تولید PWMهای ساده را خواهیم دید.
توجه داشته باشید که در میکروکنترلرهای پیشرفته STM8 ورودی / خروجی های تایمر به عملکرد بیت های پیکربندی بستگی دارد. قبل از بارگذاری کد این بیت ها را بررسی کنید. در برخی میکروکنترلرهای STM8 ورودی / خروجی ها قابل انتقال هستند، بدین معنی که ورودی / خروجی را می توان در GPIO های مختلف مبادله کرد. در صورت نیاز می توانید از STM8CubeMx استفاده کنید.
اتصالات سخت افزاری
نمونه کد PWM
این یک مثال بسیار ساده است. در اینجا هر 3 کانال تایمر 2 برای تغییر نور LED های متصل به کانال های تایمر استفاده می شود.
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 | #include "STM8S.h" void clock_setup(void); void GPIO_setup(void); void TIM2_setup(void); void main(void) { int j; signed int pwm_duty = 0x0000; clock_setup(); GPIO_setup(); TIM2_setup(); while(TRUE) { for(pwm_duty = 0; pwm_duty < 1000; pwm_duty += 10) { TIM2_SetCompare1(pwm_duty); TIM2_SetCompare2(pwm_duty); TIM2_SetCompare3(pwm_duty); for(j=0;j<0x00DF;j++); } for(pwm_duty = 1000; pwm_duty > 0; pwm_duty -= 10) { TIM2_SetCompare1(pwm_duty); TIM2_SetCompare2(pwm_duty); TIM2_SetCompare3(pwm_duty); for(j=0;j<0x00DF;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_HSIDIV8); CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, ENABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE); } void GPIO_setup(void) { GPIO_DeInit(GPIOA); GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_DeInit(GPIOD); GPIO_Init(GPIOD, ((GPIO_Pin_TypeDef)GPIO_PIN_3 | GPIO_PIN_4), GPIO_MODE_OUT_PP_HIGH_FAST); } void TIM2_setup(void) { TIM2_DeInit(); TIM2_TimeBaseInit(TIM2_PRESCALER_32, 1000); TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 1000, TIM2_OCPOLARITY_HIGH); TIM2_OC2Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 1000, TIM2_OCPOLARITY_LOW); TIM2_OC3Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 1000, TIM2_OCPOLARITY_HIGH); TIM2_Cmd(ENABLE); } |
توضیحات
این بار نیز CPU و کلاک داخلی در 2 مگاهرتز تنظیم می شوند.
1 2 3 4 5 | CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8); CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); …. …. CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, ENABLE); |
سپس باید PWM GPIOها را به عنوان خروجی تعریف کنیم.
1 2 3 4 5 6 7 8 9 | void GPIO_setup(void) { GPIO_DeInit(GPIOA); GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_DeInit(GPIOD); GPIO_Init(GPIOD, ((GPIO_Pin_TypeDef)GPIO_PIN_3 | GPIO_PIN_4), GPIO_MODE_OUT_PP_HIGH_FAST); } |
درست مانند دیگر میکروکنترلرها، نسل PWM شامل یک تایمر است. همانطور که گفتیم TIM2 یک تایمر است. باید قبل از اینکه کانال PWM را تنظیم کنیم، در ابتدا زمان را تنظیم کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 | void TIM2_setup(void) { TIM2_DeInit(); TIM2_TimeBaseInit(TIM2_PRESCALER_32, 1000); TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 1000, TIM2_OCPOLARITY_HIGH); TIM2_OC2Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 1000, TIM2_OCPOLARITY_LOW); TIM2_OC3Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 1000, TIM2_OCPOLARITY_HIGH); TIM2_Cmd(ENABLE); } |
در کدهای بالا، تایمر 2 دارای پایه زمانی 16ms یا 62.5KHz است. این پایه زمانی مجدداً توسط واحد مقایسه کننده خروجی (OC) تقسیم میشود. در اینجا پایه 62.5KHz به 1000 تقسیم میشود تا فرکانس PWM 62.5Hz حاصل شود. حداکثر چرخه کاری 1000 است. علاوه بر این، می توانیم پلاریته PWM را تنظیم کنیم و به کانال فرمان دهیم که به صورت معکوس عمل کند یا نه.
برای تغییر وظیفه PWM باید تابع زیر را فراخوانی کنیم:
1 | TIM2_SetCompareX(pwm_duty); where X represents channel ID (1, 2 or 3) |
توجه داشته باشید که در میکروکنترلرهای STM8 بین فرکانس کاری و فرکانس PWM تبادلی وجود دارد. اگر فرکانس کاری بزرگ باشد فرکانس PWM کوچک است و برعکس. این موضوع برای تمامی تایمرها صادق است.
سیسوگ در قسمت بیستم از مجموعه آموزش میکروکنترلر STM8 قسمت PWM تایمر 1 را مورد بررسی قرار میدهد. با سیسوگ همراه باشید.
لینکهای دانلود
مطالب مرتبط
- قسمت اول − میکروکنترلر STM8 چیست و از کجا آمده است؟
- قسمت دوم − معرفی بردهای Discovery میکروکنترلر STM8
- قسمت سوم − کامپایلر و پروگرامر
- قسمت چهارم − STM8CubeMX
- قسمت پنجم − آماده سازی ابزارهای نرمافزاری برای STM8
- قسمت ششم − چگونه برنامه خود را روی STM8 آپلود کنیم؟
- قسمت هفتم− LED چشمکزن
- قسمت هشتم − کلاک سیستم (CLK)
- قسمت نهم − وقفه خارجی (EXTI)
- قسمت دهم − Beeper
- قسمت یازدهم − LCD کاراکتری
- قسمت دوازدهم − مبدل آنالوگ به دیجیتال (ADC)
- قسمت سیزدهم − تایمر نگهبان آنالوگ (AWD)
- قسمت چهادهم − تایمر نگهبان (IWDG)
- قسمت پانزدهم − تایمر نگهبان محدوده ای (WWDG)
- قسمت شانزدهم− اصول اولیه تایمرها
- قسمت هفدهم− تایمر 2
- قسمت هجدهم −تایمر 4
- قسمت بیستم − PWM تایمر 1
- قسمت بیست و یکم − بررسی اجمالی ارتباطات
- قسمت بیست و دوم − رابط سریال (UART)
- قسمت بیست و سوم − رابط کاربری سریال (SPI)
- قسمت بیست و چهارم − رابط I2C
- دوره رایگان آموزش میکروکنترلر STM8 – سیسوگ
سلام. من از stm8s105k4c6 استفاده می کنم. در تایمر 2 کانال 3 به صورتی هست که برای فعال شدن نیاز به remap داره و چیزی تو اینترنت ندیدم. کسی تونسته حل کنه این مشکل رو؟
سلام مرسی از سیسوگ بابت این مطالب ارزشمند و شما نویسنده محترم که قطعا ساعت ها وقت گذاشتید تا این مطالب به سرانجام برسه تشکر میکنم..
دوستان توجه کنید یادگیری تایمرخیلی مهمه و استفاده از اون منجر میشه تا شما بتونید پروژه و برنامه های بسیاره پیچیده رو پیاده سازی کنید ..منتظر اموزش های بعدی بخصوص twi هم هستم ..
سیسوگ نگو بهترین بگو ههه موفق باشید
سلام
ممنون از شما… حمایت دوستان باعث دلگرمی ما میشه.