کنترل سرعت موتور DC توسط میکروکنترلر ARM
در این بخش دانلود پروژه کنترل دور موتور DC به کمک PWM توسط میکروکنترلر ARM, توسط تیم الکترونیک و برنامه نویسی الکترونیک ۹۸ برای شما علاقه مندان به پروژه های میکروکنترلر ARM با هدف آموزش برنامه نویسی و راه اندازی میکروکنترلرهای ARM آماده شده است. برای راه اندازی و کنترل سرعت موتورهای DC توسط میکروکنترلرها, معمولا بدلیل محدودیت جریان دهی پین ها از کلیدهای ترانزیستوری یا رله استفاده می شود.
نقشه شماتیک پروژه
نقشه شماتیک کنترل سرعت موتور DC توسط ترانزیستور
برای کنترل سرعت حرکت موتور DC روش های مختلفی وجود دارد که یکی از آن ها کنترل به روش PWM است. شکل زیر یک نمونه از اتصال موتور DC به میکروکنترلر AT91SAM7S را نشان می دهد. این مدار امکان روشن و خاموش نمودن موتور را فراهم می کند. کنترل دور موتور با روش و خاموش نمودن سریع و همچنین کنترل نسبت روشنی و خاموشی امکان پذیر است. سرعت موتور تقریبا معادل ولتاژ متوسط دو سر موتور می باشد و مقدار آن بر روی LCD کاراکتری تعبیه شده در مدار نشان داده می شود.
برنامه میکروکنترلر به زبان C در نرم افزار IAR Embedded Workbench IDE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
#include <Atmel/ioat91sam7s64.h> #include “keypad.h” #include “lcd.h” void main () { //——————–start up————————– AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // AT91C_WDTC_WDDIS=(1<<15) AT91C_BASE_RSTC->RSTC_RMR=0xA5000001; //——————–speed up————————– AT91C_BASE_CKGR->CKGR_MOR = 0xF01; AT91C_BASE_CKGR->CKGR_PLLR = 0x2903FFC; AT91C_BASE_PMC->PMC_MCKR = 0x3; AT91C_BASE_PMC->PMC_SCER = 0x1; //—————————————————– AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_PWMC); // AT91C_ID_PWMC=10 //—————————————————– unsigned char i,j; unsigned short speed,s; lcd_pininit (16,15,5,6,7,8,26,27,28,29); lcd_init (); keypad_pininit (5,6,7,8,17,18,19,20); keypad_init (1,2,3,10,4,5,6,11,7,8,9,12,13,0,14,15); lcd_gotoxy (0,0); lcd_putsf (“Speed = 0”); AT91C_BASE_PIOA->PIO_PDR = (1<<0); AT91C_BASE_PIOA->PIO_MDER = (1<<0); AT91C_BASE_PIOA->PIO_ASR = (1<<0); AT91C_BASE_PWMC_CH0->PWMC_CMR = 0x200; AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 3000; AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0; AT91C_BASE_PWMC->PWMC_DIS = 1; s=0; while(1) { i=16; while (i>11) i=keypad_key (); lcd_gotoxy (0,8); lcd_putsf (” “); lcd_gotoxy (0,8); speed = 0; j=0; while (i<10&j!=4) { speed=10*speed+i; lcd_puts(i); j++; i=16; while (i>11) i=keypad_key (); s=speed; } if (s>3000) s=3000; if (i==10) { AT91C_BASE_PWMC->PWMC_DIS = 1; AT91C_BASE_PWMC_CH0->PWMC_CUPDR = 3000-s; lcd_gotoxy (0,8); lcd_putsf (” “); lcd_gotoxy (0,8); lcd_puts(s); AT91C_BASE_PWMC->PWMC_ENA = 1; } if (i==11) { AT91C_BASE_PWMC->PWMC_DIS = 1; lcd_gotoxy (0,8); lcd_putsf (” “); lcd_gotoxy (0,8); lcd_putchar(‘0’); } } } |