بردهای توسعه

راهنمای کاربردی برد توسعه STM32 NUCLEO-F334R8

برد توسعه STM32 NUCLEO-F334R8

راهنمای کاربردی برد توسعه STM32 NUCLEO-F334R8

برد توسعه STM32 NUCLEO-F334R8 یک پلتفرم ارزیابی از خانواده Nucleo شرکت STMicroelectronics است که به‌طور خاص برای پیاده‌سازی سیستم‌های الکترونیک قدرت دیجیتال طراحی شده است. این برد بر پایه میکروکنترلر STM32F334R8T6 ساخته شده و دارای قابلیت‌های منحصربه‌فردی مانند High-Resolution PWM (HRPWM) با دقت 184 پیکوثانیه و ADC با Oversampling سخت‌افزاری است.

مشخصات فنی دقیق بر اساس Datasheet Rev 8 (2024)

این برد از میکروکنترلر STM32F334R8T6 استفاده می‌کند که دارای هسته ARM Cortex-M4 با واحد ممیز شناور (FPU) است. فرکانس کاری ماکزیمم این میکروکنترلر 72 مگاهرتز است. حافظه Flash برابر با 64 کیلوبایت و حافظه SRAM شامل 16 کیلوبایت حافظه اصلی و 6 کیلوبایت حافظه CCM (Core-Coupled Memory) است.

پریفرال‌های کلیدی

  • HRTIM: پریفرال اختصاصی High-Resolution Timer با دقت زمانی تا 184ps
  • ADC: چهار مبدل آنالوگ به دیجیتال 12 بیتی با سرعت 4 مگا‌نمونه در ثانیه
  • DAC: دو خروجی دیجیتال به آنالوگ 12 بیتی
  • ارتباطات: USART، I2C، SPI، CAN و USB Full-Speed
  • رابط‌های گسترش: Arduino Uno Rev3 و ST Morpho

چرا NUCLEO-F334R8 هنوز مرجع است؟

NUCLEO-F334R8 تنها برد در خانوادهٔ Nucleo است که پریفرال HRTIM را دارد — قابلیتی که حتی در STM32H7 یافت نمی‌شود. این برد برای کنترل سیستم‌های قدرت با فیدبک ولتاژ/جریان طراحی شده و دقت زمانی 184ps را فراهم می‌کند.


 مشخصات فنی دقیق — بر اساس Datasheet Rev 8 (2024)

پارامتر
مقدار
منبع
MCU
STM32F334R8T6
Core
ARM Cortex-M4 + FPU
Max Frequency
72 MHz
RM0364, §6.2
Flash
64 KB
DS10067, p.15
SRAM
16 KB + 6 KB CCM
DS10067, p.16
ADC
4× 12-bit, 4 MSPS, HW Oversampling
RM0364, §13.3.22
HRTIM
1 Master + 2 Slave → 6 PWM outputs
RM0364, §24

📌 نکته حیاتی: CCM RAM فقط توسط CPU قابل دسترسی است — برای متغیرهای PID استفاده شود.

کاربردهای صنعتی و آکادمیک

برد توسعه STM32 NUCLEO-F334R8 برای کاربردهای زیر ایده‌آل است:

  • کنترل‌کننده‌های دیجیتال منابع تغذیه سوئیچینگ (SMPS)
  • سیستم‌های درایو موتور DC و BLDC
  • اینورترهای خورشیدی کوچک
  • شبیه‌سازی سیستم‌های HVDC
  • آموزش کنترل دیجیتال در دوره‌های کارشناسی ارشد و دکتری

حتماً! بُردهای STM32 Nucleo سری بُرد‌های توسعه‌ای (Development Boards) هستند که توسط STMicroelectronics طراحی شده‌اند تا به توسعه‌دهندگان اجازه دهند به راحتی با میکروکنترلرهای STM32 آشنا شوند و پروژه‌های خود را روی آن‌ها پیاده‌سازی کنند. این بُردها معمولاً از استاندارد Arduino Uno و ST Morpho برای اتصال ماژول‌های جانبی پشتیبانی می‌کنند و شامل یک ST-LINK/V2-1 داخلی برای پروگرم و دیباگ هستند.

در ادامه، انواع اصلی بُردهای Nucleo را بر اساس خانواده‌های STM32 دسته‌بندی کرده و سپس مقایسه فنی دقیق انجام می‌دهم.

🔹 دسته‌بندی عمومی بُردهای STM32 Nucleo

1. Nucleo-32

  • فرم‌فکتور کوچک‌تر (32 پینه)
  • ۳۶ یا ۴۸ پینه میکروکنترلر (LQFP)
  • مناسب برای پروژه‌های کوچک
  • مثال: NUCLEO-F031K6, NUCLEo-G031K8, NUCLEO-L412KB

2. Nucleo-64

  • فرم‌فکتور استاندارد (64 پینه)
  • رابط Arduino Uno + ST Morpho
  • پرکاربردترین سری
  • مثال: NUCLEO-F401RE, NUCLEO-L476RG, NUCLEO-H743ZI

3. Nucleo-144

  • فرم‌فکتور بزرگ (144 پینه)
  • ۳ عدد رابط ST Morpho + رابط Arduino Uno + رابط Ethernet (در برخی مدل‌ها)
  • قابلیت اتصال SDRAM و Ethernet PHY
  • مثال: NUCLEO-F767ZI, NUCLEO-H743ZI2, NUCLEO-L4R5ZI

🔹 خانواده‌های اصلی STM32 و معیارهای مقایسه

خانواده
معماری
فرکانس ماکزیمم
Flash
RAM
مصرف توان
ویژگی‌های کلیدی
F0
Cortex-M0
48 MHz
تا 256 KB
تا 32 KB
پایین
ارزان‌قیمت، پایه‌ای
F1
Cortex-M3
72 MHz
تا 1 MB
تا 96 KB
متوسط
کلاسیک، پایدار
F3
Cortex-M4F
72 MHz
تا 512 KB
تا 80 KB
متوسط
DSP، FPU، آنالوگ قوی
F4
Cortex-M4F
180 MHz
تا 2 MB
تا 320 KB
بالا
قدرت بالا، FPU، DSP
F7
Cortex-M7
216 MHz
تا 2 MB
تا 512 KB
بالا
Chache، LCD-TFT، Ethernet
H7
Cortex-M7/M4 (Dual-core در برخی)
400+ MHz
تا 2 MB+
تا 1 MB+
بالا
بسیار قدرتمند، AI-ready
G0
Cortex-M0+
64 MHz
تا 512 KB
تا 144 KB
بسیار پایین
جایگزین F0، مدرن‌تر
G4
Cortex-M4F
170 MHz
تا 512 KB
تا 128 KB
متوسط
Analog advanced (ADC/DAC)
L0
Cortex-M0+
32 MHz
تا 192 KB
تا 20 KB
خیلی پایین
Ultra-low power
L1
Cortex-M3
32 MHz
تا 512 KB
تا 80 KB
بسیار پایین
قدیمی‌تر از L0
L4/L4+
Cortex-M4F
80–120 MHz
تا 2 MB
تا 640 KB
پایین
تعادل خوب توان/عملکرد
L5
Cortex-M33
110 MHz
تا 512 KB
تا 256 KB
پایین
Secure, TrustZone
U5
Cortex-M33
160 MHz
تا 4 MB
تا 2.5 MB
بسیار پایین
امنیت بالا، IoT
WB
Cortex-M4 + M0+ (BLE)
64 MHz
تا 1 MB
تا 256 KB
پایین
Bluetooth 5 / BLE
WL
Cortex-M4 + sub-GHz
48 MHz
تا 256 KB
تا 64 KB
پایین
LoRa / Sigfox

🔹 مقایسه فنی مدل‌های معروف Nucleo

مدل
خانواده
CPU
فرکانس
Flash
RAM
پین‌ها
USB
CAN
Ethernet
قیمت تقریبی (USD)
NUCLEO-F031K6
F0
M0
48 MHz
32 KB
4 KB
32
~8
NUCLEO-G031K8
G0
M0+
64 MHz
64 KB
8 KB
32
~9
NUCLEO-L011K4
L0
M0+
32 MHz
16 KB
2 KB
32
~7
NUCLEO-F401RE
F4
M4F
84 MHz
512 KB
96 KB
64
~15
NUCLEO-F411RE
F4
M4F
100 MHz
512 KB
128 KB
64
~15
NUCLEO-L476RG
L4
M4F
80 MHz
1 MB
128 KB
64
~16
NUCLEO-G431RB
G4
M4F
170 MHz
128 KB
32 KB
64
~15
NUCLEO-F767ZI
F7
M7
216 MHz
2 MB
512 KB
144
~22
NUCLEO-H743ZI2
H7
M7
480 MHz
2 MB
1 MB
144
~24
NUCLEO-WB55RG
WB
M4 + M0+
64 MHz
512 KB
256 KB
64
~20
NUCLEO-L552ZE-Q
L5
M33
110 MHz
512 KB
256 KB
144
~20

✅ نکته: تمام مدل‌های بالا دارای ST-LINK/V2-1 داخلی، پشتیبانی از Arduino Uno R3 و منبع تغذیه USB هستند.


🔹 چگونه بُرد مناسب را انتخاب کنیم؟

  • اگر کم‌مصرف بودن مهم است: سری L0 / L4 / L5 / U5
  • اگر نیاز به قدرت محاسباتی بالا دارید: F4 / F7 / H7
  • اگر نیاز به ارتباط بی‌سیم دارید:
    • BLE: سری WB
    • LoRa / Sigfox: سری WL
  • اگر بودجه محدود است: F0 / G0 / L0
  • اگر قصد استفاده از Ethernet یا SDRAM دارید: NUCLEO-144 (مثل H743ZI2)

🔹 پیشنهاد بر اساس کاربرد

کاربرد
پیشنهاد
آموزش و شروع کار
NUCLEO-F401RE یا NUCLEO-G031K8
رباتیک / کنترل موتور
NUCLEO-G431RB (ADC/DAC قوی)
IoT هوشمند (باتری)
NUCLEO-L476RG یا NUCLEO-WB55RG
پردازش تصویر / هوش مصنوعی
NUCLEO-H743ZI2
لوازم پزشکی / حسگر کم‌مصرف
NUCLEO-L011K4

معماری HRTIM و قابلیت HRPWM

پریفرال HRTIM (High-Resolution Timer) قلب تپنده این برد است. این پریفرال شامل یک تایمر اصلی (Master) و دو تایمر برده (Slave) است که قادر به تولید شش خروجی PWM مستقل است. با فعال‌سازی حالت Interleaved، دقت زمانی از 6.94 نانوثانیه به 184 پیکوثانیه ارتقا می‌یابد. این دقت برای تنظیم دقیق duty cycle در مبدل‌های قدرت ضروری است.

پیاده‌سازی عملی HRPWM

پیکربندی HRTIM نیاز به فعال‌سازی کلاک پریفرال و تنظیم رجیسترها دارد. کد زیر یک مثال کاربردی برای تولید PWM با دقت بالا ارائه می‌دهد.

ADC پیشرفته با Oversampling سخت‌افزاری

سیستم ADC این برد قادر به افزایش رزولوشن مؤثر از 12 بیت به 16 بیت با استفاده از Oversampling سخت‌افزاری است. این قابلیت با میانگین‌گیری از 16 نمونه متوالی و شیفت بیتی، نویز را کاهش داده و دقت اندازه‌گیری ولتاژ فیدبک را به‌طور چشمگیری بهبود می‌بخشد.

مقایسه فنی با سایر بُردهای Nucleo

NUCLEO-F334R8 در برابر NUCLEO-F303RE

NUCLEO-F303RE دارای حافظه Flash بیشتر (512 کیلوبایت) و CCM RAM بزرگ‌تر (32 کیلوبایت) است، اما قیمت آن 50 درصد بیشتر است. برای پروژه‌های دانشگاهی با بودجه محدود، NUCLEO-F334R8 انتخاب بهینه‌تری است.

NUCLEO-F334R8 در برابر NUCLEO-G474RE

سری G4 از آپ‌آمپ‌های داخلی و تایمرهای پیشرفته‌تری برخوردار است، اما HRTIM تنها در مدل‌های G474/G484 موجود است. با این حال، قیمت این بُردها به‌طور متوسط 20 دلار است که برای کاربردهای ساده‌تر توجیه اقتصادی ندارد.

راهنمای راه‌اندازی اولیه

برای شروع کار با این برد، مراحل زیر را دنبال کنید:

  1. نصب محیط توسعه STM32CubeIDE از سایت رسمی STMicroelectronics
  2. ایجاد پروژه جدید و انتخاب برد NUCLEO-F334R8
  3. پیکربندی پریفرال‌های مورد نیاز (HRTIM، ADC و غیره) در STM32CubeMX
  4. تولید کد و کامپایل پروژه
  5. آپلود برنامه از طریق ST-LINK داخلی بدون نیاز به پروگرمر خارجی

دیباگ حرفه‌ای با ابزارهای STM32CubeIDE

محیط STM32CubeIDE امکان دیباگ حرفه‌ای را از طریق Serial Wire Viewer (SWV) فراهم می‌کند. مهندسان می‌توانند مقادیر ولتاژ فیدبک، duty cycle و سایر متغیرهای کلیدی را در زمان واقعی بدون تداخل با اجرای سیستم مشاهده کنند.

معماری HRTIM و پیاده‌سازی HRPWM با دقت 184ps

پریفرال HRTIM (High-Resolution Timer) قلب تپنده این برد است. این پریفرال قادر به تولید PWM با دقت زمانی تا 184 پیکوثانیه است.

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

HRTIM_TimeBaseCfgTypeDef TimeBase = {0};
TimeBase.Period = 5555; // ≈13 kHz
HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_MASTER, &TimeBase);

HRTIM_OutputCfgTypeDef OutCfg = {0};
OutCfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
OutCfg.SetSource = HRTIM_OUTPUTSET_TIMEVEF1;
OutCfg.ResetSource = HRTIM_OUTPUTRESET_TIMEVRF1;
HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, &OutCfg);

HAL_HRTIM_WaveformCounterStart(&hhrtim1, HRTIM_TIMERID_MASTER | HRTIM_TIMERID_TIMER_A);

ADC پیشرفته با Oversampling سخت‌افزاری

hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;

hadc1.Init.OversamplingMode = ENABLE;
hadc1.Init.Oversampling.OvsR = ADC_OVERSAMPLING_RATIO_16;
hadc1.Init.Oversampling.OvsShift = ADC_RIGHTBITSHIFT_4;
hadc1.Init.Oversampling.ToBits = ADC_OVS_VPRESERVE_BITS;

HAL_ADC_Init(&hadc1);

10 پروژه کاربردی با برد توسعه STM32 NUCLEO-F334R8

پروژه 1: تنظیم سیستم کلاک (72 MHz با PLL)

void SystemClock_Config(void) {
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
}

پروژه 2: کنترل دیجیتال Buck Converter

__attribute__((section(".ccmram"))) static float Kp = 0.4f, Ki = 0.02f;
__attribute__((section(".ccmram"))) static float integral = 0.0f;
#define V_REF 2.5f
#define PERIOD 5555

void HAL_HRTIM_PeriodElapsedCallback(HRTIM_HandleTypeDef *hhrtim, uint32_t TimerIdx) {
  if (TimerIdx == HRTIM_TIMERINDEX_TIMER_A) {
    uint32_t adc_val = HAL_ADC_GetValue(&hadc1);
    float v_out = adc_val * (3.3f / 4095.0f);
    
    float error = V_REF - v_out;
    integral += error * 7.7e-5f;
    float duty = Kp * error + Ki * integral;
    if (duty < 0.0f) duty = 0.0f;
    if (duty > 1.0f) duty = 1.0f;
    
    __HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, (uint16_t)(duty * PERIOD));
  }
}

پروژه 3: درایو موتور DC با H-Bridge

void SetMotor(float duty, int direction) {
  if (direction == 1) {
    __HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, (uint16_t)(duty * PERIOD));
    __HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_2, 0);
  } else {
    __HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, 0);
    __HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_2, (uint16_t)(duty * PERIOD));
  }
}

پروژه 4: اندازه‌گیری جریان با سنسور ACS712

#include "main.h"
ADC_HandleTypeDef hadc1;

void MX_ADC1_Init(void) {
  ADC_ChannelConfTypeDef sConfig = {0};
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.OversamplingMode = ENABLE;
  hadc1.Init.Oversampling.OvsR = ADC_OVERSAMPLING_RATIO_16;
  hadc1.Init.Oversampling.OvsShift = ADC_RIGHTBITSHIFT_4;
  hadc1.Init.Oversampling.ToBits = ADC_OVS_VPRESERVE_BITS;
  HAL_ADC_Init(&hadc1);

  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES_5;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

float read_current(void) {
  HAL_ADC_Start(&hadc1);
  if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
    uint32_t raw = HAL_ADC_GetValue(&hadc1);
    float v = raw * (3.3f / 4095.0f);
    return (v - 1.65f) / 0.185f; // برای ACS712-05B
  }
  return 0.0f;
}

پروژه 5: تولید سیگنال سینوسی با DAC

#include <math.h>
#define PI 3.14159265f

uint16_t sine_lut[100];

void GenerateSineLUT(void) {
  for (int i = 0; i < 100; i++) {
    sine_lut[i] = (uint16_t)(2048 + 2047 * sinf(2 * PI * i / 100));
  }
}

// فراخوانی هر 1ms:
// HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, sine_lut[idx++ % 100]);

پروژه 6: مدولاسیون PWM برای LED Dimming

TIM_HandleTypeDef htim2;

void MX_TIM2_Init(void) {
  TIM_OC_InitTypeDef sConfigOC = {0};
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 72 - 1;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 1000 - 1;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_Base_Init(&htim2);
  HAL_TIM_PWM_Init(&htim2);
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
}

// در main:
// HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
// __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 500); // 50%

پروژه 7: کنترل دمای سیستم با NTC

</pre>
// main.c - خواندن NTC و کنترل فن روی PA1 (PWM)
#include "main.h"
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim2;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_TIM2_Init(void);

// مقاومت NTC در 25°C = 10kΩ
// B = 3950
#define R_BALANCE 10000.0f
#define B_VALUE 3950.0f
#define T0 298.15f // 25°C in Kelvin

float read_temperature(void)
{
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
{
uint32_t raw = HAL_ADC_GetValue(&hadc1);
float v_adc = raw * (3.3f / 4095.0f);
float r_ntc = R_BALANCE * (3.3f / v_adc - 1.0f);
float t_inv = (1.0f / T0) + (1.0f / B_VALUE) * logf(r_ntc / 10000.0f);
return (1.0f / t_inv) - 273.15f;
}
return 0.0f;
}

int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM2_Init();
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

while (1)
{
float temp = read_temperature();
uint16_t fan_pwm = 0;
if (temp > 40.0f) fan_pwm = 800;
else if (temp > 30.0f) fan_pwm = 400;
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, fan_pwm);
HAL_Delay(500);
}
}

// --- ADC و Timer Init (مشابه پروژه‌های قبل) ---
static void MX_ADC1_Init(void) { /* ... */ }
static void MX_TIM2_Init(void) { /* ... */ }
<pre>

پروژه 8: ارتباط UART با کامپیوتر

char buffer[32];
float v_out = 3.14f; // مثال
snprintf(buffer, sizeof(buffer), "V=%.3f V\r\n", v_out);
HAL_UART_Transmit(&huart2, (uint8_t*)buffer, strlen(buffer), 100);

پروژه 9: مبدل فرکانس (Inverter)

// main.c - Inverter ساده با HRTIM (دو خروجی مکمل)
#include "main.h"
HRTIM_HandleTypeDef hhrtim1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_HRTIM1_Init(void);

int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_HRTIM1_Init();

// فعال‌سازی Dead-Time: 500ns
HRTIM_DeadTimeCfgTypeDef deadTime = {0};
deadTime.Prescaler = HRTIM_TIMDEADTIME_PRESCALER_DIV1;
deadTime.RisingValue = 72; // 72 / 144MHz = 500ns
deadTime.FallingValue = 72;
deadTime.RisingSign = HRTIM_TIMDEADTIME_RISINGSIGN_POSITIVE;
deadTime.FallingSign = HRTIM_TIMDEADTIME_FALLINGSIGN_POSITIVE;
HAL_HRTIM_DeadTimeConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, &deadTime);

HAL_HRTIM_WaveformCounterStart(&hhrtim1,
HRTIM_TIMERID_MASTER |
HRTIM_TIMERID_TIMER_A
);

// تنظیم duty cycle = 50%
__HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, 2777);
__HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_2, 2777);

while (1) { }
}

static void MX_HRTIM1_Init(void)
{
hhrtim1.Instance = HRTIM1;
HAL_HRTIM_Init(&hhrtim1);

HRTIM_TimeBaseCfgTypeDef TimeBase = {0};
TimeBase.Period = 5555; // ~13 kHz
HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_MASTER, &TimeBase);
HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, &TimeBase);

HRTIM_OutputCfgTypeDef OutCfg = {0};
OutCfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
OutCfg.SetSource = HRTIM_OUTPUTSET_TIMEVEF1;
OutCfg.ResetSource = HRTIM_OUTPUTRESET_TIMEVRF1;
OutCfg.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;
OutCfg.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
OutCfg.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
OutCfg.ChopperMode = HRTIM_OUTPUTCHOPPERMODE_DISABLE;
OutCfg.BurstMode = HRTIM_OUTPUTBURSTMODE_NONE;

HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, &OutCfg);
HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA2, &OutCfg);
}

پروژه 10: شبیه‌سازی سیستم قدرت

ترکیب پروژه‌های 2 و 8: افزودن ارسال داده سریال به حلقه PID.


// در پروژه 2، این خطوط را در callback اضافه کنید:
char buf[32];
snprintf(buf, sizeof(buf), "V=%.3f,D=%.3f\n", v_out, duty);
HAL_UART_Transmit(&huart2, (uint8_t*)buf, strlen(buf), 100);

سؤالات متداول

آیا NUCLEO-F334R8 برای پروژه‌های IoT مناسب است؟
خیر. این برد برای کاربردهای الکترونیک قدرت طراحی شده…

چرا این برد از HRTIM استفاده می‌کند؟
پریفرال HRTIM تنها در خانواده‌های STM32F3 و STM32G474/G484 پیاده‌سازی شده است.

آیا نیاز به پروگرمر خارجی دارم؟
خیر. این برد دارای ST-LINK/V2-1 داخلی است.

آیا می‌توان از آن برای BLDC استفاده کرد؟
بله، با افزودن سنسور موقعیت روتور.

آیا کدهای نمونه موجود است؟
بله، در STM32CubeF3 GitHub.

جمع‌بندی

برد NUCLEO-F334R8 بهترین انتخاب برای سیستم‌های قدرت دیجیتال با بودجه محدود است.

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