Professional Documents
Culture Documents
-میکرو کنترلر ها ادواتی برنامه پذیر هستند .و برای این که کاری
انجام بدهند .باید یک برنامه نوشت و آن را روی میکروکنترلر
پروگرام کرد .و سپس یک سخت افزار طراحی کرد که این برنامه با
این سخت افزار کار بکند.
این روش سریع ترین حالت و مستقیم ترین حالت می باشد اما
حالتی است که برای عموم افراد دشوار و زمان بر می باشد .
ولتاژ → 𝑡𝑙𝑜𝑉 = 𝑉
-مثال عملی:
مخزن آب
سطح زمین
-اگر سطح زمین را دارای یک پتانسیل گرانشی بدانیم و مکانی که
منبع آب آنجا قرار دارد را هم دارای یک پتانسیل گرانشی بدانیم .و
دلیل آنکه این دو نقطه با هم اختالف ارتفاع دارند ,بنابراین
اختالف پتانسیل گرانشی نیز دارند ,پس آب در این شرایط جریان
پیدا می کند .
𝑸𝜟
=𝑰
𝑻𝜟
سطح زمین
-فرض می کنیم که در سیرکی شیر ها درون حلقه ای حرکت می
کنند .مثال در هر ثانیه 1⁄4شیر عبور می کند .یعنی در هر 4ثانیه
یک شیر عبور می کند .به این عمل آهنگ عبور شیر از حلقه می
گویند.
𝑣5𝑣 5
Resistor
Battery 𝑣10
این دو از نظر عملکرد یکسان می
Batteries باشند
*مشخصه های فنی قطعه مقاومت :
پکیج SMD
پکیج THD
نحوه خواندن رنگ های مقاومت
∎ خواندن کد مقاومت SMD
-1در مقاومت های SMDهرگاه حرف دیدیم همان جا ,به جای حرف
اعشار قرار میدهیم .
رقم آخر
) ∗ 10حاصلضرب عدد های باقی مانده(
حرف Kاعشار است ,منتهی برای مقاومت های درشت تر که بیانگر کیلو
اهم می باشد هستند.
7𝐾4 = 7.4𝐾Ω
47𝐾 = 47.0 = 47𝐾Ω
*با همین قانون حرف Mبیانگر مقاومت های مگا اهم هست.
4𝑀7 = 4.7𝑀Ω
4610 = 461Ω
-4در اندازه گیری مقاومت SMDهر کجا همه رقم های ما 0بود
(یک رقمی ,دو رقمی ,سه رقمی ,چهار رقمی ) فرقی نمی کند ,مقدار
مقاومت ما 0Ωمی باشد .
پکیج از نظر
سری بندی میکروکنترلر
طبقه بندی
ظاهری
ها خانواده
میکروکنترلر
General-Purpose-Input/Output = GPIO
االن این پایه نه 0می باشد و نه 1می باشد .این پایه آماده این
می باشد که به آن اطالع بدهیم که صفر بشود و یا یک بشود.
اکنون که تنظیمات پایه ها را انجام داده ایم ,و کالک میکروکنترلر
را هم تنظیم کرده ایم باید به قسمت کامپایلر رفته و برنامه را
بنویسیم.
حرف xحرف پایه ای که نیاز داریم را نشان دهنده این می باشد که با کدام خواهیم پایه 1باشد یا 0
-االن اگر برنامه باال را روی برد پروگرام کنیم LED .روی برد روشن
خواهد شد و روشن خواهد ماند.
نشان دهنده این می باشد که با کدام خانواده نشان دهنده این می باشد که
از پایه ها کار داریم.و به جای حرف xحرف
با کدام شماره پایه کارداریم
پایه ای که نیاز داریم را وارد می کنیم.
لوزی :جایی که نیاز به شرط داریم ,اگر اتفاق Xرخ داد ,کار Yرا
انجام بده .
File→New→Project→Consol Application
حال بعد از ساخت یک پروژه و انتخاب گزینه OKبه محیط برنامه
نویسی می رویم.
-چون زبان های برنامه نویسی که ما استفاده می کنیم ,زبان های
سطح باال هستند .دستوراتی که می نویسیم بسیار به چشم ما
آشنامی باشد .
در برنامه نویسی برای جمع دو عدد نمی توان فقط یک فرمول
ساده نوشت .ابتدا باید مکانی برای ذخیره عدد ها و جوابی که قرار
است بدست بیاید در حافظه اختصاص بدهیم.
;using namespace std در خروجی چاپ بکنیم ,این تابع را قبل از
int mainاضافه می کنیم.
; int a , b , sum
{ ) int main ( int argc , char** argv
; a = 3 عملگر تخصیص :مقدار سمت راست را
; b = 2 در متغیر سمت چپ می ریزد.
; sum = 2 + 3
این عبارت برای این می باشد که مقدار
;cout<<sum sumرا در خروجی چاپ بکند .
; return 0
این عبارت برای این می باشد که
} برنامه متوجه بشود به آخر برنامه
رسیده است .
; using namespace std مورد استفاده قرار نگرفت بهتر است پاک
شود تا عمل حافظه میکرو را اشغال نکند
; int a , b ,sum
{)int main (int argc , char** argv
;"cout<<"enter a:
;cin>>a
;"cout<<"enter b: در این قسمت عالمت های
;cin>>b دیگر هم می توان گذاشت
;sum=a+b
+ − ∗ /
;cout<<"sum is :"<<sum
;return 0
}
دستور :if
{)شرط( if
{)شرط( if
در نرم افزار با زدن کلید ترکیبی shift + tabمتن چنتایی به
عقب می گردد و با زدن کلید tabمتن چنتایی به جلو می رود .
مقدار aرا 5در نظر مقدار aرا 5در aرا برابر 5و bرا
بگیر و یک واحد به آن نظر بگیر و aرا به برابر 6قرار دهید و
اضافه کن a+bرا جمع کنید و
عالوه 1کن
مقدار آن را در a
قرار دهید.
∎مبحث بعدی که می خواهیم به آن بپردازیم ,حلقه می باشد.
;i=i+15
هر دو این عبارات یک معنی می دهد.
;i+=15
-اکنون به جای انکه salamچاپ بکنیم i .را چاپ می کنیم.
>#include <iostream
;using namespace std
; int i
{ )int main(int argc, char** argv
)for ( i=1 ; i<=10 ; i++
{
;"cout<<i<<"\n
}
;return 0
}
-مثال :ما می خواهیم مجموع اعداد 1تا 10را چاپ بکنیم.
-برای درک بهتر این موضوع باید یک کلید به پایه میکرو متصل
-کیپد :
-میکرو سوییچ :
ولی برای برنامه های اینچنینی همان مقدار اولیه کافی و حتی
مقدار های کمتر هم اوکی می باشد .
-بعد از تنظیم کالک و پایه ها بر روی گزینه Generate Code
;)HAL_GPIO_TogglePin(GPIOC_GPIO_Pin_13
;)HAL_Delay(1000
}
/* USER CODE BEGIN 3 */
}
}
-برای اتصال کلید به میکرو اگر صرفا کلید را به منفی متصل
بکنیم و بعد مستقیم به میکرو متصل بکنیم.
در این راه حل شاید زمانی که دستمان بر روی کلید نباشد ,
میکرو دچار نویز نشود .ولی زمانی که کلید را فشار می دهیم+ .
و – به هم متصل می شوند که به حالت اتصال کوتاه می
گویند.که میکرو و برد آسیب می زند .پس این راه حل کاربرد
ندارد .
پس برای حل floatشدن پایه میکرو یک مقاومت به کلید و میکرو
اضافه می کنیم.
-در حالت ایده آل وقتی ما کلید را فشار می دهیم انتظار داریم که
صفحات کلید بدون هیچ لغزشی به هم بچسند .و هیچ قطع و
وصلی حین این کار رخ ندهد.
-به طور خالصه چون سرعت اجرا شدن حلقه whileبسیار زیاد
می باشد.
𝑂𝑉
Switch
Bounce
Switch
Pressed
𝐶𝐶𝑉
Unoppressed
Switch
𝐷𝑁𝐺
𝑇
∎سون سگمنت _ _ Seven Segmentهفت قطعه ای
a COM
e c
d
A B C D E F G dot A B C D E F G dot
چون برای راه اندازی سون سگمنت نیاز داریم به آن داریم که
چند پایه را همزمان 0و 1کنیم .دیگر نمی توانیم با GPIO
Outputاین کار را انجام بدهیم .پس به سراغ رجیستر ODR
می رویم.
"#include "main.h
int main(void)
{
while (1)
{
/* USER CODE END WHILE */
GPIOA->ODR = 0x003F; //Displaying 0
HAL_Delay(1000); //One second delay
GPIOA->ODR = 0x0006; //Displaying 1
HAL_Delay(1000); //One second delay
GPIOA->ODR = 0x005B; //Displaying 2
HAL_Delay(1000); //One second delay
GPIOA->ODR = 0x004F; //Displaying 3
HAL_Delay(1000); //One second delay
GPIOA->ODR = 0x0066; //Displaying 4
HAL_Delay(1000); //One second delay
GPIOA->ODR = 0x006D; //Displaying 5
HAL_Delay(1000); //One second delay
GPIOA->ODR = 0x007D; //Displaying 6
HAL_Delay(1000); //One second delay
GPIOA->ODR = 0x0007; //Displaying 7
HAL_Delay(1000); //One second delay
GPIOA->ODR = 0x007F; //Displaying 8
HAL_Delay(1000); //One second delay
GPIOA->ODR = 0x006F; //Displaying 9
HAL_Delay(1000); //One second delay
Common Anode
-سون سگمنت ها به علت این که دارای پایه های زیادی می
باشد اگر بخواهیم مستقیما به میکرو متصل بکنیم .پایه های
زیادی از میکرو را اشغال می کند .برای همین از IC BCD
استفاده می کنیم(7448=CC & 7447=CA).
Display driver
BCD-input
-کارایی پایه های )(LT , BI/RBO , RBI
-حال اگر پایه LTرا 1منطقی بکنیم .و پایه BI/RBOهمچنان 1
منطقی باشد .خروجی BCDبرای نشان دادن اعداد فعال می
شود BI/RBO(Ripple Blanking Output) .
-جدول تبدیل اعداد باینری به دسیمال
Binary Decimal
D C B A -
0 0 0 0 0
0 0 0 1 1
0 0 1 0 2
0 0 1 1 3
0 1 0 0 4
0 1 0 1 5
0 1 1 0 6
0 1 1 1 7
1 0 0 0 8
1 0 0 1 9
1 0 1 0 10
1 0 1 1 11
1 1 0 0 12
1 1 0 1 13
1 1 1 0 14
1 1 1 1 15
-نحوه نمایش اعداد 0تا 15
توسط یک سون سگمنت
IC BCD وODR راه اندازی سون سگمنت با رجیستر-
IC BCDدر دو
نوع کاتد مشترک و
آند مشترک یکسان
می باشد .ولی
سطح ولتاژ خروجی
شان فرق می کند.
جامپر
حالت کاری
H
L
پتانسیومتر پتانسیومتر
حساسیت زمان
-بر روی برد دو عدد پتانسیومتر وجود دارد
-بر روی این برد یک جامپر قرار دارد که نوع مد کاری ماژول را
مشخص می کند ( در برخی مدل ها این جامپر به صورت پین
هدر می باشد و در برخی مدل ها دارای جامپر SMDمی باشد )
← Hمد کاری ( )Hold/Repeat/Retriggeringکه در این حالت
خروجی سنسور تا زمانی که سنسور حرکت را اشکار کند کماکان فعال
خواهد ماند.
سنسور PIR
تشخیص
حرکت
حالت جامپر
خروجی
سنسور PIR
تشخیص
حرکت
حالت جامپر
خروجی
-پس از اعمال تغذیه الکترونیکی ,این سنسور به مدت 30sتا
60sبرای سازگاریبا سطح انرژی تشعشعات مادون قرمز محیط
نیاز دارد .که در این مدت ممکن است چندین بار خروجی فعال
شود .
-برای ایجاد انعطاف روی کاربری این ماژول دو پد به نام های RT
و RLروی ماژول قرار گرفته است.
}
else
{
HAL_GPIO_WritePin(GPIOC , GPIO_PIN_13 ,
;)GPIO_PIN_SET
}
while (1)
{
pin_state = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_14);
if(pin_state == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIOC , GPIO_PIN_13 ,
GPIO_PIN_RESET);
}
else
{
HAL_GPIO_WritePin(GPIOC , GPIO_PIN_13 ,
GPIO_PIN_SET);
}
}
}
-پس پرورگرام کردن برنامه روی میکرو ,با بستن مدار زیر می
توانیم مدار را تست کنیم.
* جلسه چهارم
راه حل اول :مثال می خواهیم عدد 27را به میکرو به صورت 0و 1
ارسال کنیم.
0001 1011می شود .و این 0و 1هارا با یک بازه زمانی مشخص و
منظم که برای ما و میکرو از قبل استاندارد سازی ارسال می کنیم.
یعنی به این صورت پین را 1کنیم ,مدتی صبر کنیم .دوباره 0را
ارسال کنیم و مدتی صبر کنیم 0 .را ارسال کنیم و مدتی صبر کنیم .و
همین طور بیت های بعدی را ارسال می کنیم.
𝑇
-حال به سراغ سنسور هایی می رویم که خروجی که به ما می دهند
0و 1نیست و یک سطح ولتاژی به ما می دهند .مثل lm35
-حال واحد ADCمیکرو با دقتی تعین شده ولتاژ 0تا 3.3را تقسیم
( = )Resolutionدقت تقسیم بندی بندی می کند.
𝑛𝑜𝑖𝑡𝑢𝑙𝑜𝑠𝑒𝑅∗ 𝑁𝐼𝑉
= 𝐶𝐷𝐴 مقدار ولتاژ ADCبرابر است با :
𝑓𝑒𝑟𝑉
-تقسیم مقاومتی :تعدیل و تعویض بازه ولتاژی که به کار می رود .
) (𝑉1 𝑅2
𝑡𝑢𝑜𝑉 =
ورودی 0تا 18ولت ) (𝑅1 + 𝑅2
خروجی یک سنسور
1
3
2
4
-برای اینکه printfدر برنامه کار و LCDمجازی کار کند باید یک
کد ثابت به برنامه اضافه بکنیم.
/* USER CODE BEGIN PTD */
)int fputc(int ch,FILE *f
{
;)return ITM_SendChar(ch
}
/* USER CODE END PTD */
به اول برنامه اضافه#include "stdio.h" و همین طور یک-
.می کنیم
در این سنسور نسبت ولتاژ خروجی با دما مستقیم است .
-اگر بخواهیم دمای هوا را بدست بیاوریم .باید ولتاژ خوانده شده را
ضربدر مقدار نسبت ولتاژ خروجی نسبت به دما ,بکنیم.
: lm35 متن برنامه-
#include "main.h"
#include "stdio.h"
/* USER CODE BEGIN PTD */
int fputc(int ch,FILE *f)
{
return ITM_SendChar(ch);
}
/* USER CODE END PTD */
int main(void)
{
/* USER CODE BEGIN 1 */
int value;
float voltage , temp ;
/* USER CODE END 1 */
while (1)
{
/* USER CODE END WHILE */
HAL_ADC_Start(&hadc1);
value = HAL_ADC_GetValue(&hadc1);
voltage = (value * 3.3) /4096.5 ;
temp = voltage * 0.01;
HAL_ADC_Stop(&hadc1);
printf ("%f%f\n",temp , voltage); //
@suppress("Float formatting support")
HAL_Delay(500);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
Light (Decreasing or Dependent) Resistor : LDR-
یک مقاومت متغیر می باشد که با کم و زیاد شدن نور ,مقاومت دو سرش کم و زیاد
می شود .
نتابیدن نور = زیاد شدن مقاومت تابیده شدن نور = کم شدن مقاومت
یعنی به تایمر نمی گوییم 5ثانیه بشمار .به جای آن می گوییم با
فرکانس 1Hzو با فاصله زمانی بین هر شمارش 1msبرای ما
1000واحدشمارش انجام بده .که برابر می شود با 1s=1000ms
0تا 216 − 1می شمارد .مثال وقتی تا عدد 65535رسید ,این تایمر
سرریز می شود و مجددا مقدار 0می شود .و دوباره شروع می
کند به شمردن .در ساده ترین شکل ممکن اینتراپت داخلی روی
نقطه Over flowمی باشد .یعنی به حداکثر شمارش که می رسد
به ما اینتراپت می دهد .هرچه فرکانس شمارش بیشتر باشد .شیب
این خط بیشتر می شود و سریع تر Over flowمی شود .
-حال به سراغ برنامه نویسی می رویم .یک پروژه جدید با
میکروکنترلر STM32f103c8t6می سازیم .و سپس پایه
-در این مرحله می توانیم برای پایه ای که خروجی کرده ایم یک اسم
انتخاب بکنیم .شبیه کاری که در محیط کد نویسی با #define
می کردیم.
-برای این کار در قسمت پایین منوی GPIOبه سراغ قسمت user
labelرفته و اسم مورد نظرمان را می نویسیم و بینیم که در سمت
راست صفحه ,اسم پایه تغیر پیدا کرده .
1
-اکنون به سراغ تایمر می رویم .کل هسته مرکزی میکرو کنترلر با
یک فرکانس کار می کند .که اگر آن را یک موج مربعی در نظر
بگیریم.
که این موج نشانه زنده بودن میکروکنترلر می باشد .فرکانس تایمر
نمی تواند از فرکانس اصلی میکروکنترلر بیشتر باشد .فرکانس تایمر
باید مساوی یا یک ضریبی از فرکانس میکرو باشد .اکنون که
فرکانس میکروکنترلر ما 𝑧𝐻𝑀 8می باشد .فرکانس تایمر ما چگونه
محاسبه می شود ؟
-فرکانس تایمر ما یک رجیستر به اسم Prescalerدارد .که به
معنای تقسیم کننده فرکانسی می باشد .که اگر Prescaler
𝑜𝑟𝑐𝑖𝑚𝐹
می باشد . مساوی xباشد .فرکانس تایمر ما برابر
𝑥
1
2
3
حاال ما یک تایمر داریم که اگر دکمه استارت را بزنیم .هر 1sبه ما اینتراپت
می دهد.
-اکنون می خواهیم دو ledچشمک زن درست بکنیم .یکی با حلقه
whileو دیگری با . Timer
-ما در این برنامه نمی خواهیم که ledها به صورت سری چشمک بزنند.
می خواهیم که بهصورت همزمان چشمک بزنند.
19 17 15 13 11 9 7 5 3 1
20 18 16 14 12 10 8 6 4 2
2
اسم پایه شماره پایه * اسم پایه شماره پایه
NC 11 * TVCC 1
GND 12 * TVCC 2
TDO 13 * TRST 3
SWIM 14 * UART RX 4
RST
STM32 15 * TDI 5
RST
KEY 16 * UART TX 6
NC 17 * TMS 7
SWIO
GND 18 * BOOT 0 8
VDD 19 * TCK 9
3.3V SWCLK
GND 20 * SWIM 10
19 17 15 13 11 9 7 5 3 1
20 18 16 14 12 10 8 6 4 2
2
2 1
4 3
6 5
7
9
12 11
14 13
16 15
20
به کابل فلت متصل کرده ایم 19
-در این قسمت پروگرام کردن باید
فایل hexداشته باشیم .برای همین
کار در نرم افزار به قسمت
Projectو Propertiesرفته .
1
3
2
5
4
6
-سپس در صفحه Propertiesبه منوی C/C++ Buildرفته و
بر روی Settingکلید می کنیم ,در صفحه ای که باز می شود در
سربرگ Tool Settingبر روی MCU Post Build Outputs
کلید می کنیم .بعد از کلید کردن تعدادی گزینه برای ما نمایش
می دهد .ما