برق و الکترونیک *دانلود پروژه رایگان
2.28K subscribers
784 photos
96 videos
350 files
641 links
بسمه تعالی
دانلود پروژه و پی سی بی رایگان
Download Telegram
برق و الکترونیک *دانلود پروژه رایگان
https://developer.flythings.cn/zh-hans/download.html
این نرم افزار را از اینجا میتونید دانلود کنید به علاوه خیلی فایلهای مربوطه
در رابط I2C میکروکنترلرهای STM32، وقفه‌های متعددی وجود دارد که برای مدیریت ارتباطات، تشخیص رویدادها و خطاها استفاده می‌شوند. در ادامه، مهم‌ترین وقفه‌های I2C و عملکرد هر کدام را به زبان ساده توضیح می‌دهم:

---

### ۱. وقفه ADDR (Address Match)
- کاربرد: زمانی فعال می‌شود که آدرس ارسالی توسط Master با آدرس Slave (میکروکنترلر) مطابقت داشته باشد.
- مثال:

  void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode) {
// TransferDirection: جهت انتقال (ارسال یا دریافت)
}

- نکات:
- برای حالت Slave استفاده می‌شود.
- می‌تواند جهت انتقال داده (I2C_DIRECTION_TRANSMIT یا I2C_DIRECTION_RECEIVE) را مشخص کند.

---

### ۲. وقفه RxNE (Receive Data Register Not Empty)
- کاربرد: زمانی فعال می‌شود که داده‌ای در ثبات دریافت (RXDR) موجود باشد.
- مثال:

  void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) {
// پردازش داده دریافتی
}

- نکات:
- در حالت Slave یا Master (دریافت) استفاده می‌شود.
- معمولاً با DMA ترکیب می‌شود تا داده مستقیماً به حافظه منتقل شود.

---

### ۳. وقفه TxE (Transmit Data Register Empty)
- کاربرد: زمانی فعال می‌شود که ثبات انتقال (TXDR) خالی باشد و آماده دریافت داده جدید.
- مثال:

  void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c) {
// آماده‌سازی داده بعدی برای ارسال
}

- نکات:
- در حالت Slave یا Master (ارسال) استفاده می‌شود.
- اگر داده جدیدی در ثبات TXDR نوشته نشود، خطای Underrun رخ می‌دهد.

---

### ۴. وقفه BTF (Byte Transfer Finished)
- کاربرد: زمانی فعال می‌شود که انتقال یک بایت کامل انجام شده باشد.
- مثال:

  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF)) {
__HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BTF);
// انجام عملیات پس از انتقال بایت
}

- نکات:
- برای همگام‌سازی دقیق انتقال داده مفید است.
- معمولاً در ارتباطات بدون DMA استفاده می‌شود.

---

### ۵. وقفه STOPF (Stop Condition Detected)
- کاربرد: زمانی فعال می‌شود که یک شرط توقف (STOP) روی باس I2C تشخیص داده شود.
- مثال:

  void I2C1_EV_IRQHandler(void) {
if (__HAL_I2C_GET_FLAG(&hi2c1, I2C_FLAG_STOPF)) {
__HAL_I2C_CLEAR_FLAG(&hi2c1, I2C_FLAG_STOPF);
// پایان انتقال داده
}
}

- نکات:
- برای تشخیص پایان انتقال توسط Master استفاده می‌شود.
- در پروتکل I2C، Master با ارسال STOP به انتقال پایان می‌دهد.

---

### ۶. وقفه NACK (Not Acknowledge)
- کاربرد: زمانی فعال می‌شود که دستگاه مقصد (Slave یا Master) داده را تأیید نکرده باشد (NACK ارسال کند).
- مثال:

  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF)) {
__HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
// مدیریت خطای NACK
}

- نکات:
- فلگ این خطا به نام AF (Acknowledge Failure) نیز شناخته می‌شود.
- معمولاً نشاندهنده خطای اتصال یا آدرس نامعتبر است.

---

### ۷. وقفه BERR (Bus Error)
- کاربرد: زمانی فعال می‌شود که یک خطای باس (مانند سیگنال ناخواسته روی SDA/SCL) تشخیص داده شود.
- مثال:

  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BERR)) {
__HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR);
// مدیریت خطای باس
}

---

### ۸. وقفه ARLO (Arbitration Lost)
- کاربرد: زمانی فعال می‌شود که میکروکنترلر در آربیتراسیون باس شکست بخورد (دو Master همزمان بخواهند داده ارسال کنند).
- مثال:

  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ARLO)) {
__HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO);
// مدیریت خطای آربیتراسیون
}

---

### ۹. وقفه OVR (Overrun/Underrun)
- کاربرد:
- Overrun: داده جدید دریافت شده، قبل از خواندن داده قبلی (دریافت).
- Underrun: داده جدیدی برای ارسال نوشته نشده، در حالی که باس منتظر است (ارسال).
- مثال:

  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_OVR)) {
__HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR);
// مدیریت خطای Overrun/Underrun
}

---
### ۱۰. وقفه TIMEOUT (Timeout)
- کاربرد: زمانی فعال می‌شود که زمان انتظار برای یک رویداد (مثل دریافت داده) بیش از حد مجاز طول بکشد.
- پیکربندی:

  HAL_I2C_EnableListen_IT(&hi2c1); // فعال‌سازی Timeout

---

### جمع‌بندی:
- ترتیب اولویت وقفه‌ها:
خطاها (مثل BERR، ARLO، AF) > وقفه‌های معمولی (مثل ADDR، STOPF، RxNE، TxE).
- فعال‌سازی وقفه‌ها:
با استفاده از توابع __HAL_I2C_ENABLE_IT() یا HAL_I2C_Enable_IT().
- پاک کردن فلگ وقفه:
همیشه پس از پردازش وقفه، فلگ مربوطه را با __HAL_I2C_CLEAR_FLAG() پاک کنید.

---

### مثال کاربردی (ترکیب چند وقفه):
void I2C1_EV_IRQHandler(void) {
// پردازش خطاها
if (__HAL_I2C_GET_FLAG(&hi2c1, I2C_FLAG_BERR)) {
__HAL_I2C_CLEAR_FLAG(&hi2c1, I2C_FLAG_BERR);
// خطای باس
}

if (__HAL_I2C_GET_FLAG(&hi2c1, I2C_FLAG_AF)) {
__HAL_I2C_CLEAR_FLAG(&hi2c1, I2C_FLAG_AF);
// خطای NACK
}

// پردازش وقفه STOP
if (__HAL_I2C_GET_FLAG(&hi2c1, I2C_FLAG_STOPF)) {
__HAL_I2C_CLEAR_FLAG(&hi2c1, I2C_FLAG_STOPF);
// پایان انتقال
}

HAL_I2C_EV_IRQHandler(&hi2c1); // پردازش باقی وقفه‌ها توسط HAL
}

با مدیریت صحیح این وقفه‌ها، می‌توانید ارتباطات I2C را با قابلیت اطمینان بالا و مصرف بهینه منابع پیاده‌سازی کنید!
در میکروکنترلرهای 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() برای مدیریت ساده‌تر وقفه‌ها
در سلسله پستهای اینده به بررسی واحد HRTIM در میکروکنترولر stm32h743iit6 میپردازیم💫
واحد 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، سپس توقف تا دریافت تریگر بعدی.
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.

---
پیادهسازی 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 با تاخیر فاز


// ۵. تنظیم خروجیهای 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:
- شیفت فاز با دقت زیر نانوثانیه قابل تنظیم است.
- هماهنگی بین تایمرها بهصورت سختافزاری و بدون نیاز به وقفه انجام میشود.
پیادهسازی 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 میشود.

---
### ۶. مزایای 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 برای نمونهبرداری در نقاط خاص شکل موج استفاده کنید.
قابلیت 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 : █████████████████████░░░░░░░░
سیگنال خطا : ______________█████____________
خروجی پس از خطا: █████████████_______░░░░░░░░░