uk
Feedback
برق و الکترونیک *دانلود پروژه رایگان

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

Відкрити в Telegram

بسمه تعالی دانلود پروژه و پی سی بی رایگان

Показати більше
2 293
Підписники
Немає даних24 години
Немає даних7 днів
+330 днів
Архів дописів
قابلیت Synchronization در HRTIM میکروکنترلر STM32H743 این قابلیت امکان هماهنگسازی تایمرهای HRTIM با یکدیگر یا با رویدادهای خارجی (مثل تریگر ADC یا تایمرهای دیگر) را فراهم میکند. سنکرونسازی برای کاربردهایی مانند تولید PWMهای چندفاز همزمان، کنترل موتورهای دقیق، یا هماهنگی با ماژولهای دیگر حیاتی است. در زیر بهصورت کامل با مثالهای عملی توضیح میدهیم: --- ### ۱. اصول Synchronization در HRTIM - هدف: - شروع/توقف/ریست همزمان یا با تاخیر چند تایمر. - ایجاد اختلاف فاز دقیق بین خروجیهای PWM. - هماهنگی با رویدادهای خارجی (مثل تریگر ADC برای نمونهبرداری همزمان). - انواع سنکرونسازی: 1. داخلی: هماهنگی بین تایمرهای HRTIM (مثلاً Timer A بهعنوان Master و Timer B بهعنوان Slave). 2. خارجی: استفاده از سیگنالهای خارجی (مثل پین GPIO یا تایمرهای دیگر). --- ### ۲. منابع سنکرونسازی (Trigger Sources) HRTIM از منابع زیر برای سنکرونسازی پشتیبانی میکند: - تریگرهای داخلی: خروجی رویدادهای تایمرهای HRTIM (مثلاً پایان دوره PWM). - تریگرهای خارجی: پینهای GPIO یا ماژولهای دیگر (مثلاً TIM1, ADC). - نرمافزاری: سنکرونسازی با دستور مستقیم CPU. --- ### ۳. مثال ۱: سنکرونسازی داخلی (Master-Slave) سناریو: - Timer A بهعنوان Master با فرکانس ۱ MHz تنظیم شود. - Timer B بهعنوان Slave با تاخیر فاز ۲۵۰ ns نسبت به Timer A شروع به کار کند. #### مراحل پیکربندی:
// ۱. پیکربندی Timer A (Master)
HRTIM_TimeBaseInitTypeDef hrtim_master;
hrtim_master.CounterMode = HRTIM_COUNTERMODE_UP;
hrtim_master.Period = 460; // فرکانس ۱ MHz (۴۶۰ + ۱) / ۴.۶ GHz ≈ ۱۰۰ ns × ۱۰ = ۱ µs
HAL_HRTIM_TimeBaseConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &hrtim_master);

// ۲. پیکربندی Timer B (Slave)
HRTIM_TimeBaseInitTypeDef hrtim_slave;
hrtim_slave.CounterMode = HRTIM_COUNTERMODE_UP;
hrtim_slave.Period = 460; // همان فرکانس Master
HAL_HRTIM_TimeBaseConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, &hrtim_slave);

// ۳. تنظیم تاخیر فاز برای Timer B (۲۵۰ ns)
uint32_t phase_shift = 250e-9 / 0.184e-9 ≈ ۱۳۵۸; // محاسبه بر اساس رزولوشن ۱۸۴ پیکوثانیه
HAL_HRTIM_SetPhaseShift(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, phase_shift);

// ۴. تنظیم سنکرونسازی
// Timer B با رویداد "پایان دوره" Timer A سنکرون شود
HAL_HRTIM_SynchronizationConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, 
                                HRTIM_SYNCINPUT_MASTER_PERIOD, // منبع سنکرون = پایان دوره Master
                                HRTIM_SYNCOUTPUT_TIMER_A,      // خروجی سنکرون از Timer A
                                HRTIM_SYNC_DELAY_NONE);         // بدون تاخیر اضافی

// ۵. شروع تایمرها
HAL_HRTIM_WaveformCounterStart(&hhrtim, HRTIM_TIMERINDEX_TIMER_A);
HAL_HRTIM_WaveformCounterStart(&hhrtim, HRTIM_TIMERINDEX_TIMER_B);
#### شکل موج خروجی:
زمان (ns)    : ۰    ۲۵۰    ۵۰۰    ۷۵۰    ۱۰۰۰  
               |-----|-----|-----|-----|
خروجی Timer A : ██████████████████████████████  
خروجی Timer B : ░░░░░█████████████████████████  
--- ### ۴. مثال ۲: سنکرونسازی با تریگر خارجی (External Trigger) سناریو: - شروع همزمان تمام تایمرهای HRTIM با دریافت یک پالس روی پین PE9. #### مراحل پیکربندی:
// ۱. پیکربندی پین PE9 بهعنوان ورودی تریگر
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_HRTIM1; // PE9 به HRTIM متصل است
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

// ۲. تنظیم تایمرها برای سنکرونسازی با تریگر خارجی
for (int i = HRTIM_TIMERINDEX_TIMER_A; i <= HRTIM_TIMERINDEX_TIMER_F; i++) {
    HAL_HRTIM_SynchronizationConfig(&hhrtim, i,
                                    HRTIM_SYNCINPUT_EXTERNAL, // منبع سنکرون = تریگر خارجی
                                    HRTIM_SYNCOUTPUT_DISABLED,
                                    HRTIM_SYNC_DELAY_NONE);
}

// ۳. فعالسازی تریگر خارجی
HAL_HRTIM_ExternalTriggerConfig(&hhrtim, HRTIM_EXTTRIG_1, 
                               HRTIM_EXTTRIGPOLARITY_RISING, // لبه بالارونده فعال شود
                               HRTIM_EXTTRIGSOURCESEL_GPIO); // منبع = پین GPIO

// ۴. شروع تایمرها با دریافت تریگر
HAL_HRTIM_WaveformCounterStart_IT(&hhrtim, HRTIM_TIMERINDEX_TIMER_A);
---

- تفسیر: - در زمان ۱۰۰µs خطا (اضافهجریان) تشخیص داده میشود. - در ۱۰۰.۱µs (کمتر از ۱۰۰ns پس از خطا)، خروجی PWM قطع میشود. --- ### ۵. ویژگیهای پیشرفته Fault Protection 1. حالتهای بازیابی (Recovery Modes): - خودکار (Automatic): پس از رفع خطا، PWM بهطور خودکار ادامه مییابد. - دستی (Manual): نیاز به ریست نرمافزاری دارد.
   // تنظیم بازیابی خودکار
   sFaultConfig.FaultAutoRecovery = HRTIM_AUTORECOVERY_ENABLE;
   HAL_HRTIM_FaultConfig(&hhrtim, HRTIM_FAULTID_FAULT1, &sFaultConfig);
   
2. حالتهای ترکیبی (Combined Faults): - امکان ترکیب چند خطا با استفاده از AND/OR.
   sFaultConfig.FaultCombination = HRTIM_FAULTCOMBINATION_OR; // خطا اگر Fault1 یا Fault2 فعال شود
   
3. غیرفعالسازی انتخابی خروجیها: - میتوانید برخی خروجیها را در صورت خطا غیرفعال کنید و بقیه را فعال نگه دارید. --- ### ۶. مقایسه با سیستمهای نرمافزاری | ویژگی | Fault Protection سختافزاری (HRTIM) | قطع نرمافزاری (با وقفه) | |---------------------|-----------------------------------|------------------------| | زمان پاسخ | <100 ns | >1 µs (با تأخیر وقفه) | | مصرف CPU | صفر | نیازمند پردازش وقفه | | قابلیت اطمینان | بسیار بالا (غیروابسته به کد) | وابسته به صحت کد | --- ### ۷. نکات نهایی - تست سیستم: همیشه Fault Protection را با ایجاد خطای مصنوعی (مثل اتصال کوتاه آزمایشی) تست کنید. - فیلتر نویز: از فیلتر دیجیتال HRTIM برای جلوگیری از قطعهای کاذب استفاده کنید. - اولویتبندی خطاها: اگر چند خطا دارید، اولویت آنها را در رجیستر HRTIM_FLTCR1 تنظیم کنید.

قابلیت Fault Protection در HRTIM میکروکنترلر STM32H743 این قابلیت برای محافظت سریع و سختافزاری در برابر خطاهای خطرناک (مثل اتصال کوتاه، اضافهجریان، یا اضافهولتاژ) طراحی شده است. HRTIM میتواند در کمتر از ۱۰۰ نانوثانیه خروجیهای PWM را غیرفعال کند، بدون نیاز به دخالت CPU! در زیر بهطور کامل با مثال عملی توضیح میدهیم: --- ### ۱. اجزای اصلی سیستم Fault Protection 1. ورودیهای خطا (Fault Inputs): - ۴ ورودی خطای مستقل (Fault 1 تا Fault 4) که از طریق پینهای GPIO یا سیگنالهای داخلی (مثل کمپراتور) فعال میشوند. 2. منابع خطا: - خطاهای دیجیتال (مثل سیگنال از GPIO). - خطاهای آنالوگ (مثل تشخیص اضافهولتاژ توسط کمپراتور داخلی). 3. واکنش به خطا: - غیرفعالسازی فوری خروجیها (Fast Kill): قطع PWM در کمتر از ۱۰۰ نانوثانیه. - غیرفعالسازی نرم (Cycle-by-Cycle): قطع PWM پس از اتمام دوره جاری. - پیکربندی سلسلهمراتبی: اولویتبندی بین خطاهای مختلف. --- ### ۲. مراحل پیکربندی Fault Protection #### گام ۱: تنظیم ورودی خطا (مثال: استفاده از کمپراتور آنالوگ) فرض کنید میخواهید هنگامی که ولتاژ یک سنسور از ۳.۳V عبور کرد، خطا فعال شود:
// ۱. پیکربندی کمپراتور داخلی (COMP1)
COMP_HandleTypeDef hcomp1;
hcomp1.Instance = COMP1;
hcomp1.Init.InputPlus = COMP_INPUT_PLUS_IO1; // پین ورودی مثبت (مثلاً PA1)
hcomp1.Init.InputMinus = COMP_INPUT_MINUS_VREFINT; // مقایسه با ولتاژ مرجع داخلی (۳.۳V)
hcomp1.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED;
hcomp1.Init.Hysteresis = COMP_HYSTERESIS_HIGH;
HAL_COMP_Init(&hcomp1);

// ۲. فعالسازی خروجی کمپراتور به HRTIM
HAL_COMP_Start(&hcomp1);
#### گام ۲: پیکربندی ورودی خطا در HRTIM
// ۱. تنظیم Fault 1 برای دریافت سیگنال از کمپراتور
HRTIM_FaultConfigTypeDef sFaultConfig;
sFaultConfig.FaultInput = HRTIM_FAULTINPUT_COMP1; // انتخاب کمپراتور بهعنوان منبع خطا
sFaultConfig.FaultLevel = HRTIM_FAULTLEVEL_HIGH; // خطا هنگام HIGH شدن سیگنال
sFaultConfig.FaultEnable = HRTIM_FAULTENABLE_ENABLE; // فعالسازی خطا
HAL_HRTIM_FaultConfig(&hhrtim, HRTIM_FAULTID_FAULT1, &sFaultConfig);

// ۲. تنظیم واکنش به خطا (Fast Kill برای Timer A و B)
HAL_HRTIM_FaultOutputConfig(&hhrtim, HRTIM_FAULTID_FAULT1, 
                           HRTIM_OUTPUT_TA1 | HRTIM_OUTPUT_TB1, // خروجیهای مرتبط
                           HRTIM_FAULTOUTPUTACTION_FORCE_INACTIVE); // قطع فوری خروجیها
#### گام ۳: تنظیم زمان Deadband برای جلوگیری از نویز (اختیاری)
sFaultConfig.FaultFilter = 0x5; // فیلتر دیجیتال برای حذف نویز (۵ سیکل کلاک)
sFaultConfig.FaultPrescaler = HRTIM_FAULTPRESCALER_DIV8; // تقسیمکننده فرکانس
HAL_HRTIM_FaultConfig(&hhrtim, HRTIM_FAULTID_FAULT1, &sFaultConfig);
--- ### ۳. مثال عملی: قطع PWM در صورت اضافهجریان #### سناریو: - یک موتور با جریان نامی ۵A توسط HRTIM کنترل میشود. - اگر جریان موتور از ۵A عبور کند، کمپراتور خطا را فعال کرده و PWM قطع میشود. #### کد کامل:
// ۱. پیکربندی PWM برای Timer A (همانند مثالهای قبلی)
// ...

// ۲. پیکربندی Fault Protection
// فعالسازی کلاک GPIO و کمپراتور
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_COMP1_CLK_ENABLE();

// پیکربندی پین ورودی خطا (PA1)
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// پیکربندی کمپراتور (مقایسه ولتاژ PA1 با ۳.۳V)
// [کد کمپراتور همانند بالا]

// پیکربندی خطا در HRTIM
HRTIM_FaultConfigTypeDef sFaultConfig;
sFaultConfig.FaultInput = HRTIM_FAULTINPUT_COMP1;
sFaultConfig.FaultLevel = HRTIM_FAULTLEVEL_HIGH;
sFaultConfig.FaultEnable = HRTIM_FAULTENABLE_ENABLE;
sFaultConfig.FaultFilter = 0x5;
HAL_HRTIM_FaultConfig(&hhrtim, HRTIM_FAULTID_FAULT1, &sFaultConfig);

// تنظیم واکنش Fast Kill برای Timer A
HAL_HRTIM_FaultOutputConfig(&hhrtim, HRTIM_FAULTID_FAULT1, 
                           HRTIM_OUTPUT_TA1,
                           HRTIM_FAULTOUTPUTACTION_FORCE_INACTIVE);

// فعالسازی Fault Protection
HAL_HRTIM_FaultEnable(&hhrtim, HRTIM_FAULTID_FAULT1);
--- ### ۴. شکل موج خروجی (شبیهسازی)
زمان        : ۰µs   ۱۰۰µs (خطا فعال)   ۱۰۵µs
               |----------|-------------|
سیگنال PWM   : █████████████████████░░░░░░░░  
سیگنال خطا   : ______________█████____________  
خروجی پس از خطا: █████████████_______░░░░░░░░░

### ۶. مزایای Asymmetric PWM - کاهش نویز EMI: تغییرات ملایمتر در شیب سیگنال به دلیل تفاوت Duty Cycle در دو نیمه. - کنترل دقیقتر: امکان تنظیم پاسخ سیستم در حلقههای کنترلی با استفاده از دو پارامتر مستقل (Up/Down Duty). - انعطافپذیری بالا: تولید شکل موجهای غیرمتعارف برای کاربردهای خاص. --- ### ۷. مقایسه با PWM متقارن | ویژگی | Asymmetric PWM | PWM متقارن (معمولی) | |----------------------|---------------------------------|----------------------------| | Duty Cycle | متفاوت در Up/Down | یکسان در کل دوره | | پاسخ فرکانسی | سریعتر (به دلیل دو پارامتر) | کندتر | | پیچیدگی محاسباتی | بالاتر | پایین | | کاربردها | منابع تغذیه/موتورهای دقیق | کاربردهای عمومی PWM | --- ### ۸. نکات مهم - Dead Time: در صورت استفاده از پل-H، حتماً Dead Time اضافه کنید. - تغییر بلادرنگ پارامترها: مقادیر Compare را میتوان در حین کار تایمر بهروزرسانی کرد. - هماهنگی با ADC/DAC: از تریگر HRTIM برای نمونهبرداری در نقاط خاص شکل موج استفاده کنید.

پیادهسازی Asymmetric PWM با استفاده از HRTIM در STM32H743 Asymmetric PWM (پالس با مدولاسیون عرض پالس نامتقارن) نوعی از PWM است که در آن Duty Cycle در نیمههای مختلف دوره تناوب متفاوت است. این حالت برای کاربردهایی مانند کنترل دقیق موتورهای الکتریکی، منابع تغذیه سوییچینگ با پاسخگذاری سریع، یا تولید شکل موجهای پیچیده استفاده میشود. در زیر بهطور کامل با مثال و شبیهسازی شکل موج توضیح میدهیم: --- ### ۱. اصول Asymmetric PWM - تعریف: - در هر دوره تناوب، دو بخش Up-Counting (شمارش افزایشی) و Down-Counting (شمارش کاهشی) وجود دارد. - Duty Cycle در بخش Up و Down میتواند متفاوت باشد (مثلاً ۳۰٪ در Up و ۷۰٪ در Down). - مزایا: - کاهش نویز EMI به دلیل تغییرات ملایمتر در شیب سیگنال. - بهبود پاسخگذاری در سیستمهای کنترل حلقه بسته. --- ### ۲. پیکربندی HRTIM برای Asymmetric PWM برای تولید Asymmetric PWM با HRTIM مراحل زیر را دنبال کنید: #### گام ۱: تنظیم کلاک و پایهها - کلاک HRTIM را روی ۴.۶ GHz تنظیم کنید. - پین خروجی PWM را به یکی از تایمرها (مثلاً Timer A) وصل کنید. #### گام ۲: پیکربندی تایمر در حالت Dual Slope (شمارش Up/Down) - دوره تناوب (Period) را برای شمارش Up و Down تنظیم کنید. - دو مقدار Compare جداگانه برای بخشهای Up و Down تعیین کنید. #### گام ۳: فعالسازی خروجی PWM با تنظیمات نامتقارن --- ### ۳. مثال عملی: Asymmetric PWM با Duty Cycle متفاوت در Up/Down فرض کنید میخواهید یک PWM با فرکانس ۱ MHz تولید کنید که: - در بخش Up-Counting**، Duty Cycle = **۳۰٪. - در بخش Down-Counting**، Duty Cycle = **۷۰٪. #### پارامترهای محاسباتی - فرکانس PWM: ۱ MHz → دوره تناوب \( T_{PWM} = 1 \, \mu s \). - رزولوشن HRTIM: \( 184 \, ps \). - مقادیر Compare: - Up-Counting: \( 0.3 \times 460 = 138 \) (۳۰٪ از Period). - Down-Counting: \( 0.7 \times 460 = 322 \) (۷۰٪ از Period). #### کد نمونه (با استفاده از HAL Library)
// ۱. پیکربندی کلاک HRTIM (همانند مثال قبل)
// ...

// ۲. پیکربندی Timer A در حالت Dual Slope
HRTIM_TimeBaseInitTypeDef hrtim_config;
hrtim_config.CounterMode = HRTIM_COUNTERMODE_UPDOWN; // شمارش Up/Down
hrtim_config.Period = 460; // Period = 1 µs (460 + 1) / 4.6 GHz ≈ 100 ns × 10 = 1 µs
hrtim_config.RepetitionCounter = 0;
HAL_HRTIM_TimeBaseConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &hrtim_config);

// ۳. تنظیم Compare Units برای Up و Down
// Compare Unit 1: فعال در بخش Up-Counting (30% Duty)
HAL_HRTIM_WaveformCompareConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, 138);

// Compare Unit 2: فعال در بخش Down-Counting (70% Duty)
HAL_HRTIM_WaveformCompareConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_2, 322);

// ۴. تنظیم خروجی PWM برای واکنش به Compare Unit 1 و 2
HAL_HRTIM_WaveformOutputConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_POLARITY_HIGH, HRTIM_OUTPUT_IDLESTATE_INACTIVE);

// ۵. تنظیم حالت Asymmetric PWM
// در حالت Dual Slope، خروجی در Compare Unit 1 (Up) SET و در Compare Unit 2 (Down) RESET میشود
HAL_HRTIM_WaveformOutputSetConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, HRTIM_OUTPUTSET_ON_PERIOD);
HAL_HRTIM_WaveformOutputResetConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, HRTIM_OUTPUTRESET_ON_CMP2);

// ۶. شروع تایمر
HAL_HRTIM_WaveformCounterStart(&hhrtim, HRTIM_TIMERINDEX_TIMER_A);
--- ### ۴. شکل موج خروجی (شبیهسازی با متن)
زمان (µs)     : 0    0.3    0.7    1.0
               |------|------|------|
شمارش         : ▲ Up ▼ Down ▲ Up ▼ ...
مقدار کاونتر  : 0----138----460----322----0
خروجی PWM     : ███████░░░░░░█████████░░░░░
- بخش Up-Counting (۰ تا ۰.۵ µs): - خروجی در ۰ µs High میشود. - در ۰.۳ µs (مقدار Compare 1 = 138) خروجی Low میشود. - بخش Down-Counting (۰.۵ تا ۱ µs): - خروجی در ۰.۷ µs (مقدار Compare 2 = 322) دوباره High میشود. - در پایان دوره (۱ µs) خروجی Low میشود. --- ### ۵. توضیحات کلیدی کد - حالت Dual Slope: - تایمر از ۰ تا ۴۶۰ شمارش Up میکند، سپس از ۴۶۰ به ۰ شمارش Down میکند. - Compare Units: - Compare Unit 1 در بخش Up-Counting و Compare Unit 2 در بخش Down-Counting فعال میشوند. - تنظیمات خروجی: - خروجی در شروع دوره (Period) High شده، در Compare 1 Low میشود، سپس در Compare 2 دوباره High شده و در پایان دوره Low میشود. ---

- تفسیر: - در زمان ۱۰۰µs خطا (اضافهجریان) تشخیص داده میشود. - در ۱۰۰.۱µs (کمتر از ۱۰۰ns پس از خطا)، خروجی PWM قطع میشود. --- ### ۵. ویژگیهای پیشرفته Fault Protection 1. حالتهای بازیابی (Recovery Modes): - خودکار (Automatic): پس از رفع خطا، PWM بهطور خودکار ادامه مییابد. - دستی (Manual): نیاز به ریست نرمافزاری دارد.
   // تنظیم بازیابی خودکار
   sFaultConfig.FaultAutoRecovery = HRTIM_AUTORECOVERY_ENABLE;
   HAL_HRTIM_FaultConfig(&hhrtim, HRTIM_FAULTID_FAULT1, &sFaultConfig);
   
2. حالتهای ترکیبی (Combined Faults): - امکان ترکیب چند خطا با استفاده از AND/OR.
   sFaultConfig.FaultCombination = HRTIM_FAULTCOMBINATION_OR; // خطا اگر Fault1 یا Fault2 فعال شود
   
3. غیرفعالسازی انتخابی خروجیها: - میتوانید برخی خروجیها را در صورت خطا غیرفعال کنید و بقیه را فعال نگه دارید. --- ### ۶. مقایسه با سیستمهای نرمافزاری | ویژگی | Fault Protection سختافزاری (HRTIM) | قطع نرمافزاری (با وقفه) | |---------------------|-----------------------------------|------------------------| | زمان پاسخ | <100 ns | >1 µs (با تأخیر وقفه) | | مصرف CPU | صفر | نیازمند پردازش وقفه | | قابلیت اطمینان | بسیار بالا (غیروابسته به کد) | وابسته به صحت کد | --- ### ۷. نکات نهایی - تست سیستم: همیشه Fault Protection را با ایجاد خطای مصنوعی (مثل اتصال کوتاه آزمایشی) تست کنید. - فیلتر نویز: از فیلتر دیجیتال HRTIM برای جلوگیری از قطعهای کاذب استفاده کنید. - اولویتبندی خطاها: اگر چند خطا دارید، اولویت آنها را در رجیستر HRTIM_FLTCR1 تنظیم کنید.

قابلیت Fault Protection در HRTIM میکروکنترلر STM32H743 این قابلیت برای محافظت سریع و سختافزاری در برابر خطاهای خطرناک (مثل اتصال کوتاه، اضافهجریان، یا اضافهولتاژ) طراحی شده است. HRTIM میتواند در کمتر از ۱۰۰ نانوثانیه خروجیهای PWM را غیرفعال کند، بدون نیاز به دخالت CPU! در زیر بهطور کامل با مثال عملی توضیح میدهیم: --- ### ۱. اجزای اصلی سیستم Fault Protection 1. ورودیهای خطا (Fault Inputs): - ۴ ورودی خطای مستقل (Fault 1 تا Fault 4) که از طریق پینهای GPIO یا سیگنالهای داخلی (مثل کمپراتور) فعال میشوند. 2. منابع خطا: - خطاهای دیجیتال (مثل سیگنال از GPIO). - خطاهای آنالوگ (مثل تشخیص اضافهولتاژ توسط کمپراتور داخلی). 3. واکنش به خطا: - غیرفعالسازی فوری خروجیها (Fast Kill): قطع PWM در کمتر از ۱۰۰ نانوثانیه. - غیرفعالسازی نرم (Cycle-by-Cycle): قطع PWM پس از اتمام دوره جاری. - پیکربندی سلسلهمراتبی: اولویتبندی بین خطاهای مختلف. --- ### ۲. مراحل پیکربندی Fault Protection #### گام ۱: تنظیم ورودی خطا (مثال: استفاده از کمپراتور آنالوگ) فرض کنید میخواهید هنگامی که ولتاژ یک سنسور از ۳.۳V عبور کرد، خطا فعال شود:
// ۱. پیکربندی کمپراتور داخلی (COMP1)
COMP_HandleTypeDef hcomp1;
hcomp1.Instance = COMP1;
hcomp1.Init.InputPlus = COMP_INPUT_PLUS_IO1; // پین ورودی مثبت (مثلاً PA1)
hcomp1.Init.InputMinus = COMP_INPUT_MINUS_VREFINT; // مقایسه با ولتاژ مرجع داخلی (۳.۳V)
hcomp1.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED;
hcomp1.Init.Hysteresis = COMP_HYSTERESIS_HIGH;
HAL_COMP_Init(&hcomp1);

// ۲. فعالسازی خروجی کمپراتور به HRTIM
HAL_COMP_Start(&hcomp1);
#### گام ۲: پیکربندی ورودی خطا در HRTIM
// ۱. تنظیم Fault 1 برای دریافت سیگنال از کمپراتور
HRTIM_FaultConfigTypeDef sFaultConfig;
sFaultConfig.FaultInput = HRTIM_FAULTINPUT_COMP1; // انتخاب کمپراتور بهعنوان منبع خطا
sFaultConfig.FaultLevel = HRTIM_FAULTLEVEL_HIGH; // خطا هنگام HIGH شدن سیگنال
sFaultConfig.FaultEnable = HRTIM_FAULTENABLE_ENABLE; // فعالسازی خطا
HAL_HRTIM_FaultConfig(&hhrtim, HRTIM_FAULTID_FAULT1, &sFaultConfig);

// ۲. تنظیم واکنش به خطا (Fast Kill برای Timer A و B)
HAL_HRTIM_FaultOutputConfig(&hhrtim, HRTIM_FAULTID_FAULT1, 
                           HRTIM_OUTPUT_TA1 | HRTIM_OUTPUT_TB1, // خروجیهای مرتبط
                           HRTIM_FAULTOUTPUTACTION_FORCE_INACTIVE); // قطع فوری خروجیها
#### گام ۳: تنظیم زمان Deadband برای جلوگیری از نویز (اختیاری)
sFaultConfig.FaultFilter = 0x5; // فیلتر دیجیتال برای حذف نویز (۵ سیکل کلاک)
sFaultConfig.FaultPrescaler = HRTIM_FAULTPRESCALER_DIV8; // تقسیمکننده فرکانس
HAL_HRTIM_FaultConfig(&hhrtim, HRTIM_FAULTID_FAULT1, &sFaultConfig);
--- ### ۳. مثال عملی: قطع PWM در صورت اضافهجریان #### سناریو: - یک موتور با جریان نامی ۵A توسط HRTIM کنترل میشود. - اگر جریان موتور از ۵A عبور کند، کمپراتور خطا را فعال کرده و PWM قطع میشود. #### کد کامل:
// ۱. پیکربندی PWM برای Timer A (همانند مثالهای قبلی)
// ...

// ۲. پیکربندی Fault Protection
// فعالسازی کلاک GPIO و کمپراتور
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_COMP1_CLK_ENABLE();

// پیکربندی پین ورودی خطا (PA1)
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// پیکربندی کمپراتور (مقایسه ولتاژ PA1 با ۳.۳V)
// [کد کمپراتور همانند بالا]

// پیکربندی خطا در HRTIM
HRTIM_FaultConfigTypeDef sFaultConfig;
sFaultConfig.FaultInput = HRTIM_FAULTINPUT_COMP1;
sFaultConfig.FaultLevel = HRTIM_FAULTLEVEL_HIGH;
sFaultConfig.FaultEnable = HRTIM_FAULTENABLE_ENABLE;
sFaultConfig.FaultFilter = 0x5;
HAL_HRTIM_FaultConfig(&hhrtim, HRTIM_FAULTID_FAULT1, &sFaultConfig);

// تنظیم واکنش Fast Kill برای Timer A
HAL_HRTIM_FaultOutputConfig(&hhrtim, HRTIM_FAULTID_FAULT1, 
                           HRTIM_OUTPUT_TA1,
                           HRTIM_FAULTOUTPUTACTION_FORCE_INACTIVE);

// فعالسازی Fault Protection
HAL_HRTIM_FaultEnable(&hhrtim, HRTIM_FAULTID_FAULT1);
--- ### ۴. شکل موج خروجی (شبیهسازی)
زمان        : ۰µs   ۱۰۰µs (خطا فعال)   ۱۰۵µs
               |----------|-------------|
سیگنال PWM   : █████████████████████░░░░░░░░  
سیگنال خطا   : ______________█████____________  
خروجی پس از خطا: █████████████_______░░░░░░░░░

### ۶. مزایای Asymmetric PWM - کاهش نویز EMI: تغییرات ملایمتر در شیب سیگنال به دلیل تفاوت Duty Cycle در دو نیمه. - کنترل دقیقتر: امکان تنظیم پاسخ سیستم در حلقههای کنترلی با استفاده از دو پارامتر مستقل (Up/Down Duty). - انعطافپذیری بالا: تولید شکل موجهای غیرمتعارف برای کاربردهای خاص. --- ### ۷. مقایسه با PWM متقارن | ویژگی | Asymmetric PWM | PWM متقارن (معمولی) | |----------------------|---------------------------------|----------------------------| | Duty Cycle | متفاوت در Up/Down | یکسان در کل دوره | | پاسخ فرکانسی | سریعتر (به دلیل دو پارامتر) | کندتر | | پیچیدگی محاسباتی | بالاتر | پایین | | کاربردها | منابع تغذیه/موتورهای دقیق | کاربردهای عمومی PWM | --- ### ۸. نکات مهم - Dead Time: در صورت استفاده از پل-H، حتماً Dead Time اضافه کنید. - تغییر بلادرنگ پارامترها: مقادیر Compare را میتوان در حین کار تایمر بهروزرسانی کرد. - هماهنگی با ADC/DAC: از تریگر HRTIM برای نمونهبرداری در نقاط خاص شکل موج استفاده کنید.

پیادهسازی Asymmetric PWM با استفاده از HRTIM در STM32H743 Asymmetric PWM (پالس با مدولاسیون عرض پالس نامتقارن) نوعی از PWM است که در آن Duty Cycle در نیمههای مختلف دوره تناوب متفاوت است. این حالت برای کاربردهایی مانند کنترل دقیق موتورهای الکتریکی، منابع تغذیه سوییچینگ با پاسخگذاری سریع، یا تولید شکل موجهای پیچیده استفاده میشود. در زیر بهطور کامل با مثال و شبیهسازی شکل موج توضیح میدهیم: --- ### ۱. اصول Asymmetric PWM - تعریف: - در هر دوره تناوب، دو بخش Up-Counting (شمارش افزایشی) و Down-Counting (شمارش کاهشی) وجود دارد. - Duty Cycle در بخش Up و Down میتواند متفاوت باشد (مثلاً ۳۰٪ در Up و ۷۰٪ در Down). - مزایا: - کاهش نویز EMI به دلیل تغییرات ملایمتر در شیب سیگنال. - بهبود پاسخگذاری در سیستمهای کنترل حلقه بسته. --- ### ۲. پیکربندی HRTIM برای Asymmetric PWM برای تولید Asymmetric PWM با HRTIM مراحل زیر را دنبال کنید: #### گام ۱: تنظیم کلاک و پایهها - کلاک HRTIM را روی ۴.۶ GHz تنظیم کنید. - پین خروجی PWM را به یکی از تایمرها (مثلاً Timer A) وصل کنید. #### گام ۲: پیکربندی تایمر در حالت Dual Slope (شمارش Up/Down) - دوره تناوب (Period) را برای شمارش Up و Down تنظیم کنید. - دو مقدار Compare جداگانه برای بخشهای Up و Down تعیین کنید. #### گام ۳: فعالسازی خروجی PWM با تنظیمات نامتقارن --- ### ۳. مثال عملی: Asymmetric PWM با Duty Cycle متفاوت در Up/Down فرض کنید میخواهید یک PWM با فرکانس ۱ MHz تولید کنید که: - در بخش Up-Counting**، Duty Cycle = **۳۰٪. - در بخش Down-Counting**، Duty Cycle = **۷۰٪. #### پارامترهای محاسباتی - فرکانس PWM: ۱ MHz → دوره تناوب \( T_{PWM} = 1 \, \mu s \). - رزولوشن HRTIM: \( 184 \, ps \). - مقادیر Compare: - Up-Counting: \( 0.3 \times 460 = 138 \) (۳۰٪ از Period). - Down-Counting: \( 0.7 \times 460 = 322 \) (۷۰٪ از Period). #### کد نمونه (با استفاده از HAL Library)
// ۱. پیکربندی کلاک HRTIM (همانند مثال قبل)
// ...

// ۲. پیکربندی Timer A در حالت Dual Slope
HRTIM_TimeBaseInitTypeDef hrtim_config;
hrtim_config.CounterMode = HRTIM_COUNTERMODE_UPDOWN; // شمارش Up/Down
hrtim_config.Period = 460; // Period = 1 µs (460 + 1) / 4.6 GHz ≈ 100 ns × 10 = 1 µs
hrtim_config.RepetitionCounter = 0;
HAL_HRTIM_TimeBaseConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &hrtim_config);

// ۳. تنظیم Compare Units برای Up و Down
// Compare Unit 1: فعال در بخش Up-Counting (30% Duty)
HAL_HRTIM_WaveformCompareConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, 138);

// Compare Unit 2: فعال در بخش Down-Counting (70% Duty)
HAL_HRTIM_WaveformCompareConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_2, 322);

// ۴. تنظیم خروجی PWM برای واکنش به Compare Unit 1 و 2
HAL_HRTIM_WaveformOutputConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_POLARITY_HIGH, HRTIM_OUTPUT_IDLESTATE_INACTIVE);

// ۵. تنظیم حالت Asymmetric PWM
// در حالت Dual Slope، خروجی در Compare Unit 1 (Up) SET و در Compare Unit 2 (Down) RESET میشود
HAL_HRTIM_WaveformOutputSetConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, HRTIM_OUTPUTSET_ON_PERIOD);
HAL_HRTIM_WaveformOutputResetConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, HRTIM_OUTPUTRESET_ON_CMP2);

// ۶. شروع تایمر
HAL_HRTIM_WaveformCounterStart(&hhrtim, HRTIM_TIMERINDEX_TIMER_A);
--- ### ۴. شکل موج خروجی (شبیهسازی با متن)
زمان (µs)     : 0    0.3    0.7    1.0
               |------|------|------|
شمارش         : ▲ Up ▼ Down ▲ Up ▼ ...
مقدار کاونتر  : 0----138----460----322----0
خروجی PWM     : ███████░░░░░░█████████░░░░░
- بخش Up-Counting (۰ تا ۰.۵ µs): - خروجی در ۰ µs High میشود. - در ۰.۳ µs (مقدار Compare 1 = 138) خروجی Low میشود. - بخش Down-Counting (۰.۵ تا ۱ µs): - خروجی در ۰.۷ µs (مقدار Compare 2 = 322) دوباره High میشود. - در پایان دوره (۱ µs) خروجی Low میشود. --- ### ۵. توضیحات کلیدی کد - حالت Dual Slope: - تایمر از ۰ تا ۴۶۰ شمارش Up میکند، سپس از ۴۶۰ به ۰ شمارش Down میکند. - Compare Units: - Compare Unit 1 در بخش Up-Counting و Compare Unit 2 در بخش Down-Counting فعال میشوند. - تنظیمات خروجی: - خروجی در شروع دوره (Period) High شده، در Compare 1 Low میشود، سپس در Compare 2 دوباره High شده و در پایان دوره Low میشود. ---

### شکل موج خروجی (شبیهسازی با متن) فرض کنید: - فرکانس PWM: ۱ مگاهرتز (دوره تناوب ۱ µs). - شیفت فاز بین فازها: ۱۲۰ درجه (۰.۳۳۳ µs). - Duty Cycle: ۵۰٪ (هر پالس ۰.۵ µs روشن است).
زمان (µs)     : 0       0.333     0.666       1.0
               |---------|---------|---------|
خروجی Timer A  : ███████████████████░░░░░░░░░░░
خروجی Timer B  : ░░░░░░░░█████████████████░░░░░
خروجی Timer C  : ░░░░░░░░░░░░░░░░███████████████
--- ### توضیحات شکل موج: 1. Timer A (فاز اول): - پالس High از ۰ µs تا ۰.۵ µs و سپس Low تا ۱ µs. 2. Timer B (فاز دوم): - پالس High با تاخیر ۱۲۰ درجه (۰.۳۳۳ µs) شروع میشود: از ۰.۳۳۳ µs تا ۰.۸۳۳ µs. 3. Timer C (فاز سوم): - پالس High با تاخیر ۲۴۰ درجه (۰.۶۶۶ µs) شروع میشود: از ۰.۶۶۶ µs تا ۱.۱۶۶ µs (با توجه به دوره تناوب ۱ µs، این پالس در سیکل بعدی ادامه مییابد). --- ### نکات کلیدی: - کاهش ریپل جریان: - به دلیل توزیع یکنواخت پالسها در زمان، جریان متوسط در خازنها/سلفها هموارتر میشود. - همپوشانی پالسها: - در هر لحظه، حداقل یک پالس High فعال است که برای کاربردهای چندفاز (مثل منابع تغذیه) ایدهآل است. - Dead Time: - فاصلههای کوتاه بین پالسهای High و Low (در کد مثال ~۱.۸۴ نانوثانیه) برای جلوگیری از اتصال کوتاه در پل-H افزوده شده است. --- ### مشاهده شکل موج در عمل: برای مشاهده عملی شکل موج: 1. از یک اُسیلوسکوپ دیجیتال با پهنای باند بالا (حداقل ۱۰۰ مگاهرتز) استفاده کنید. 2. پینهای خروجی Timer A, B, C را به کانالهای اُسیلوسکوپ وصل کنید. 3. تنظیمات را روی Triggers Edge و زمان/دویژن ۲۰۰ ns قرار دهید.



// ۵. تنظیم خروجیهای PWM
// پیکربندی Duty Cycle (مثلاً 50%)
HAL_HRTIM_WaveformCompareConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, 230); // 50% از 460
HAL_HRTIM_WaveformCompareConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, HRTIM_COMPAREUNIT_1, 230);
HAL_HRTIM_WaveformCompareConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_C, HRTIM_COMPAREUNIT_1, 230);

// فعالسازی خروجیها
HAL_HRTIM_WaveformOutputConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_POLARITY_HIGH, HRTIM_OUTPUT_IDLESTATE_INACTIVE);
HAL_HRTIM_WaveformOutputConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, HRTIM_OUTPUT_POLARITY_HIGH, HRTIM_OUTPUT_IDLESTATE_INACTIVE);
HAL_HRTIM_WaveformOutputConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_C, HRTIM_OUTPUT_POLARITY_HIGH, HRTIM_OUTPUT_IDLESTATE_INACTIVE);

// ۶. افزودن Dead Time (برای جلوگیری از اتصال کوتاه)
HAL_HRTIM_DeadTimeConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, 10, 10); // 10 * 0.184 ns ≈ 1.84 ns
HAL_HRTIM_DeadTimeConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, 10, 10);
HAL_HRTIM_DeadTimeConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_C, 10, 10);
--- ### ۴. توضیحات کلیدی کد - تنظیم شیفت فاز: - تابع HAL_HRTIM_SetPhaseShift() شیفت فاز هر تایمر را بر حسب تعداد کلاکهای HRTIM تنظیم میکند. - مثال: برای شیفت فاز ۳۳.۳ نانوثانیه: \[ \text{مقدار شیفت فاز} = \frac{33.3 \, \text{ns}}{0.184 \, \text{ns}} \approx 181 \, \text{واحد}. \] - هماهنگی تایمرها: - Timer A بهعنوان تایمر اصلی شروع میشود و Timer B و C با تاخیر فاز مشخص شروع به کار میکنند. - از تریگرهای داخلی HRTIM برای همگامسازی خودکار استفاده میشود. - Dead Time: - برای جلوگیری از اتصال کوتاه در پل-H، زمان مرده (Dead Time) بین پالسهای High و Low اضافه میشود. --- ### ۵. نکات مهم - فرکانس PWM و شیفت فاز: - فرکانس واقعی PWM با توجه به تنظیمات Period و کلاک HRTIM محاسبه میشود. - برای تغییر فرکانس، مقدار Period را در تابع HAL_HRTIM_TimeBaseConfig() اصلاح کنید. - تعداد فازها: - مثال بالا برای ۳ فاز است. برای n فاز**، شیفت فاز هر تایمر باید \( \frac{T_{PWM}}{n} \) باشد. - **استفاده از وقفهها: - برای بهروزرسانی بلادرنگ پارامترها (مثل Duty Cycle) میتوانید از وقفههای HRTIM استفاده کنید. --- ### ۶. خروجی نهایی پس از اجرای کد، سه سیگنال PWM روی پینهای مرتبط با Timer A, B, C ظاهر میشود که: - فرکانس همه آنها ۱ MHz است. - هر سیگنال نسبت به قبلی ۱۲۰ درجه شیفت فاز دارد. - ریپل جریان ورودی/خروجی بهشدت کاهش مییابد. --- ### ۷. مقایسه با تایمرهای عمومی - تایمرهای عمومی (مثل TIM1): - ایجاد Interleaved PWM نیازمند کدنویسی پیچیده و استفاده از حالت Master-Slave است. - دقت شیفت فاز محدود به رزولوشن نانوثانیهای تایمر است. - HRTIM: - شیفت فاز با دقت زیر نانوثانیه قابل تنظیم است. - هماهنگی بین تایمرها بهصورت سختافزاری و بدون نیاز به وقفه انجام میشود.

پیادهسازی Interleaved PWM با استفاده از HRTIM در STM32H743 Interleaved PWM یک تکنیک پیشرفته در منابع تغذیه سوییچینگ و درایوهای موتور است که در آن چندین سیگنال PWM با اختلاف فاز مشخص نسبت به هم تولید میشوند. این روش باعث کاهش ریپل جریان ورودی/خروجی، افزایش راندمان، و کاهش نویز EMI میشود. در میکروکنترلر STM32H743، ماژول HRTIM بهطور سختافزاری از این قابلیت پشتیبانی میکند. در زیر بهصورت کامل با مثال توضیح میدهیم: --- ### ۱. اصول Interleaved PWM - هدف: - تولید n سیگنال PWM با فرکانس یکسان اما اختلاف فاز 360/n درجه بین آنها. - مثال: برای ۳ فاز، هر سیگنال ۱۲۰ درجه نسبت به قبلی شیفت فاز دارد. - مزایا: - کاهش ریپل جریان در خازنها و سلفها. - توزیع یکنواخت تلفات حرارتی بین سوئیچها. --- ### ۲. پیکربندی HRTIM برای Interleaved PWM برای پیادهسازی Interleaved PWM با HRTIM مراحل زیر را دنبال کنید: #### گام ۱: تنظیم کلاک و پایهها - کلاک HRTIM را روی ۴.۶ GHz (برای دقت بالا) تنظیم کنید. - پینهای خروجی PWM را به تایمرهای مورد نظر (مثلاً Timer A, B, C) وصل کنید. #### گام ۲: پیکربندی تایمرها - تایمر اصلی (Master Timer): - Timer A را بهعنوان تایمر اصلی تنظیم کنید. - دوره تناوب (Period) را برابر با فرکانس مورد نظر PWM تنظیم کنید. - تایمرهای فرعی (Slave Timers): - Timer B و Timer C را بهعنوان تایمرهای فرعی تنظیم کنید. - برای هر تایمر فرعی، شیفت فاز (Phase Shift) متناسب با تعداد فازها تعیین کنید. #### گام ۳: هماهنگی تایمرها - تایمرهای فرعی را با تایمر اصلی همزمان (Synchronize) کنید. - از تریگرهای داخلی برای ایجاد اختلاف فاز استفاده کنید. #### گام ۴: فعالسازی خروجیها - خروجیهای PWM هر تایمر را با پیکربندی مناسب (Duty Cycle، Dead Time، قطبیت) فعال کنید. --- ### ۳. مثال عملی: Interleaved PWM سه فاز با شیفت فاز ۱۲۰ درجه فرض کنید میخواهید ۳ سیگنال PWM با فرکانس ۱ MHz و شیفت فاز ۱۲۰ درجه تولید کنید. #### پارامترهای محاسباتی - فرکانس PWM: ۱ MHz → دوره تناوب \( T_{PWM} = 1 \, \mu s \). - شیفت فاز هر فاز: \( \Delta T = \frac{T_{PWM}}{3} = 0.333 \, \mu s \). - رزولوشن HRTIM: \( 184 \, ps \). #### کد نمونه (با استفاده از HAL Library)
// ۱. پیکربندی کلاک HRTIM (با فرض استفاده از PLL)
RCC_OscInitTypeDef RCC_OscInit = {0};
RCC_OscInit.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInit.HSIState = RCC_HSI_ON;
RCC_OscInit.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInit.PLL.PLLState = RCC_PLL_ON;
RCC_OscInit.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInit.PLL.PLLM = 4;    // تقسیمکننده HSI (16 MHz / 4 = 4 MHz)
RCC_OscInit.PLL.PLLN = 115;  // ضربکننده (4 MHz * 115 = 460 MHz)
RCC_OscInit.PLL.PLLP = 2;     // تقسیمکننده خروجی (460 MHz / 2 = 230 MHz)
RCC_OscInit.PLL.PLLQ = 2;
RCC_OscInit.PLL.PLLR = 2;
HAL_RCC_OscConfig(&RCC_OscInit);

// فعالسازی کلاک HRTIM
__HAL_RCC_HRTIM1_CLK_ENABLE();

// ۲. پیکربندی Timer A (Master)
HRTIM_TimeBaseInitTypeDef hrtim_master;
hrtim_master.CounterMode = HRTIM_COUNTERMODE_UP;
hrtim_master.Period = 460; // Period = (460 + 1) / 4.6 GHz ≈ 100 ns (فرکانس 10 MHz)
hrtim_master.RepetitionCounter = 0;
HAL_HRTIM_TimeBaseConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &hrtim_master);

// ۳. پیکربندی Timer B و C (Slave)
HRTIM_TimeBaseInitTypeDef hrtim_slave;
hrtim_slave.CounterMode = HRTIM_COUNTERMODE_UP;
hrtim_slave.Period = 460; // همان Period اصلی
hrtim_slave.RepetitionCounter = 0;

// تنظیم شیفت فاز برای Timer B (120 درجه = 33.3 ns)
HAL_HRTIM_SetPhaseShift(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, 153); // 33.3 ns / 0.184 ns ≈ 181
HAL_HRTIM_TimeBaseConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, &hrtim_slave);

// تنظیم شیفت فاز برای Timer C (240 درجه = 66.6 ns)
HAL_HRTIM_SetPhaseShift(&hhrtim, HRTIM_TIMERINDEX_TIMER_C, 362); // 66.6 ns / 0.184 ns ≈ 362
HAL_HRTIM_TimeBaseConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_C, &hrtim_slave);

// ۴. هماهنگی تایمرها
HAL_HRTIM_WaveformCounterStart_IT(&hhrtim, HRTIM_TIMERINDEX_TIMER_A); // شروع Timer A
HAL_HRTIM_TimerStart(&hhrtim, HRTIM_TIMERINDEX_TIMER_B); // شروع Timer B با تاخیر فاز
HAL_HRTIM_TimerStart(&hhrtim, HRTIM_TIMERINDEX_TIMER_C); // شروع Timer C با تاخیر فاز

HRTIM (High-Resolution Timer) در میکروکنترلرهای STM32H743 امکانات پیشرفتهای دارد که آن را از تایمرهای معمولی (مثل TIM1, TIM2, ...) متمایز میکند. در زیر به ویژگیهای منحصربهفرد HRTIM اشاره میکنم: --- ### ۱. رزولوشن زمانی فوقالعاده بالا (تا ۱۸۴ پیکوثانیه) - تایمرهای معمولی: رزولوشن نانوثانیه (مثلاً ۱۰ نانوثانیه با فرکانس ۱۰۰ مگاهرتز). - HRTIM: با استفاده از تکنیک چندفازی (Interleaved PWM)، رزولوشن تا ۱۸۴ پیکوثانیه میرسد. - مثال: تنظیم دقیق زمان افزایش/کاهش پالس (Rising/Falling Edge) با خطای کمتر از ۰.۲ نانوثانیه. --- ### ۲. حالت Interleaved PWM (پالسهای چندفازی) - امکان تولید چند سیگنال PWM با فازهای متفاوت (Shifted Phases) برای کاهش ریپل جریان در مبدلهای DC-DC. - مثال: در یک مبدل ۴-فاز، ۴ سیگنال PWM با اختلاف فاز ۹۰ درجه تولید میکند. - تایمرهای معمولی: نیاز به استفاده از چند تایمر و هماهنگسازی دستی دارند. --- ### ۳. قابلیت تولید پالسهای نامتقارن (Asymmetric PWM) - تنظیم مستقل زمان High و Low پالس (برخلاف PWM معمولی که Duty Cycle متقارن دارد). - مثال: در کنترل موتورهای سروو، پالسهای با عرض متفاوت برای موقعیتهای دقیق. - تایمرهای معمولی: فقط PWM متقارن (Edge-Aligned یا Center-Aligned) پشتیبانی میکنند. --- ### ۴. محافظت پیشرفته در برابر خطا (Fault Protection) - واکنش به خطاها (مثل اتصال کوتاه) در زمان کمتر از ۱۰۰ نانوثانیه. - پیکربندی چندلایه (Multiple Fault Sources) با اولویتبندی. - مثال: غیرفعال کردن خودکار خروجیهای PWM در صورت تشخیص خطا. - تایمرهای معمولی: محافظت خطا محدود و با تأخیر بیشتر. --- ### ۵. همگامسازی پیشرفته با سایر تایمرها (Synchronization) - همزمانسازی HRTIM با تایمرهای دیگر (مثلاً TIM1 یا TIM8) یا سیگنالهای خارجی. - مثال: تولید پالسهای همزمان برای کنترل موتورهای چندفاز. - تایمرهای معمولی: همگامسازی ساده و با محدودیت. --- ### ۶. حالت Burst Mode با قابلیتهای پیشرفته - تولید خودکار دستهپالسها با تعداد مشخص (تا ۶۵۵۳۵ پالس) و وقفه پس از اتمام. - پشتیبانی از تریگر نرمافزاری، سختافزاری یا Event-Driven. - مثال: حرکت استپر موتور با ۲۰۰ پالس دقیق بدون دخالت CPU. - تایمرهای معمولی: نیاز به استفاده از DMA یا وقفههای دستی. --- ### ۷. Dead-Time Insertion با دقت بالا - افزودن تأخیر (Dead-Time) بین پالسهای High و Low با دقت پیکوثانیه. - پیکربندی مستقل Dead-Time برای هر جفت کانال (مثلاً CH1 و CH1N). - مثال: جلوگیری از اتصال کوتاه در پل H-Bridge. - تایمرهای معمولی: Dead-Time با دقت نانوثانیه و محدودیت در تنظیمات. --- ### ۸. ADC Synchronization (همگامسازی با ADC) - تریگر خودکار ADC برای نمونهبرداری همزمان با لحظه خاصی از پالس PWM. - مثال: نمونهگیری از ولتاژ خروجی در لحظه قطع پالس برای کنترل حلقه فیدبک. - تایمرهای معمولی: نیاز به تنظیم دستی تریگر ADC. --- ### ۹. پشتیبانی از ۶ تایمر مستقل (Timer A تا Timer F) - هر تایمر میتواند بهصورت مستقل یا هماهنگ با دیگران کار کند. - مثال: کنترل ۶ موتور مجزا یا تولید ۶ سیگنال PWM با فرکانسهای متفاوت. - تایمرهای معمولی: هر تایمر بهصورت جداگانه پیکربندی میشود. --- ### ۱۰. Master Timer Control (کنترل تایمر اصلی) - تایمر Master (مثلاً Timer A) میتواند سایر تایمرها (Timer B-F) را هماهنگ کند. - مثال: تولید پالسهای PWM با فازهای تنظیمشده توسط یک تایمر اصلی. --- ### ۱۱. قابلیت تنظیم فرکانس دینامیکی (Dynamic Frequency Scaling) - تغییر فرکانس PWM در حین کار (بدون توقف تایمر). - مثال: تطبیق فرکانس سوئیچینگ در مبدلهای DC-DC بر اساس بار. - تایمرهای معمولی: نیاز به توقف و راهاندازی مجدد تایمر. --- ### ۱۲. پشتیبانی از Event Linking (اتصال رویدادها) - اتصال رویدادهای HRTIM به سایر ماژولها (مثل DAC، DMA یا تایمرهای دیگر) بدون نیاز به CPU. - مثال: شروع یک تبدیل DAC بهمحض اتمام پالس PWM. --- ### جمعبندی: چرا HRTIM منحصربهفرد است؟ - دقت بیسابقه: رزولوشن پیکوثانیه برای کاربردهای حساس به زمان. - انعطافپذیری: پیکربندی مستقل ۱۲ کانال خروجی و ۶ تایمر. - امنیت: پاسخگویی فوق سریع به خطاها (Fault Protection). - پیچیدگی: تولید موجهای PWM چندفازی، نامتقارن و Burst Mode. ---

واحد HRTIM (High-Resolution Timer) در میکروکنترلرهای STM32H743 یکی از پیشرفتهترین ماژولهای زمانبندی در خانواده STM32 است که برای کاربردهای دقیق, پُرسرعت, و پیچیده طراحی شده است. در زیر بهصورت کامل و جزئیات محور به تمامی ویژگیها، معماری، و قابلیتهای این تایمر میپردازیم: --- ### ۱. معماری کلی HRTIM - ماژول اصلی: - HRTIM از یک تایمر اصلی ۱۶ بیتی با قابلیت گسترش به ۳۲ بیت (با استفاده از مکانیزم چسباندن دو تایمر) تشکیل شده است. - ۶ تایمر مستقل به نامهای Timer A, B, C, D, E, F که هر کدام قابلیت پیکربندی بهصورت مستقل یا هماهنگ با دیگر تایمرها را دارند. - ۱۲ خروجی مقایسه (Compare Outputs) (دو خروجی برای هر تایمر) که میتوانند سیگنالهای PWM یا پالسهای دقیق تولید کنند. - کلاک پایه: - کلاک HRTIM از طریق ضربکنندههای داخلی (Multiplier) و پیشتقسیمکنندهها (Prescaler) به فرکانسهای بسیار بالا (تا ۴.۶ GHz) میرسد. - منابع کلاک: - HSI (High-Speed Internal Oscillator). - HSE (High-Speed External Oscillator). - PLL (با تنظیمات خاص برای HRTIM). --- ### ۲. رزولوشن زمانی فوق العاده (Ultra-High Resolution) - حداکثر رزولوشن: - ۱۸۴ پیکوثانیه (۰.۱۸۴ نانوثانیه) با استفاده از کلاک ۴.۶ GHz. - این دقت با تقسیم کلاک سیستم (مثلاً ۴۶۰۰ MHz) به دست میآید: \[ \text{رزولوشن} = \frac{1}{4600 \times 10^6} \approx 0.217 \, \text{ns} \, (\text{با احتساب تنظیمات دقیقتر تا ۱۸۴ پیکوثانیه}). \] - مقایسه با تایمرهای عمومی: - تایمرهای معمولی STM32H743 (مثل TIM1) با کلاک ۱۶۰ MHz رزولوشنی حدود ۶.۲۵ نانوثانیه دارند. - HRTIM ~۳۴ برابر دقیقتر است! --- ### ۳. تایمرهای مستقل و هماهنگشونده - ۶ تایمر مستقل (Timer A-F): - هر تایمر شامل: - کاونتر ۱۶ بیتی با قابلیت شمارش Up/Down/Center-Aligned. - ۴ رجیستر مقایسه (Compare Register) برای تنظیم Duty Cycle یا زمان وقوع رویدادها. - ۲ خروجی PWM با قطبیت و حالتهای مختلف (Active High/Low, Push-Pull, Open-Drain). - هماهنگی بین تایمرها: - امکان همزمانسازی (Synchronization) بین تایمرها از طریق: - تریگرهای داخلی (مثلاً شروع همزمان Timer A و Timer B). - رویدادهای خارجی (مثل سیگنالهای ورودی از GPIO یا ماژولهای دیگر). - قابلیت ایجاد زنجیره رویدادها (Event Chaining) برای کنترل دنبالهای عملیات. --- ### ۴. حالتهای پیشرفته PWM - انواع PWM: 1. Edge-Aligned PWM: پالسهای معمولی با لبههای همتراز. 2. Center-Aligned PWM: پالسهای متقارن حول مرکز دوره تناوب (کاهش نویز EMI). 3. Dual Slope PWM: شمارش Up و Down برای ایجاد شیبهای دوگانه (مناسب برای کنترل موتور). 4. Phase-Shifted PWM: ایجاد اختلاف فاز بین خروجیهای تایمرها (برای منابع تغذیه چندفاز). - ویژگیهای خاص: - Dead-Time Insertion: افزودن زمان مرده (Dead Time) بین پالسهای High و Low برای جلوگیری از اتصال کوتاه در درایورهای پل-H. - Burst Mode: تولید بستههای پالس (Burst) با تعداد و فرکانس قابل تنظیم برای کاهش مصرف انرژی. - Dithering: بهبود رزولوشن مؤثر Duty Cycle با افزودن نویز کنترلشده. --- ### ۵. سیستم محافظت در برابر خطا (Fault Protection) - ورودیهای خطا (Fault Inputs): - HRTIM از ۴ ورودی خطا (Fault 1-4) پشتیبانی میکند که میتوانند از منابع زیر دریافت شوند: - پینهای GPIO (برای تشخیص اتصال کوتاه یا اضافهبار). - کمپراتورهای آنالوگ داخلی (مثلاً تشخیص اضافهولتاژ). - سیگنالهای نرم افزاری. - واکنش به خطا: - قطع فوری (Fast Kill): غیرفعال کردن خروجیها در کمتر از ۱۰۰ نانوثانیه. - قطع نرم (Software Kill): غیرفعال کردن خروجیها پس از اتمام دوره PWM جاری. - پیکربندی سلسلهمراتبی: تعیین اولویت بین خطاهای مختلف. --- ### ۶. ادغام با ماژولهای دیگر - ADC/DAC: - HRTIM میتواند تریگر نمونهبرداری ADC/DAC را در لحظات دقیقی از شکل موج PWM تولید کند (مثلاً در نقطه میانی پالس). - امکان هماهنگی با حلقههای فیدبک آنالوگ برای تنظیم بلادرنگ پارامترها. - DMA: - انتقال دادههای حجیم (مثلاً جدول Lookup برای Duty Cycleهای متغیر) بدون نیاز به وقفههای CPU. - کمپراتورهای آنالوگ: - مقایسه سیگنالهای آنالوگ با سطح آستانه و ایجاد واکنش خودکار (مثلاً قطع PWM در صورت اضافهولتاژ). --- ### ۷. حالتهای کار خاص - Burst Mode: - تولید پالسهای گروهی (Burst) با تعداد و فرکانس قابل تنظیم. - مثال: تولید ۱۰ پالس با فرکانس ۱۰۰ MHz، سپس توقف تا دریافت تریگر بعدی.

- Time-Event Chaining: - ایجاد زنجیرهای از رویدادها بین تایمرها. - مثال: پس از پایان Timer A، Timer B بهطور خودکار شروع شود. - One-Shot Mode: - تولید یک پالس یا مجموعه پالسها با پارامترهای ازپیشتعیینشده. --- ### ۸. رجیسترها و تنظیمات پیشرفته - رجیسترهای کلیدی: - HRTIM_TIMxCR (Control Registers): کنترل وضعیت هر تایمر. - HRTIM_TIMxCMP1-4 (Compare Registers): تنظیم مقادیر مقایسه برای Duty Cycle. - HRTIM_CR (Common Register): تنظیمات کلی مانند فعالسازی کلاک. - HRTIM_FLTINxCR (Fault Input Control Registers): پیکربندی واکنش به خطاها. - پیکربندی گامبهگام: 1. فعالسازی کلاک HRTIM در RCC. 2. تنظیم پینهای خروجی/ورودی با GPIO_AF مناسب. 3. تنظیم فرکانس پایه HRTIM از طریق PLL و Prescaler. 4. پیکربندی تایمرها (نوع PWM, Dead Time, هماهنگی). 5. فعالسازی محافظت خطا و وقفهها. 6. راهاندازی تایمر با HAL_HRTIM_Init(). --- ### ۹. محدودیتها و ملاحظات - مصرف توان: - استفاده از فرکانسهای بسیار بالا (مثلاً ۴.۶ GHz) ممکن است مصرف توان را افزایش دهد. - پیچیدگی برنامهنویسی: - تنظیم HRTIM نیازمند تسلط بر رجیسترهای پیچیده و معماری خاص آن است. - وابستگی به کلاک: - برای دستیابی به حداکثر دقت، کلاک سیستم باید دقیقاً پیکربندی شود (اغلب از PLL با تنظیمات خاص). --- ### ۱۰. مثال کاربردی: تولید PWM با فرکانس ۱۰۰ MHz
// پیکربندی کلاک HRTIM به 4.6 GHz (با استفاده از PLL)
RCC_PLLConfig(RCC_PLLSource_HSI, ...); // تنظیمات PLL خاص HRTIM
RCC_HRTIMCLKConfig(RCC_HRTIM1CLK_PLL); // انتخاب منبع کلاک

// پیکربندی تایمر A برای PWM
HRTIM_TimeBaseInitTypeDef hrtim_timerA;
hrtim_timerA.CounterMode = HRTIM_COUNTERMODE_UP; // شمارش افزایشی
hrtim_timerA.Period = 46; // Period = (46 + 1) / 4.6 GHz ≈ 10 ns (فرکانس 100 MHz)
hrtim_timerA.RepetitionCounter = 0;
HAL_HRTIM_TimeBaseConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &hrtim_timerA);

// تنظیم Duty Cycle به 50% (مقدار مقایسه = 23)
HAL_HRTIM_WaveformCompareConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, 23);

// فعالسازی خروجی PWM
HAL_HRTIM_WaveformOutputConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_POLARITY_HIGH, HRTIM_OUTPUT_IDLESTATE_INACTIVE);

// شروع تایمر
HAL_HRTIM_WaveformCounterStart(&hhrtim, HRTIM_TIMERINDEX_TIMER_A);
--- ### ۱۱. مقایسه با تایمرهای عمومی (مثل TIM1) | ویژگی | HRTIM | تایمرهای عمومی (TIMx) | |---------------------------|--------------------------------|-----------------------------| | رزولوشن زمانی | ۱۸۴ پیکوثانیه | ~۶ نانوثانیه (با ۱۶۰ MHz) | | حداکثر فرکانس PWM | تا ۲۳۰ MHz | تا ~۸۰ MHz | | تعداد تایمرهای مستقل | ۶ | ۱ (به ازای هر TIMx) | | سیستم محافظت خطا | ۴ ورودی با قطع سریع | ۱-۲ ورودی ساده | | هماهنگی با ADC/DAC | تریگر دقیق در هر نقطه از PWM | تریگرهای محدود | | حالتهای PWM | چندحالته (Dual Slope, Burst) | Edge/Center-Aligned | --- ### ۱۲. منابع یادگیری - مرجع اصلی: - RM0433 Reference Manual (فصل ۲۸: High-Resolution Timer). - نرمافزارهای کمکی: - STM32CubeMX: برای پیکربندی بصری HRTIM. - STM32CubeH7 HAL Library: کتابخانههای ازپیشتعریفشده برای HRTIM. --- اگر نیاز به توضیح بیشتری درباره هر بخش دارید یا میخواهید مثالهای پیچیدهتری بررسی شود، خوشحال میشوم کمک کنم! 😊

واحد HRTIM (High-Resolution Timer) در میکروکنترلرهای STM32H743 یکی از پیشرفتهترین ماژولهای زمانبندی در خانواده STM32 است که برای کاربردهای دقیق, پُرسرعت, و پیچیده طراحی شده است. در زیر بهصورت کامل و جزئیات محور به تمامی ویژگیها، معماری، و قابلیتهای این تایمر میپردازیم: --- ### ۱. معماری کلی HRTIM - ماژول اصلی: - HRTIM از یک تایمر اصلی ۱۶ بیتی با قابلیت گسترش به ۳۲ بیت (با استفاده از مکانیزم چسباندن دو تایمر) تشکیل شده است. - ۶ تایمر مستقل به نامهای Timer A, B, C, D, E, F که هر کدام قابلیت پیکربندی بهصورت مستقل یا هماهنگ با دیگر تایمرها را دارند. - ۱۲ خروجی مقایسه (Compare Outputs) (دو خروجی برای هر تایمر) که میتوانند سیگنالهای PWM یا پالسهای دقیق تولید کنند. - کلاک پایه: - کلاک HRTIM از طریق ضربکنندههای داخلی (Multiplier) و پیشتقسیمکنندهها (Prescaler) به فرکانسهای بسیار بالا (تا ۴.۶ GHz) میرسد. - منابع کلاک: - HSI (High-Speed Internal Oscillator). - HSE (High-Speed External Oscillator). - PLL (با تنظیمات خاص برای HRTIM). --- ### ۲. رزولوشن زمانی فوق العاده (Ultra-High Resolution) - حداکثر رزولوشن: - ۱۸۴ پیکوثانیه (۰.۱۸۴ نانوثانیه) با استفاده از کلاک ۴.۶ GHz. - این دقت با تقسیم کلاک سیستم (مثلاً ۴۶۰۰ MHz) به دست میآید: \[ \text{رزولوشن} = \frac{1}{4600 \times 10^6} \approx 0.217 \, \text{ns} \, (\text{با احتساب تنظیمات دقیقتر تا ۱۸۴ پیکوثانیه}). \] - مقایسه با تایمرهای عمومی: - تایمرهای معمولی STM32H743 (مثل TIM1) با کلاک ۱۶۰ MHz رزولوشنی حدود ۶.۲۵ نانوثانیه دارند. - HRTIM ~۳۴ برابر دقیقتر است! --- ### ۳. تایمرهای مستقل و هماهنگشونده - ۶ تایمر مستقل (Timer A-F): - هر تایمر شامل: - کاونتر ۱۶ بیتی با قابلیت شمارش Up/Down/Center-Aligned. - ۴ رجیستر مقایسه (Compare Register) برای تنظیم Duty Cycle یا زمان وقوع رویدادها. - ۲ خروجی PWM با قطبیت و حالتهای مختلف (Active High/Low, Push-Pull, Open-Drain). - هماهنگی بین تایمرها: - امکان همزمانسازی (Synchronization) بین تایمرها از طریق: - تریگرهای داخلی (مثلاً شروع همزمان Timer A و Timer B). - رویدادهای خارجی (مثل سیگنالهای ورودی از GPIO یا ماژولهای دیگر). - قابلیت ایجاد زنجیره رویدادها (Event Chaining) برای کنترل دنبالهای عملیات. --- ### ۴. حالتهای پیشرفته PWM - انواع PWM: 1. Edge-Aligned PWM: پالسهای معمولی با لبههای همتراز. 2. Center-Aligned PWM: پالسهای متقارن حول مرکز دوره تناوب (کاهش نویز EMI). 3. Dual Slope PWM: شمارش Up و Down برای ایجاد شیبهای دوگانه (مناسب برای کنترل موتور). 4. Phase-Shifted PWM: ایجاد اختلاف فاز بین خروجیهای تایمرها (برای منابع تغذیه چندفاز). - ویژگیهای خاص: - Dead-Time Insertion: افزودن زمان مرده (Dead Time) بین پالسهای High و Low برای جلوگیری از اتصال کوتاه در درایورهای پل-H. - Burst Mode: تولید بستههای پالس (Burst) با تعداد و فرکانس قابل تنظیم برای کاهش مصرف انرژی. - Dithering: بهبود رزولوشن مؤثر Duty Cycle با افزودن نویز کنترلشده. --- ### ۵. سیستم محافظت در برابر خطا (Fault Protection) - ورودیهای خطا (Fault Inputs): - HRTIM از ۴ ورودی خطا (Fault 1-4) پشتیبانی میکند که میتوانند از منابع زیر دریافت شوند: - پینهای GPIO (برای تشخیص اتصال کوتاه یا اضافهبار). - کمپراتورهای آنالوگ داخلی (مثلاً تشخیص اضافهولتاژ). - سیگنالهای نرم افزاری. - واکنش به خطا: - قطع فوری (Fast Kill): غیرفعال کردن خروجیها در کمتر از ۱۰۰ نانوثانیه. - قطع نرم (Software Kill): غیرفعال کردن خروجیها پس از اتمام دوره PWM جاری. - پیکربندی سلسلهمراتبی: تعیین اولویت بین خطاهای مختلف. --- ### ۶. ادغام با ماژولهای دیگر - ADC/DAC: - HRTIM میتواند تریگر نمونهبرداری ADC/DAC را در لحظات دقیقی از شکل موج PWM تولید کند (مثلاً در نقطه میانی پالس). - امکان هماهنگی با حلقههای فیدبک آنالوگ برای تنظیم بلادرنگ پارامترها. - DMA: - انتقال دادههای حجیم (مثلاً جدول Lookup برای Duty Cycleهای متغیر) بدون نیاز به وقفههای CPU. - کمپراتورهای آنالوگ: - مقایسه سیگنالهای آنالوگ با سطح آستانه و ایجاد واکنش خودکار (مثلاً قطع PWM در صورت اضافهولتاژ). --- ### ۷. حالتهای کار خاص - Burst Mode: - تولید پالسهای گروهی (Burst) با تعداد و فرکانس قابل تنظیم. - مثال: تولید ۱۰ پالس با فرکانس ۱۰۰ MHz، سپس توقف تا دریافت تریگر بعدی.

واحد HRTimer (High-Resolution Timer) در میکروکنترلرهای STM32H743، بهطور خاص ماژول HRTIM (High-Resolution Timer)، یک تایمر پیشرفته با دقت زمانی بسیار بالا است که برای کاربردهای نیازمند کنترل دقیق زمانبندی (مثل منابع تغذیه سوییچینگ، درایو موتور، سیستمهای روشنایی، و PWM با فرکانس/دقت بالا) طراحی شده است. در زیر بهصورت اجمالی به ویژگیها و کاربردهای آن اشاره میکنیم: --- ### ویژگیهای کلیدی HRTIM در STM32H743: 1. رزولوشن زمانی فوق العاده بالا: - پشتیبانی از رزولیشن ~184 ps (پیکوثانیه) با استفاده از کلاک اصلی 4.6 GHz (از طریق پیشتقسیمکننده و ضربکنندههای داخلی). - این دقت بسیار بالاتر از تایمرهای عمومی (مثل TIM1 تا TIM17) است. 2. تایمرهای چندگانه و مستقل: - شامل ۶ تایمر مستقل (Timer A تا Timer F) که هر کدام میتوانند برای تولید سیگنالهای PWM، مدیریت وقفهها، یا همگامسازی با رویدادهای خارجی پیکربندی شوند. 3. قابلیتهای پیشرفته PWM: - تولید پالسهای PWM با فرکانس بالا (تا صدها مگاهرتز) و کنترل دقیق Duty Cycle. - پشتیبانی از حالتهای مختلف PWM مانند: - Edge-Aligned - Center-Aligned - ترکیب چند تایمر برای تولید شکل موجهای پیچیده. 4. همزمانسازی هوشمند: - امکان همزمانسازی خودکار تایمرها با یکدیگر یا با رویدادهای خارجی (مثل تریگر ADC یا DAC). 5. محافظت در برابر خطا (Fault Protection): - قابلیت قطع سریع خروجیها در شرایط خطا (مثل اتصال کوتاه) برای افزایش ایمنی سیستم. 6. ادغام با سایر ماژولها: - ارتباط با ADC، DAC، و DMA برای نمونهبرداری خودکار یا پردازش دادهها. --- ### کاربردهای معمول HRTIM: - کنترل منابع تغذیه سوییچینگ (SMPS) با فرکانس بالا. - درایو موتورهای BLDC/PMSM با کنترل دقیق موقعیت و سرعت. - سیستمهای روشنایی LED با تنظیم پویای شدت نور (مثلاً در پروژکتورهای صنعتی). - تولید سیگنالهای مرجع با نویز پایین برای کاربردهای مخابراتی. --- ### پیکربندی پایه HRTIM: برای استفاده از HRTIM در STM32H743: 1. فعالسازی کلاک HRTIM از طریق RCC. 2. پیکربندی پینهای خروجی/ورودی مرتبط با تایمر (مثلاً از طریق GPIO_AF). 3. تنظیم پارامترهای تایمر (فرکانس، Duty Cycle، حالت PWM، و غیره) با استفاده از رجیسترهای HRTIM. 4. فعالسازی وقفهها یا DMA در صورت نیاز. 5. راهاندازی تایمر. --- ### مثال کد (با استفاده از HAL Library):
// پیکربندی پایه برای HRTIM
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_HRTIM1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// پیکربندی HRTIM
HRTIM_HandleTypeDef hhrtim;
hhrtim.Instance = HRTIM1;
hhrtim.Init.HRTIMClock = 4600000000; // 4.6 GHz (با استفاده از PLL)
HAL_HRTIM_Init(&hhrtim);

// تنظیم تایمر A برای PWM
HAL_HRTIM_WaveformOutputConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_POLARITY_HIGH, HRTIM_OUTPUT_IDLESTATE_INACTIVE);
HAL_HRTIM_WaveformCounterStart(&hhrtim, HRTIM_TIMERINDEX_TIMER_A);
--- ### نکات مهم: - برای دستیابی به حداکثر دقت، کلاک سیستم (مثلاً از طریق PLL) باید بهدرستی پیکربندی شود.

در سلسله پستهای اینده به بررسی واحد HRTIMER در میکروکنترولر stm32h743iit6 میپردازیم💫

// فعال‌سازی وقفه TXE و RXNE __HAL_SPI_ENABLE_IT(&hspi1, SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR); HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(SPI1_IRQn); // ارسال داده uint8_t tx_data[] = {0xAA, 0xBB, 0xCC}; HAL_SPI_Transmit_IT(&hspi1, tx_data, 3); } // هندلر SPI void SPI1_IRQHandler(void) { HAL_SPI_IRQHandler(&hspi1); } // Callback ارسال موفق void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) { // ارسال بعدی یا خاموش کردن SPI } // Callback خطا void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) { // مدیریت خطاها (OVR, MODF, CRCERR, ...) } ` --- با استفاده از این وقفه‌ها می‌توانید ارتباطات SPI را بهینه و خطاها را به صورت بلادرنگ مدیریت کنید. برای جزئیات بیشتر به Reference Manual خانواده خاص STM32 خود مراجعه کنید (مثلاً RM0008 برای STM32F1xx).

در میکروکنترلرهای STM32، رابط SPI (Serial Peripheral Interface) از چندین وقفه (Interrupt) پشتیبانی می‌کند که برای مدیریت ارتباطات غیرهمزمان (Asynchronous) و خطاها استفاده می‌شوند. در زیر همه وقفه‌های SPI در STM32 به همراه توضیحات و مثال کد آورده شده است: --- ### ۱. وقفه TXE (Transmit Buffer Empty) - علت وقفه: هنگامی رخ می‌دهد که بافر انتقال (TX Buffer) خالی باشد و آماده دریافت داده جدید باشد. - کاربرد: برای ارسال داده‌ها به صورت غیرهمزمان. - مثال کد (با HAL Library):
  // فعال‌سازی وقفه TXE
  __HAL_SPI_ENABLE_IT(&hspi1, SPI_IT_TXE);

  // هندلر وقفه TXE (در فایل stm32XXxx_it.c)
  void SPI1_IRQHandler(void) {
    HAL_SPI_IRQHandler(&hspi1);
  }

  // تابع Callback ارسال
  void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) {
    // داده بعدی را ارسال کنید یا پرچم‌ها را مدیریت کنید
  }
  
--- ### ۲. وقفه RXNE (Receive Buffer Not Empty) - علت وقفه: هنگامی رخ می‌دهد که بافر دریافت (RX Buffer) حاوی داده جدید باشد. - کاربرد: برای خواندن داده‌های دریافتی به صورت غیرهمزمان. - مثال کد (با HAL):
  // فعال‌سازی وقفه RXNE
  __HAL_SPI_ENABLE_IT(&hspi1, SPI_IT_RXNE);

  // هندلر وقفه RXNE
  void SPI1_IRQHandler(void) {
    HAL_SPI_IRQHandler(&hspi1);
  }

  // تابع Callback دریافت
  void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) {
    // داده دریافتی را پردازش کنید
  }
  
--- ### ۳. وقفه خطای Overrun (OVR) - علت وقفه: زمانی رخ می‌دهد که داده جدیدی قبل از خواندن داده قبلی از بافر دریافت (RX Buffer) وارد شود. - مثال کد:
  // فعال‌سازی وقفه خطای Overrun
  __HAL_SPI_ENABLE_IT(&hspi1, SPI_IT_ERR);

  // هندلر خطاها
  void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) {
    if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_OVR)) {
      // رفع خطای Overrun با خواندن داده‌ها
      uint16_t temp = hspi->Instance->DR; // خواندن DR برای پاک کردن پرچم
      temp = hspi->Instance->SR;          // خواندن SR برای پاک کردن پرچم
    }
  }
  
--- ### ۴. وقفه خطای Mode Fault (MODF) - علت وقفه: هنگامی رخ می‌دهد که پین NSS (Slave Select) در حالت Master به صورت ناخواسته تغییر کند. - مثال کد:
  // هندلر خطای MODF
  void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) {
    if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_MODF)) {
      // رفع خطا: غیرفعال و دوباره فعال کردن SPI
      __HAL_SPI_DISABLE(hspi);
      __HAL_SPI_ENABLE(hspi);
    }
  }
  
--- ### ۵. وقفه خطای CRC (CRCERR) - علت وقفه: اگر CRC ارسالی با CRC دریافتی مطابقت نداشته باشد (در حالت CRC-enabled). - مثال کد:
  // فعال‌سازی محاسبه CRC
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_ENABLE;
  HAL_SPI_Init(&hspi1);

  // هندلر خطای CRC
  void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) {
    if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) {
      // مدیریت خطای CRC
    }
  }
  
--- ### ۶. وقفه Frame Error (FRE) - علت وقفه: اگر فرمت فریم (مثلاً طول داده) در حالت TI (Motorola) یا پروتکل دیگر نامعتبر باشد. - مثال کد:
  void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) {
    if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_FRE)) {
      // مدیریت خطای فرمت فریم
    }
  }
  
--- ### نکات مهم: 1. فعال‌سازی وقفه‌ها: - وقفه‌ها را در ثبات CR2 SPI فعال کنید (مثلاً SPI_IT_TXE, SPI_IT_RXNE, یا SPI_IT_ERR). - اولویت وقفه‌ها را در NVIC تنظیم کنید. 2. پاک کردن پرچم‌ها: - برخی پرچم‌ها (مانند OVR) نیاز به خواندن DR و SR دارند. - در HAL، پرچم‌ها به صورت خودکار پاک می‌شوند. 3. استفاده از HAL: - توابع HAL_SPI_Transmit_IT() و HAL_SPI_Receive_IT() برای مدیریت ساده‌تر وقفه‌ها. --- ### مثال کامل (SPI Master با وقفه): `c SPI_HandleTypeDef hspi1; void main() { // پیکربندی SPI (Master, 1 MHz, Mode 0) hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; HAL_SPI_Init(&hspi1);