Báo cáo bài tập lớn Đo và điều khiển tốc độ động cơ dùng vi điều khiển 8051

Ngày nay trong mọi lĩnh vực khoa học kỹ thuật luôn xuất hiện khái niệm Kỹ thuật số vi xử lý và điều khiển, với sự trợ giúp của máy tính kỹ thuật vi xử lý và điều khiển đã có sự phát triển ạnh mẽ đặc biệt là sự phát triển nhanh chóng của các họ vi xử lý và điều khiển với những tính năng mới. Để phục vụ tốt cho môn học “Đo lường vµ ®iÒu khiÓn tự động” chúng em thực hiện đề tài: Đo và Điều khiển Tốc Độ Động Cơ với mục đích tích luỹ kiến thức đặc biệt là những kinh nghiệm trong quá trình lắp mạch thực tế song do thời gian và kiến thức có hạn, nên mạch thiết kế còn nhiều thiếu sót. Chúng em rất mong nhận được sự góp ý của các thầy cô để có thể nâng cao chất lượng của bài thiết kế, chúng em xin chân thành cảm ơn !

doc44 trang | Chia sẻ: ngtr9097 | Lượt xem: 2551 | Lượt tải: 2download
Bạn đang xem trước 20 trang tài liệu Báo cáo bài tập lớn Đo và điều khiển tốc độ động cơ dùng vi điều khiển 8051, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Mục Lục I. Giới thiệu chung 1. Mở Đầu ………………………………………………………………….. 2 . Giớithiệu đề tài ,môc dÝch……………………………………………... 3. Giới thiệu thành viên trong nhóm ………………………………………. 4. §Þnh h­íng thiÕt kÕ …………………………………………….…………… 5. Các bước thực hiện ……………………………………………………… 6. M« pháng ………………………………………………………… II . Lý thuyết thực hiện Cơ sơ lý thuyết ……………………………………………………………. Sơđồ nguyên lý ……………………………………………………………. Phân tích chức năng từng khối ……………………………………………. Giới thiệu linh kiện chính ………………………………………………… Vi điều kiển AT89C51 ………………………………………………….. III. Phần mềm thực hiện hệ thống……………………………………………… IV. Thiết kế mạch……………………………………………………………… V.§¸nh gi¸ sai sè ………………………………………………………… VI.Xu h­íng ph¸t triÓn ………………………………………………………… VII. Kết Luận…………………………………………………………………. VIII. Tài liệu tham khảo……………………………………………………….. B¸O C¸O BµI TËP LíN Đo và điều khiển tốc độ động cơ dùng vi điều khiển 8051 I.Giới thiệu chung: 1.Mở ®ầu: Ngày nay trong mọi lĩnh vực khoa học kỹ thuật luôn xuất hiện khái niệm Kỹ thuật số vi xử lý và điều khiển, với sự trợ giúp của máy tính kỹ thuật vi xử lý và điều khiển đã có sự phát triển ạnh mẽ đặc biệt là sự phát triển nhanh chóng của các họ vi xử lý và điều khiển với những tính năng mới. Để phục vụ tốt cho môn học “Đo lường vµ ®iÒu khiÓn tự động” chúng em thực hiện đề tài: Đo và Điều khiển Tốc Độ Động Cơ với mục đích tích luỹ kiến thức đặc biệt là những kinh nghiệm trong quá trình lắp mạch thực tế song do thời gian và kiến thức có hạn, nên mạch thiết kế còn nhiều thiếu sót. Chúng em rất mong nhận được sự góp ý của các thầy cô để có thể nâng cao chất lượng của bài thiết kế, chúng em xin chân thành cảm ơn ! 2. Đề tài : §o vµ ®iÒu khiÓn tèc ®é ®éng c¬ mét chiÒu lo¹i nhá 3. Nhóm sinh viên thực hiện: Nhãm thùc hiÖn: Gåm 3 thµnh viªn chÝnh ®­îc ph©n c«ng c«ng viÖc cô thÓ 4.§Þnh h­íng thiÕt kÕ: ThiÕt kÕ mét hÖ vi xö lý bao gåm c¶ viÖc thiÕt kÕ tæ chøc phÇn cøng vµ viÕt phÇn mÒm cho nÒn phÇn cøng mµ ta thiÕt kÕ. ViÖc xem xÐt gi÷a tæ chøc phÇn cøng vµ ch­¬ng tr×nh phÇn mÒm cho mét thiÕt kÕ lµ mét vÊn ®Ò cÇn ph¶i c©n nh¾c. V× khi tæ chøc phÇn cøng cµng phøc t¹p, cµng cã nhiÒu chøc n¨ng hç trî cho yªu cÇu thiÕt kÕ th× phÇn mÒm cµng ®­îc gi¶m bít vµ dÔ dµng thùc hiÖn nh­ng l¹i ®Èy cao gi¸ thµnh chi phÝ cho phÇn cøng, còng nh­ chi phÝ b¶o tr×. Ng­îc l¹i víi mét phÇn cøng tèi thiÓu l¹i yªu cÇu mét ch­¬ng tr×nh phÇn mÒm phøc t¹p h¬n, hoµn thiÖn h¬n; nh­ng l¹i cho phÐp b¶o tr× hÖ thèng dÔ dµng h¬n còng nh­ viÖc ph¸t triÓn tÝnh n¨ng cña hÖ thèng tõ ®ã cã thÓ ®­a ra gi¸ c¹nh tranh ®­îc. Tõ yªu cÇu vµ nhËn ®Þnh trªn ta cã nh÷ng ®Þnh h­íng s¬ bé cho thiÕt kÕ nh­ sau: Chän bé vi xö lý. Tõ yªu cÇu dïng VXL 8 bit ta dù kiÕn dïng c¸c chip vi ®iÒu khiÓn thuéc hä MCS-51 cña Intel, mµ cô thÓ ë ®©y lµ dïng chip 8051 v× nh÷ng lý do sau: + Thø nhÊt 8051 thuéc hä MCS-51, lµ chip vi ®iÒu khiÓn. §Æc ®iÓm cña c¸c chip vi ®iÒu khiÓn nãi chung lµ nã ®­îc tÝch hîp víi ®Çy ®ñ chøc n¨ng cña mét hÖ VXL nhá, rÊt thÝch hîp víi nh÷ng thiÕt kÕ h­íng ®iÒu khiÓn. Tøc lµ trong nã bao gåm: m¹ch VXL, bé nhí ch­¬ng tr×nh vµ d÷ liÖu, bé ®Õm, bé t¹o xung, c¸c cæng vµo/ra nèi tiÕp vµ song song, m¹ch ®iÒu khiÓn ng¾t( + Thø hai lµ, vi ®iÒu khiÓn 8051 cïng víi c¸c hä vi ®iÒu khiÓn kh¸c nãi chung trong nh÷ng n¨m gÇn ®©y ®­îc ph¸t triÓn theo c¸c h­íng sau: Gi¶m nhá dßng tiªu thô. T¨ng tèc ®é lµm viÖc hay tÇn sè xung nhÞp cña CPU . Gi¶m ®iÖp ¸p nguån nu«i. Cã thÓ më réng nhiÒu chøc n¨ng trªn chip, më réng cho c¸c thiÕt kÕ lín. Nh÷ng ®Æc ®iÓm ®ã dÉn ®Õn ®¹t ®­îc hai tÝnh n¨ng quan träng lµ: gi¶m c«ng suÊt tiªu thô vµ cho phÐp ®iÒu khiÓn thêi gian thùc nªn vÒ mÆt øng dông nã rÊt thÝch hîp víi c¸c thiÕt kÕ h­íng ®iÒu khiÓn. + Thø ba lµ, vi ®iÒu khiÓn thuéc hä MCS-51 ®­îc hç trî mét tËp lÖnh phong phó nªn cho phÐp nhiÒu kh¶ n¨ng mÒm dÎo trong vÊn ®Ò viÕt ch­¬ng tr×nh phÇn mÒm ®iÒu khiÓn. + Cuèi cïng lµ, c¸c chip thuéc hä MCS-51 hiÖn ®­îc sö dông phæ biÕn vµ ®­îc coi lµ chuÈn c«ng nghiÖp cho c¸c thiÕt kÕ kh¶ dông. MÆt kh¸c, qua viÖc kh¶o s¸t thÞ tr­êng linh kiÖn viÖc cã ®­îc chip 8051 lµ dÔ dµng nªn më ra kh¶ n¨ng thiÕt kÕ thùc tÕ. V× nh÷ng lý do trªn mµ viÖc lùa chän vi ®iÒu khiÓn 8051 lµ mét gi¶i ph¸p hoµn toµn phï hîp cho thiÕt kÕ. 4 .Phương án thực hiện : 4.1. Dùng cặp cảm biến thu phát đặt đối diện để xác định số vòng quay trong một khoảng thời gian nhất định . Động cơ có gắn một đĩa quay có một khe thủng trên đĩa ,mỗI khi khe này quay qua cặp cảm biến hồng ngoạt thu phát sẽ tạo ra một đột biến xung trong một vòng quay. 4.2. Sử dụng cảm biến phát và đồng thời thu tín hiệu phản xạ ngược trở bằng cách vạch một số điểm trên trục của động cơ . 4.3. Họ vi điều khiển AT89C51 có 32 đường xuất nhập dữ liệu : P0 ,P1 , P2, P3 mỗI Port 8 bit vì vậy phương án đặt ra sử dụng toàn bộ 8 bit P*.0 - P*.7 để xuất ra LED 7 thanh CA hoặc chỉ sử dụng mỗI Port 4bit sau đó giảI mã bằng 74LS47.Như vậy sẽ phảI sử dụng LCD để hiển thị tốc độ động cơ . 4.4. Sử dụng màn hình LCD để hiển thị . 5. Các bước thực hiện : Sau khi nhận đồ án nhóm em đã đưa ra một số bước sau để thực hiện công việc: 1.Nhập số vào LCD theo đúng trình tự hàng trăm hàng chục hàng đơn vị .Đo tốc độ của các động cơ loại nhỏ (loại một chiều hoặc xoay chiều),có gắn cánh quạt (số lượng cánh là xác định ). 2. Thực hiện việc đo tốc độ thông qua số vòng quay của cánh quạt bằng cách sử dụng mạch sensor thu phát hồng ngoại. 3.Việc hiển thị thực hiện thông qua LCD (đo tốc độ trong một khoảng thời gian phù hợp).Có một khoảng thời gian để quan sát giá trị của tốc độ. 4.ViÖc ®o ®éng c¬ ta ®iÒu chØnh sao cho tèc ®é cña ®éng c¬ lu«n æn ®Þnh ë mét ng­ìng nhÊt ®Þnh .NghÜa lµ tèc ®é cña ®éng c¬ lu«n cã mét sai sè trong giíi h¹n .trong bµi nµy chóng em ®iÒu chØnh cho sai sè cña ®éng c¬ trong kho¶ng 2%. 6.M« pháng a.PhÇn code // Mo PhongDlg.cpp : implementation file // #include "stdafx.h" #include "Mo Phong.h" #include "Mo PhongDlg.h" #include"math.h" #include "stdlib.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMoPhongDlg dialog CMoPhongDlg::CMoPhongDlg(CWnd* pParent /*=NULL*/) : CDialog(CMoPhongDlg::IDD, pParent) { //{{AFX_DATA_INIT(CMoPhongDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMoPhongDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMoPhongDlg) DDX_Control(pDX, IDC_LED1, m_led1); DDX_Control(pDX, IDC_LED10, m_led10); DDX_Control(pDX, IDC_LED2, m_led2); DDX_Control(pDX, IDC_LED3, m_led3); DDX_Control(pDX, IDC_LED4, m_led4); DDX_Control(pDX, IDC_LED5, m_led5); DDX_Control(pDX, IDC_LED6, m_led6); DDX_Control(pDX, IDC_LED7, m_led7); DDX_Control(pDX, IDC_LED8, m_led8); DDX_Control(pDX, IDC_LED9, m_led9); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CMoPhongDlg, CDialog) //{{AFX_MSG_MAP(CMoPhongDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_HANGCHUC, OnHangchuc) ON_BN_CLICKED(IDC_HANGDONVI, OnHangdonvi) ON_BN_CLICKED(IDC_HANGNGHIN, OnHangnghin) ON_BN_CLICKED(IDC_HANGTRAM, OnHangtram) ON_BN_CLICKED(IDC_HANGVAN, OnHangvan) ON_BN_CLICKED(IDC_PAUSE, OnPause) ON_BN_CLICKED(IDC_RESET, OnReset) ON_BN_CLICKED(IDC_REVERSE, OnReverse) ON_WM_TIMER() ON_BN_CLICKED(IDC_START, OnStart) ON_WM_DESTROY() ON_BN_CLICKED(IDC_BUTTON1, OnButton1) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMoPhongDlg message handlers BOOL CMoPhongDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here m_1=0; m_2=m_3=m_4=m_5=m_6=m_7=m_8=m_9=m_10=0; m_led1.SetWindowText("0"); m_led2.SetWindowText("0"); m_led3.SetWindowText("0"); m_led4.SetWindowText("0"); m_led5.SetWindowText("0"); m_led6.SetWindowText("0"); m_led7.SetWindowText("0"); m_led8.SetWindowText("0"); m_led9.SetWindowText("0"); m_led10.SetWindowText("0"); m_degree=0; temp=TRUE; t=0; // m_vong=0; return TRUE; // return TRUE unless you set the focus to a control } void CMoPhongDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CMoPhongDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CClientDC pDC(this); OnDraw(&pDC); CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CMoPhongDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CMoPhongDlg::OnHangchuc() { if(m_4==9) m_4=0; else m_4++; CString s; s.Format("%d",m_4); m_led4.SetWindowText(s); m_vong=m_1*10000+m_2*1000+m_3*100+m_4*10+m_5; } void CMoPhongDlg::OnHangdonvi() { if(m_5==9) m_5=0; else m_5++; CString s; s.Format("%d",m_5); m_led5.SetWindowText(s); m_vong=m_1*10000+m_2*1000+m_3*100+m_4*10+m_5; } void CMoPhongDlg::OnHangnghin() { if(m_2==9) m_2=0; else m_2++; CString s; s.Format("%d",m_2); m_led2.SetWindowText(s); m_vong=m_1*10000+m_2*1000+m_3*100+m_4*10+m_5; } void CMoPhongDlg::OnHangtram() { if(m_3==9) m_3=0; else m_3++; CString s; s.Format("%d",m_3); m_led3.SetWindowText(s); m_vong=m_1*10000+m_2*1000+m_3*100+m_4*10+m_5; } void CMoPhongDlg::OnHangvan() { if(m_1==9) m_1=0; else m_1++; CString s; s.Format("%d",m_1); m_led1.SetWindowText(s); m_vong=m_1*10000+m_2*1000+m_3*100+m_4*10+m_5; } void CMoPhongDlg::OnPause() { KillTimer(1); } void CMoPhongDlg::OnReset() { m_1=m_2=m_3=m_4=m_5=m_6=m_7=m_8=m_9=m_10=0; // thiet lap ve khong m_led1.SetWindowText("0"); m_led2.SetWindowText("0"); m_led3.SetWindowText("0"); m_led4.SetWindowText("0"); m_led5.SetWindowText("0"); m_led6.SetWindowText("0"); m_led7.SetWindowText("0"); m_led8.SetWindowText("0"); m_led9.SetWindowText("0"); m_led10.SetWindowText("0"); KillTimer(1); } void CMoPhongDlg::OnReverse() { if(temp==TRUE) temp=FALSE; else { temp=TRUE; } } void CMoPhongDlg::OnDraw(CDC *pDC) { CRect rectWin; GetWindowRect(rectWin); rectWin.top+=32; CWnd*pWnd=GetDlgItem(IDC_DISPLAY); CRect rectD; pWnd->GetWindowRect(rectD); int cx,cy; cx=rectD.CenterPoint().x; cy=rectD.CenterPoint().y; cx-=rectWin.left; cy-=rectWin.top; CBrush brush(RGB(0,255,0)); CBrush * oldBrush=pDC->SelectObject(&brush); CPen *pen=new CPen(PS_SOLID,1,RGB(0,0,255)); CPen*oldPen =pDC->SelectObject(pen); pDC->Ellipse(cx-50,cy-50,cx+50,cy+50); CPen*pen1=new CPen(PS_SOLID,3,RGB(255,0,0)); CPen*oldPen1 =pDC->SelectObject(pen1); double angle; angle =m_degree*3*3.14/180; pDC->MoveTo(cx,cy); pDC->LineTo(cx+(int)(50*sin(angle)),cy-(int)(50*cos(angle))); angle+=3.14/3; pDC->MoveTo(cx,cy); pDC->LineTo(cx+(int)(50*sin(angle)),cy-(int)(50*cos(angle))); angle+=3.14/3; pDC->MoveTo(cx,cy); pDC->LineTo(cx+(int)(50*sin(angle)),cy-(int)(50*cos(angle))); angle+=3.14/3; pDC->MoveTo(cx,cy); pDC->LineTo(cx+(int)(50*sin(angle)),cy-(int)(50*cos(angle))); angle+=3.14/3; pDC->MoveTo(cx,cy); pDC->LineTo(cx+(int)(50*sin(angle)),cy-(int)(50*cos(angle))); angle+=3.14/3; pDC->MoveTo(cx,cy); pDC->LineTo(cx+(int)(50*sin(angle)),cy-(int)(50*cos(angle))); pDC->MoveTo(cx,cy); pDC->LineTo(cx+(int)(50*sin(angle)),cy-(int)(50*cos(angle))); pDC->SelectObject(oldBrush); pDC->SelectObject(oldPen); pDC->SelectObject(oldPen1); } void CMoPhongDlg::OnTimer(UINT nIDEvent) { if(temp==TRUE) { m_degree++; if(m_degree>=120) m_degree=0; } else { m_degree--; if(m_degree<=0) m_degree=120; } if(m_10<9) m_10++; else { m_10=0; if(m_9<9) m_9++; else { m_9=0; if(m_8<9) m_8++; else { m_8=0; if(m_7<9) m_7++; else { m_7=0; if(m_6<9) m_6++; else MessageBox("Tran So","Warning",MB_OK); } } } } t++; if(t==100) { t=0; CString s6,s7,s8,s9,s10; s6.Format("%d",m_1); s7.Format("%d",m_2); s8.Format("%d",m_3); s9.Format("%d",m_4); if(m_5<=2) s10.Format("%d",m_5+1); else if((m_5>2)&&(m_5<5)) s10.Format("%d",m_5-1); else if(m_5==5||m_5==7) s10.Format("%d",m_5); else if((m_5>5)&&m_5<7) s10.Format("%d",m_5+1); else s10.Format("%d",m_5-1); m_led6.SetWindowText(s6); m_led7.SetWindowText(s7); m_led8.SetWindowText(s8); m_led9.SetWindowText(s9); m_led10.SetWindowText(s10); } CClientDC pDC(this); OnDraw(&pDC); CDialog::OnTimer(nIDEvent); } void CMoPhongDlg::OnStart() { UpdateData(TRUE); SetTimer(1,(int)(1000/m_vong),NULL); } CScrollBar* CMoPhongDlg::GetScrollBarCtrl(int nBar) const { // TODO: Add your specialized code here and/or call the base class return CDialog::GetScrollBarCtrl(nBar); } void CMoPhongDlg::OnDestroy() { CDialog::OnDestroy(); KillTimer(1); } void CMoPhongDlg::OnButton1() { OnOK(); } b. PhÇn giao diÖn II. Lý Thuyết thực hiện. Cơ sở lý thuyết. Sơ đồ khối  Sơ đồ nguyên lý.  III.Phân tích chức năng từng khối. a .Khối vi xử lý b. Khối hiển thị. c.Khối nhập giá trị tốc độ. d.Khối đo tốc độ động cơ. e.Khối động lực g.Khèi nguån h.Khèi ®éng c¬ IV.Giới thiệu linh kiện sử dụng trong mạch: 1 - IC khuếch đại LM324 2 - Vi điều khiển 80c52 3 – LCD. ,74HC14,®iÖn trë quang…. 4 - Một số linh kiện phụ khc: thạch anh 12 Mhz, sensor thu phát hồng ngoại, tụ 33p, tụ 10 uF, trở... 5 - Môtơ điện một chiều DC 12V V .Mô tả các modul 1.Khối vi xử lý Điều khiển tốc độ động cơ: Giới thiệu: Mục đích của điều khiển tốc độ động cơ là đưa ra tín hiệu biểu diễn tốc độ yêu cầu, và điều khiển động cơ theo tốc độ đấy. Bộ điều khiển có thể có hoặc không thật sự đo tốc độ động cơ. Nếu có thì goi là điều khiển tốc độ có phản hồi hoặc điều khiển tốc độ vòng kín, nếu không thì gọi là điều khiển tốc độ vòng mở. Điều khiển tốc độ có phản hồi tốt hơn nhưng phức tạp hơn. Động cơ có rất nhiều kiểu, và đầu ra của bộ điều khiển tốc độ của động cơ với các dạng khác nhau là khác nhau. Lý thuyết điều khiển tốc độ động cơ một chiều: Tốc độ của động cơ một chiều tỉ lệ trực tiếp với nguồn cấp, vì vậy nếu ta giảm điện áp cung cấp từ 12V xuống 6V, động cơ sẽ chạy với tốc độ bằng một nửa trước đó. Bộ điều khiển tốc độ động cơ làm việc trên nguyên lý biến đổi điện áp trung bình cấp cho động cơ. Có thể đơn giản chỉ bằng cách điều chỉnh điện áp cung cấp, nhưng như thế sẽ không hiệu quả. Cách tốt hơn là tắt nguồn cấp cho động cơ thật nhanh. Nếu động tác tắt này đủ nhanh thì động cơ không kịp nhận ra sự thay đổi đó mà chỉ nhận ra được hiệu ứng trung bình thôi. Khi bật, nguồn có giá trị 12V; khi tắt, nguồn có giá trị 0V. Nếu ta tắt nguồn với một lượng thời gian bằng với khi nó được bật thì động cơ sẽ nhận được giá trị trung bình là 6V, và sẽ chạy chậm đi theo tỉ lệ đó. Chuyển mạch để bật tắt nguồn này gọi là on-off switching, được chế tạo bằng MOSFET. Ta dùng vi xử lý 8051. Nh÷ng tÝnh chÊt ®Æc tr­ng cña hä vi ®iÒu khiÓn MCS-51: * §¬n vÞ xö lý trung t©m (CPU) 8 bit ®· ®­îc tèi ­u ho¸ ®Ó ®¸p øng c¸c chøc n¨ng ®iÒu khiÓn . * Khèi l«gic (ALU) xö lý theo bit nªn thuËn tiÖn cho c¸c phÐp to¸n logic Boolean. * Bé t¹o dao ®éng gi÷ nhÞp ®­îc tÝch hîp bªn trong víi tÇn sè 12MHz. * Giao diÖn nèi tiÕp cã kh¶ n¨ng ho¹t ®éng song song, ®ång bé. * C¸c cæng vµo/ra hai h­íng vµ tõng ®­êng dÉn cã thÓ ®­îc ®Þnh ®Þa chØ mét c¸ch t¸ch biÖt. * Cã n¨m hay s¸u nguån ng¾t víi hai møc ­u tiªn . * Hai hoÆc ba bé ®Õm ®Þnh thêi 16 bit. * Bus vµ khèi ®Þnh thêi t­¬ng thÝch víi c¸c khèi ngo¹i vi cña bé vi xö lý 8085/8088. * Dung l­îng cña bé nhí ch­¬ng tr×nh (ROM) bªn ngoµi cã thÓ lªn tíi 64 kbyte. * Dung l­îng cña bé nhí d÷ liÖu (RAM) bªn ngoµi cã thÓ lªn tíi 64 kbyte. * Dung l­îng cña bé nhí ROM bªn trong cã thÓ lªn ®Õn 8 kbyte. * Dung l­îng bé nhí RAM bªn trong cã thÓ ®¹t ®Õn 256 byte. * TËp lÖnh phong phó. 2.1. CÊu tróc chung : 2.1.1. S¬ ®å khèi : S¬ ®å khèi tæng qu¸t cña mét vi ®iÒu khiÓn 8051 cã thÓ ®­îc m« t¶ nh­ sau: Chøc n¨ng cña tõng khèi : * Khèi xö lý trung t©m CPU: PhÇn chÝnh cña bé vi xö lý lµ khèi xö lý trung t©m (CPU=Central Processing Unit ), khèi nµy cã chøa c¸c thµnh phÇn chÝnh : +Thanh ghi tÝch luü (ký hiÖu lµ A ); +Thanh ghi tÝch luü phô (ký hiÖu lµ B ) th­êng ®­îc dïng cho phÐp nh©n vµ phÐp chia ; +Khèi logic sè häc (ALU=Arithmetic Logical Unit) ; +Tõ tr¹ng th¸i ch­¬ng tr×nh (PSW= Program Status Word ); +Bèn b¨ng thanh ghi . +Con trá ng¨n xÕp (SP=Stack Point) còng nh­ con trá d÷ liÖu ®Ó ®Þnh ®Þa chØ cho bé nhí d÷ liÖu ë bªn ngoµi; Ngoµi ra, khèi xö lý trung t©m cßn chøa: -Thanh ghi ®Õm ch­¬ng tr×nh (PC= Progam Counter ); -Bé gi¶i m· lÖnh; -Bé ®iÒu khiÓn thêi gian vµ logic; Sau khi ®­îc Reset, CPU b¾t ®Çu lµm viÖc t¹i ®Þa chØ 0000h, lµ ®Þa chØ ®Çu ®­îc ghi trong thanh ghi chøa ch­¬ng tr×nh (PC) vµ sau ®ã, thanh ghi nµy sÏ t¨ng lªn 1 ®¬n vÞ vµ chØ ®Õn c¸c lÖnh tiÕp theo cña ch­¬ng tr×nh. *Bé t¹o dao ®éng