فروشگاه
راهنمای کاربردی برد توسعه 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 دلار است که برای کاربردهای سادهتر توجیه اقتصادی ندارد.
راهنمای راهاندازی اولیه
برای شروع کار با این برد، مراحل زیر را دنبال کنید:
- نصب محیط توسعه STM32CubeIDE از سایت رسمی STMicroelectronics
- ایجاد پروژه جدید و انتخاب برد NUCLEO-F334R8
- پیکربندی پریفرالهای مورد نیاز (HRTIM، ADC و غیره) در STM32CubeMX
- تولید کد و کامپایل پروژه
- آپلود برنامه از طریق 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 بهترین انتخاب برای سیستمهای قدرت دیجیتال با بودجه محدود است.