GebraBit

توقف تایمر

متن سربرگ خود را وارد کنید

11

توقف تایمر

  1. خانه
  2. »
  3. میکروکنترلر
  4. »
  5. توقف تایمر

توقف تایمر

 CubeHAL سه تابع را برای توقف تایمر در حال اجرا ، با توجه به حالت کاری تایمر ، ارائه می‌کند: HAL_TIM_Base_Stop()، HAL_TIM_Base_Stop_IT() و HAL_TIM_Base_Stop_DMA(). (به عنوان مثال، اگر تایمر را در حالت وقفه راه اندازی کرده باشیم، باید آن را با استفاده از تابع HAL_TIM_Base_Stop_IT() متوقف کنیم). هر تابع برای غیرفعال کردن صحیح تنظیمات IRQ و DMA طراحی شده است.

تایمر های General Purpose

 اکثر تایمرهای میکروکنترلرهای STM32 تایمرهای general purpose  هستند. برخلاف تایمرهای اولیه ای basic timers  که قبلا دیدیم، آنها به لطف چهار کانال مستقل که می توانند برای اندازه گیری سیگنال های ورودی، ارائه سیگنال در خروجی بر اساس زمان، تولید سیگنال های مدولاسیون عرض پالس (PWM) استفاده شوند، قابلیت های بسیار زیادی را ارائه می دهند.

تولید پایه زمان Time Base با منابع کلاک خارجی

 شکل زیر بلوک دیاگرام یک تایمر general purpose  را نشان می دهد. زمانی که کلاک APB به عنوان منبع انتخاب می شود، مسیری که با رنگ قرمز مشخص شده است برای تغذیه تایمر استفاده می شود: کلاک داخلی CK_INT در واقع Prescaler  (PSC) را تغذیه کرده و تعیین می کند که رجیستر شمارنده (CNT) با چه سرعتی افزایش/کاهش یابد. این رجیستر با محتوای auto-reload register (که با مقدار فیلد TIM_Base_InitTypeDef.Period پر شده است) مقایسه می شود. هنگامی که مطابقت پیدا کردند، رویداد UEV ایجاد شده و IRQ مربوطه در صورتی که فعال باشد ، رخ می دهد.

با نگاهی به شکل بالا ، می بینیم که تایمر می تواند منبع “محرک” را از منابع دیگر نیز دریافت کند. این منابع تحریک را می توان به دو گروه اصلی تقسیم کرد:

  • منابع Clock ، برای کلاک تایمر  استفاده می شوند. آنها می توانند از منابع خارجی متصل به پین های میکروکنترلر یا سایر تایمرهایی که به صورت داخلی به MCU متصل هستند، نشات بگیرند. توجه داشته باشید که یک تایمر نمی تواند بدون منبع کلاک کار کند، زیرا از آن برای افزایش رجیستر counter  استفاده می شود.
  •  منابع Trigger ، برای همگام سازی تایمر با منابع خارجی متصل به پین های میکروکنترلر یا سایر تایمرهایی که به صورت داخلی به میکروکنترلر متصل هستند ، استفاده می شود. به عنوان مثال، یک تایمر را می توان طوری پیکربندی کرد که وقتی یک رویداد خارجی آن را تحریک می کند،  شروع به شمارش کند. در این حالت تایمر توسط یک منبع کلاک دیگر (که می تواند هم گذرگاه APBx یا یک منبع کلاک خارجی متصل به پین ETR2 باشد) کلاک می شود و توسط دستگاه دیگری کنترل می شود (یعنی چه زمانی شروع به شمارش کند …).

بسته به نوع تایمر و اجرای آن، یک تایمر می تواند از منابع زیر کلاک شود:

  • TIMx_CLK داخلی ارائه شده توسط RCC
  • ورودی trigger داخلی 0 تا 3

– ITR0، ITR1، ITR2 و ITR3 با استفاده از تایمر دیگری (master) به عنوان prescaler  این تایمر (slave)

  • پین های کانال ورودی خارجی

– پین 1: TI1FP1 یا TI1F_ED

– پین 2: TI2FP2

  • پین های ETR خارجی:

– پین ETR1

    – پین ETR2

همچنین یک تایمر می تواند از موارد زیر تحریک شود:

  • ورودی های trigger داخلی 0 تا 3

– ITR0، ITR1، ITR2 و ITR3 با استفاده از تایمر دیگری به عنوان master

  • پین های کانال ورودی خارجی

– پین 1: TI1FP1 یا TI1F_ED

– پین 2: TI2FP2

  • پین خارجی ETR1

External Clock Mode 2

تایمرهای  General purpose این قابلیت را دارند که از منابع خارجی کلاک شوند و می توانید آنها را در دو حالت متمایز تنظیم کنید: External Clock Source Mode 1 and 2  . حالت اول زمانی قابل اجرا است که تایمر در حالت slave  پیکربندی شده باشد.

حالت دوم، به سادگی با استفاده از یک منبع کلاک خارجی فعال می شود. این امر باعث می شود تا از منابع دقیق تر و اختصاصی استفاده کنید و در نهایت تعداد دفعات شمارش را کاهش دهید. هنگامی که حالت منبع کلاک خارجی 2 انتخاب می شود، فرمول محاسبه فرکانس به روز رسانی رویدادها به صورت زیر در می آید:

UpdateEvent = EXTclock/(EXTclockP rescaler)(P rescaler + 1)(P eriod + 1)(RepetitionCounter + 1)

که EXTclock فرکانس منبع خارجی است و EXTclockP rescaler یک تقسیم کننده فرکانس منبع است که می تواند مقادیر 1، 2، 4 و 8 را در برگیرد.

منبع کلاک یک تایمر general purpose  را می توان با استفاده از تابع HAL_TIM_ConfigClockSource() و نمونه ای از ساختار TIM_ClockConfigTypeDef انتخاب کرد که به صورت زیر تعریف می شود:

typedef struct {

uint32_t ClockSource; /* TIM clock sources */

uint32_t ClockPolarity; /* TIM clock polarity */

uint32_t ClockPrescaler; /* TIM clock prescaler */

uint32_t ClockFilter; /* TIM clock filter */

{ TIM_ClockConfigTypeDef;

  • ClockSource: منبع سیگنال کلاک مورد استفاده برای بایاس تایمر را مشخص می کند و می تواند مقادیر جدول زیر را در بر گیرد. به طور پیش فرض، حالت TIM_CLOCKSOURCE_INTERNAL انتخاب شده است.
  • ClockPolarity: قطبیت سیگنال کلاک مورد استفاده برای بایاس تایمر را نشان می دهد و می تواند مقادیر جدول زیر را در بر گیرد. به طور پیش فرض، حالت TIM_CLOCKPOLARITY_RISING انتخاب شده است.
  • ClockPrescaler: مقدار prescaler را برای منبع کلاک خارجی مشخص می کند و می تواند مقادیر جدول زیر را در بر گیرد. به طور پیش فرض، مقدار TIM_CLOCKPRESCALER_DIV1 انتخاب شده است.
  • ClockFilter: این فیلد 4 بیتی فرکانس مورد استفاده برای نمونه برداری از سیگنال کلاک خارجی و طول فیلتر دیجیتال اعمال شده روی آن را مشخص می کند. فیلتر دیجیتال از یک شمارنده رویداد ساخته شده است که در آن N رویداد متوالی برای تأیید یک انتقال در خروجی مورد نیاز است. در مورد نحوه محاسبه fDT S (سیگنال Dead-Time) به برگه دیتاشیت مراجعه کنید. به طور پیش فرض، این فیلتر غیرفعال است.

در ادامه نحوه استفاده از منبع کلاک خارجی برای تایمر TIM3 را شرح می دهیم.در این مثال پین خروجی Master Clock Output (MCO)  را به پایه TIM3_ETR2 ، که متناظر با پین PD2 برای همه بردهای Nucleo است ، متصل می کنیم (شکل زیر).

پین MCO فعال بوده و به منبع کلاک LSE، که با فرکانس 32.768 کیلوهرتز کار می‌کند، وصل شده است. کد زیر مهم ترین بخش مثال بالا را نشان می دهد:

				
					23 void MX_TIM3_Init(void){
24 TIM_ClockConfigTypeDef sClockSourceConfig;
  25 
  26 htim3.Instance = TIM3;
  27 htim3.Init.Prescaler = 0;
  28 htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  29 htim3.Init.Period = 16383; 
  30 htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; 
  31 htim3.Init.RepetitionCounter = 0;
  32 HAL_TIM_Base_Init(&htim3); 
  33 
  34 sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2;
  35 sClockSourceConfig.ClockPolarity = TIM_CLOCKPOLARITY_NONINVERTED;
  36 sClockSourceConfig.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1;
  37 sClockSourceConfig.ClockFilter = 0; 
  38 HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig);
39
40 HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
41 HAL_NVIC_EnableIRQ(TIM3_IRQn);
}42
 43
44 void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) {
45 GPIO_InitTypeDef GPIO_InitStruct;
46 if(htim_base->Instance==TIM3) {
47 /* Peripheral clock enable */ __
48 HAL_RCC_TIM3_CLK_ENABLE();  __
49HAL_RCC_GPIOD_CLK_ENABLE();
50
51 /**TIM3 GPIO Configuration 52 PD2 ------> TIM3_ETR
53 */ 
54 GPIO_InitStruct.Pin = GPIO_PIN_2;
55 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
56 GPIO_InitStruct.Pull = GPIO_NOPULL; 
57 GPIO_InitStruct.Speed = GPIO_SPEED_LOW; 
58 HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); 
59 } 
60 {

				
			

خطوط [27:33] تایمر TIM3 را پیکربندی می‌کنند و دوره را روی 19999 تنظیم می‌کنند. خطوط [34:38] منبع کلاک خارجی را برای TIM3 پیکربندی می‌کنند. از آنجایی که اسیلاتور LSE در فرکانس 32.768 کیلوهرتز کار می کند، با استفاده از معادله زیر می توانیم فرکانس UEV را محاسبه کنیم که برابر است با:

 

UpdateEvent = 32:768/(1)(0 + 1)(16383 + 1)(0 + 1) = 2Hz = 0.5s

در نهایت، خطوط [48:58] ، TIM3  را فعال کرده و پین PD2 (که مربوط به پایه TIM3_ETR2 است) را به عنوان منبع ورودی پیکربندی می‌کنند.

نکته: پورت GPIO D باید با استفاده از ماکرو __GPIOD_CLK_ENABLE () ، قبل از اینکه از آن به عنوان منبع کلاک برای TIM3 استفاده کنیم، فعال شود. همین امر حتی در مورد TIM3 نیز صدق می‌کند، که با استفاده از __TIM3_CLK_ENABLE() فعال می شود.

 

External Clock Mode 1

تایمرهای general purpose همه منظوره و advanced پیشرفته STM32 را می توان برای کار در حالت master  یا slave پیکربندی کرد. زمانی که یک تایمر به‌عنوان slave پیکربندی شده باشد، می‌تواند توسط خطوط داخلی ITR0، ITR1، ITR2 و ITR3، یک کلاک خارجی متصل به پین ETR1 یا از منابع کلاک دیگر متصل به منابع TI1FP1 و TI2FP2، که مطابق با پین های 1 و 2  کانال است تغذیه (کلاک) شود. این حالت کاری External Clock Mode 1 نامیده می شود .

حالت کلاک خارجی 1 و 2 برای همه مبتدیان در میکروهای STM32 گیج کننده است. هر دو حالت راهی برای کلاک کردن یک تایمر با استفاده از یک منبع کلاک خارجی هستند، اما حالت اول با پیکربندی تایمر در حالت slave ایجاد می‌شود (در واقع نوعی ” triggering ” است)، در حالی که حالت دوم با انتخاب ساده منابع کلاک مختلف به دست می‌آید.

نکته: ورودی‌های TI1FP1 و TI2FP2 چیزی بیش از کانال‌های ورودی TI1 و TI2 تایمر پس از اعمال فیلتر در ورودی نیستند.

برای پیکربندی تایمر در حالت slave از تابع HAL_TIM_SlaveConfigSynchronization() و نمونه ای از ساختار TIM_SlaveConfigTypeDef استفاده می کنیم که به صورت زیر تعریف می شود:

typedef struct {

uint32_t ClockSource; /* TIM clock sources */

uint32_t ClockPolarity; /* TIM clock polarity */

uint32_t ClockPrescaler; /* TIM clock prescaler */

uint32_t ClockFilter; /* TIM clock filter */

{ TIM_ClockConfigTypeDef;

  • SlaveMode: هنگامی که یک تایمر در حالت slave پیکربندی می شود، می تواند توسط چندین منبع مختلف کلاک/راه اندازی شود. این فیلد می تواند مقادیری از جدول زیر را در بر گیرد. این پاراگراف در مورد حالت TIM_SLAVEMODE_EXTERNAL1 است.

InputTrigger: منبعی که تایمر پیکربندی شده در حالت برده را فعال/کلاک می کند، مشخص می کند. این فیلد می تواند مقادیری از جدول زیر را در بر گیرد.

  • TriggerPolarity: قطبیت منبع تریگر/ساعت را نشان می دهد. می تواند مقادیری از جدول زیر را در بر گیرد.
  • TriggerPrescaler: این بخش prescaler را برای منبع کلاک خارجی مشخص می کند. می تواند مقادیری از جدول زیر را در بر گیرد. به طور پیش فرض، مقدار TIM_TRIGGERPRESCALER_DIV1 انتخاب شده است.

این مقاله را با دوستانتان به اشتراک بگذارید!

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

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

Shopping cart
Start typing to see posts you are looking for.

Sign in

No account yet?