
آموزش کنترل سرعت موتور DC و تنظیم شدت نور LED با STM32 (قسمت دوم)
معرفی پروژه
در این آموزش قصد داریم با استفاده از برد **STM32F103C8T6 (Blue Pill)** سرعت یک موتور DC و شدت نور یک LED را به وسیله یک پتانسیومتر کنترل کنیم. برای این کار از واحد **ADC** جهت خواندن مقدار ولتاژ و از **PWM** برای کنترل خروجی استفاده میکنیم.
این پروژه یکی از مهمترین پروژههای آموزشی STM32 است و پایه بسیاری از سیستمهای صنعتی مانند کنترل فن، کنترل پمپ، درایور موتور، نورپردازی هوشمند و رباتیک محسوب میشود.
- - -
وسایل موردنیاز
| قطعه | تعداد |
|-----------------------|--- - : |
| STM32F103C8T6 Blue Pill | 1 |
| پتانسیومتر 10K | 1 |
| موتور DC 12V | 1 |
| LED قدرت یا LED معمولی | 1 |
| MOSFET IRLZ44N | 1 |
| مقاومت 220Ω | 1 |
| مقاومت 330Ω | 1 |
| دیود 1N5408 | 1 |
| منبع تغذیه 12V | 1 |
| پروگرامر ST-Link V2 | 1 |
- - -
نحوه عملکرد پروژه
پتانسیومتر یک ولتاژ بین **0 تا 3.3 ولت** تولید میکند. این ولتاژ توسط واحد **ADC** داخل STM32 خوانده شده و به یک عدد دیجیتال بین **0 تا 4095** تبدیل میشود.
سپس این مقدار به تایمر ارسال میشود تا **Duty Cycle** سیگنال PWM تغییر کند. با تغییر Duty Cycle:
* سرعت موتور کم و زیاد میشود.
* شدت نور LED نیز تغییر میکند.
- - -
پایههای مورد استفاده
| عملکرد | پایه STM32 |
|--------------- - |--------------|
| ورودی پتانسیومتر | PA0 (ADC1_IN0) |
| PWM موتور | PA8 (TIM1_CH1) |
| PWM LED | PA9 (TIM1_CH2) |
| تغذیه | 3.3V |
| زمین | GND |
- - -
اتصال قطعات
پتانسیومتر
* پایه اول → GND
* پایه وسط → PA0
* پایه سوم → 3.3V
موتور
* مثبت موتور → +12V
* منفی موتور → Drain ماسفت
MOSFET IRLZ44N
* Gate → PA8 از طریق مقاومت 220Ω
* Drain → منفی موتور
* Source → GND
دیود هرزگرد
* موازی موتور نصب شود.
* کاتد → +12V
* آند → Drain ماسفت
LED
* پایه مثبت → +5V (یا منبع مناسب LED)
* پایه منفی → مقاومت 330Ω → PA9 (در صورت LED معمولی میتوانید آن را به روش مناسب در مدار قرار دهید.)
> **نکته:** اگر از LED قدرت استفاده میکنید، آن را مستقیماً به پایه STM32 وصل نکنید و از درایور یا MOSFET استفاده کنید.
- - -
نحوه عملکرد مدار
1. پتانسیومتر مقدار ولتاژ را تغییر میدهد.
2. STM32 این مقدار را با ADC اندازهگیری میکند.
3. مقدار ADC به PWM تبدیل میشود.
4. PWM به موتور ارسال میشود و سرعت آن تغییر میکند.
5. همزمان PWM دیگری شدت نور LED را کنترل میکند.

تنظیم پروژه در STM32CubeMX و Keil
در این قسمت، پروژه را در **STM32CubeMX** ایجاد میکنیم تا کدهای اولیه بهصورت خودکار تولید شوند. سپس پروژه را در **Keil uVision5** باز کرده و برنامهنویسی را آغاز میکنیم.
- - -
مرحله اول: ساخت پروژه جدید
1. نرمافزار **STM32CubeMX** را اجرا کنید.
2. گزینه **New Project** را انتخاب کنید.
3. میکروکنترلر **STM32F103C8Tx** را جستجو کرده و انتخاب کنید.
4. روی **Start Project** کلیک کنید.
- - -
مرحله دوم: تنظیم پایهها
| پایه | عملکرد |
|--- - |------------ |
| PA0 | ADC1_IN0 |
| PA8 | TIM1_CH1 PWM |
| PA9 | TIM1_CH2 PWM |
پس از انتخاب پایهها، CubeMX بهصورت خودکار تایمر و ADC را فعال میکند.
- - -
مرحله سوم: تنظیم ADC
از منوی **ADC1** تنظیمات زیر را انجام دهید:
* Resolution: **12 Bit**
* Data Alignment: **Right**
* Scan Mode: **Disable**
* Continuous Conversion Mode: **Enable**
* Number of Conversion: **1**
* External Trigger: **Software Start**
- - -
مرحله چهارم: تنظیم PWM
وارد بخش **TIM1** شوید.
برای هر دو کانال تنظیمات زیر را انجام دهید:
* Channel 1 → PWM Generation CH1
* Channel 2 → PWM Generation CH2
- - -
تنظیم فرکانس PWM
در قسمت **Parameter Settings**:
| گزینه | مقدار |
|--------------------|-----|
| Prescaler | 71 |
| Counter Period (ARR) | 999 |
فرکانس خروجی تقریباً **1 کیلوهرتز** خواهد بود که برای این پروژه مناسب است.
> اگر قصد دارید صدای موتور کمتر شود، میتوانید فرکانس PWM را به حدود **20 کیلوهرتز** افزایش دهید.
- - -
مرحله پنجم: تنظیم Clock
از بخش **Clock Configuration**:
* HSE = 8MHz
* SYSCLK = 72MHz
* AHB = 72MHz
* APB1 = 36MHz
* APB2 = 72MHz
- - -
مرحله ششم: تنظیم پروژه
از منوی **Project Manager**:
* Project Name: `PWM_Motor_LED`
* Toolchain: **MDK-ARM V5**
* Generate under Root
سپس روی **Generate Code** کلیک کنید.
- - -
باز کردن پروژه در Keil
پس از تولید کد:
```
PWM_Motor_LED.uvprojx
```
را در **Keil uVision5** باز کنید.
- - -
فایلهای مهم پروژه
```
Core
├── main.c
├── main.h
├── stm32f1xx_it.c
├── stm32f1xx_hal_msp.c
└── system_stm32f1xx.c
```
بیشتر برنامه ما داخل فایل **main.c** نوشته خواهد شد.
- - -
توابع آماده تولیدشده توسط CubeMX
در فایل `main.c` توابع زیر را مشاهده خواهید کرد:
```c
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM1_Init();
```
این توابع بهصورت خودکار پایهها، ADC و تایمر را مقداردهی اولیه میکنند.
- - -
اجرای PWM
قبل از ورود به حلقه `while(1)` باید PWM را فعال کنید:
```c
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
```
- - -
آمادهسازی ADC
برای شروع تبدیل ADC نیز دستور زیر را قرار دهید:
```c
HAL_ADC_Start(&hadc1);
```
- - -
نتیجه
اکنون پروژه آماده برنامهنویسی است. در این مرحله:
* پایههای ورودی و خروجی تنظیم شدهاند.
* ADC برای خواندن پتانسیومتر آماده است.
* تایمر TIM1 برای تولید PWM آماده است.
* پروژه بدون خطا در Keil باز میشود.
قسمت سوم
در قسمت بعدی، کدنویسی کامل پروژه را انجام میدهیم؛ شامل:
* خواندن مقدار پتان
سیومتر از ADC
* تبدیل مقدار ADC به PWM
* کنترل همزمان سرعت موتور و شدت نور LED
* توضیح خطبهخط تمام کدها و نحوه عملکرد هر دستور.
عالی، در ادامه **بخش برنامهنویسی کامل پروژه** را میگذارم. این قسمت را میتوانید مستقیماً به عنوان ادامه مقاله در سایت قرار دهیم
بعد از ساخت پروژه در CubeMX و باز کردن آن در Keil، تنها کافی است چند خط کد به برنامه اضافه کنیم تا موتور و LED توسط پتانسیومتر کنترل شوند.
تعریف متغیرها
ابتدای فایل **main.c** بنویسید:
```c
uint16_t ADC_Value=0;
uint16_t PWM_Value=0;
```
- - -
فعال کردن PWM
بعد از توابع CubeMX و قبل از حلقه `while(1)` بنویسید:
```c
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
```
این دستور خروجی PWM را روی پایههای PA8 و PA9 فعال میکند.
- - -
برنامه اصلی
داخل حلقه `while(1)` کد زیر را قرار دهید.
```c
while(1)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,10);
ADC_Value=HAL_ADC_GetValue(&hadc1);
PWM_Value=(ADC_Value*999)/4095;
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,PWM_Value);
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,PWM_Value);
HAL_delay(5);
}
```
- - -
توضیح برنامه
شروع تبدیل ADC
```c
HAL_ADC_Start(&hadc1);
```
ADC فعال شده و نمونهبرداری آغاز میشود.
- - -
انتظار برای پایان تبدیل
```c
HAL_ADC_PollForConversion(&hadc1,10);
```
برنامه منتظر میماند تا تبدیل ADC کامل شود.
- - -
خواندن مقدار ADC
```c
ADC_Value=HAL_ADC_GetValue(&hadc1);
```
عددی بین
```
0 تا 4095
```
خوانده میشود.
- - -
تبدیل ADC به PWM
```c
PWM_Value=(ADC_Value*999)/4095;
```
چون مقدار ARR تایمر برابر **999** است، مقدار ADC باید به همین بازه تبدیل شود.
- - -
ارسال PWM به موتور
```c
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,PWM_Value);
```
سرعت موتور تغییر میکند.
- - -
ارسال PWM به LED
```c
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,PWM_Value);
```
نور LED نیز همزمان تغییر میکند.
- - -
# مثال عملی
اگر مقدار پتانسیومتر برابر باشد با
```
ADC=1024
```
آنگاه
```
PWM=(1024×999)/4095
PWM≈250
```
سرعت موتور حدود ۲۵٪ خواهد بود.
- - -
اگر مقدار ADC
```
2048
```
باشد.
```
PWM≈500
```
موتور با حدود ۵۰٪ سرعت کار میکند.
- - -
اگر مقدار ADC
```
4095
```
باشد.
```
PWM=999
```
موتور و LED با حداکثر توان کار میکنند.
- - -
تغییر فرکانس PWM
برای حذف صدای موتور میتوان فرکانس PWM را افزایش داد.
فرمول محاسبه:
[
PWM\ Frequency=\frac{Timer\ Clock}{(PSC+1)\times(ARR+1)}
]
به عنوان مثال:
```
Clock=72MHz
PSC=3
ARR=899
```
فرکانس حدود
```
20KHz
```
خواهد شد.
- - -
عیبیابی
اگر موتور حرکت نمیکند:
* اتصال Gate ماسفت بررسی شود.
* منبع تغذیه ۱۲ ولت بررسی شود.
* پایه Source به GND مشترک متصل باشد.
* دیود هرزگرد بهدرستی نصب شده باشد.
* پایه PWM صحیح انتخاب شده باشد (PA8 یا PA9).
اگر LED تغییر نور ندارد:
* مقدار مقاومت سری مناسب باشد.
* PWM روی کانال درست فعال شده باشد.
* LED سالم باشد.
- - -
کاربردهای پروژه
* کنترل سرعت فن
* کنترل پمپ آب
* کنترل موتور ربات
* نورپردازی هوشمند
* دستگاه CNC
* چاپگر سهبعدی
* کنترل هیتر
* پروژههای صنعتی
- - -
# جمعبندی
در این پروژه یاد گرفتیم چگونه با استفاده از **STM32F103C8T6**، واحد **ADC** و **PWM** را برای کنترل همزمان سرعت موتور DC و شدت نور LED به کار بگیریم. با تغییر مقدار پتانسیومتر، میتوان Duty Cycle سیگنال PWM را بهصورت لحظهای تغییر داد و خروجی را با دقت بالا کنترل کرد. این روش به دلیل دقت، راندمان بالا و مصرف انرژی
کم، در بسیاری از تجهیزات صنعتی، رباتیک و سیستمهای اتوماسیون استفاده میشود.
این آموزش پایهای مناسب برای پروژههای پیشرفتهتر مانند کنترل موتور با نمایشگر OLED، کنترل از طریق بلوتوث یا Wi-Fi، و استفاده از انکودر برای کنترل حلقهبسته خواهد بود.
آدرس دفتر مرکزی :شیراز-صدرا -خیابان سهند -مجتمع قائم -بلوکD21
شماره :09012057703ثابت:36419306_071
دنیای ورودبه الکترونیک وبرنامه نویسی میکروبایت.
اینجا دنیایی نو وجدید هست
دنیایی پراز ایده های الکترونیک وپروژه های الکترونیک
دنیایی با قوانین طبیعت
تمامی پروژه ها و مقالات تحت نظارت افراد کاملا حرفه ای و متخصص انجام میشود.
تمامی پروژه ها در میکروبایت کاملا تست شده و بدون ابهام آموزش داده میشود.
کلیه حقوق نزد میکروبایت محفوظ میباشد. microbytes.ir



(3)(4).png)
.png)