51單片機實現四相步進電機控制實例

来源:http://www.cnblogs.com/hughdong/archive/2017/05/24/6899512.html
-Advertisement-
Play Games

工作原理見書《51單片機應用及原理——基於KeilC和Proteus,陳海宴》P178-180 ...


————————————————————————————————————————————

工作原理見書《51單片機應用及原理——基於KeilC和Proteus,陳海宴》P178-180

————————————————————————————————————————————

步進電機控制應用實例

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

設計要求:

  • 採用定時中斷方式控制步進機的轉速,定時單位時長為10ms
  • 速度設置在1/2/3/4四個檔位,1檔最快,依次遞減,能夠控制步進電機的停、轉和方向,同時顯示步進機的當前檔位。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

設計思路:

  • 通過P1控制步進電機的轉動,P1.0->aP1.1->bP1.2->cP1.3->d,ULN2003A作為步進電機驅動
  • P2.0-P2.3對應數位管顯示(使用7447晶元對應將BCD碼轉換成7LED數位管),通過7447簡單驅動數位管(P2只需要發送1/2/3/4即可)
  • 通過定時器計數,到達設定值時步進電機轉動1/4圈,計數清零

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

元件清單:

  • AT89C51
  • BUTTON
  • MOTOR-STEPPER
  • RESPACK-8
  • 7SEG-COM-ANODE
  • ULN2003A
  • 7447

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

實現代碼:

  1 #include <reg52.h>
  2 typedef unsigned char uchar;
  3 uchar direction = 0;  //0為正轉,1為反轉
  4 uchar onoff = 0; //關為0,開為1
  5 uchar n = 0; //每次定時器中斷觸發時n++,當n==max時電機轉動1/4
  6 uchar max = 10;
  7 uchar index = 0; //通過index指示電機轉動,AB,BC,CD,DA
  8 sbit LED = P3 ^ 7; //當n==max時LED閃爍提示
  9 int main()
 10 {
 11     /* LED */
 12     P2 = 0xff;
 13     /* 初始化中斷 */
 14     EA = 1;
 15     EX0 = 1; //要用到的中斷是兩個外部中斷和定時器中斷0
 16     IT0 = 1;
 17     EX1 = 1;
 18     IT1 = 1;
 19     ET0 = 1;
 20     /* 定時器0 */
 21     TMOD = 0x01; //使用定時器0,方式1
 22     TH0 = (65536 - 10000) / 256; //12MHz晶振下,定時器為10ms觸發中斷,更方便觀察轉動情況
 23     TL0 = (65536 - 10000) % 256;
 24     TR0 = 1;
 25     while(1)
 26     {
 27         switch(P0)
 28         {
 29         case 0xfe: //11111110
 30             max = 1;
 31             P2 = 1;
 32             break;
 33         case 0xfd: //11111101
 34             max = 10;
 35             P2 = 2;
 36             break;
 37         case 0xfb: //11111011
 38             max = 50;
 39             P2 = 3;
 40             break;
 41         case 0xf7: //11110111
 42             max = 100;
 43             P2 = 4;
 44             break;
 45         }
 46     }
 47 }
 48 void Stop()interrupt 0
 49 {
 50     onoff++;
 51     if (onoff > 1)
 52         onoff = 0;
 53 }
 54 void int1()interrupt 2
 55 {
 56     direction++;
 57     if (direction > 1)
 58         direction = 0;
 59 }
 60 void delay50ms(void)
 61 {
 62     unsigned char a, b;
 63     for(b = 173; b > 0; b--)
 64         for(a = 143; a > 0; a--);
 65 }
 66 void time()interrupt 1
 67 {
 68     TH0 = (65536 - 10000) / 256;
 69     TL0 = (65536 - 10000) % 256;
 70     if (onoff == 1) //在開狀態下
 71     {
 72         if (n == max) //設定檔位速度,經過了max次中斷後,步進電機轉1/4圈
 73         {
 74             LED = 0; //每次n==max時LED閃爍
 75             delay50ms();
 76             LED = 1;
 77             if (direction == 0)
 78             {
 79                 switch(index) //正轉時以AB,BC,CD,DA順序
 80                 {
 81                 case 0:P1 = 0x03;break; //00000011 AB高電平
 82                 case 1:P1 = 0x06;break; //00000110 BC高電平
 83                 case 2:P1 = 0x0c;break; //00001100 CD高電平
 84                 case 3:P1 = 0x09;break; //00001001 DA高電平
 85                 }
 86                 index ++; 
 87                 if (index == 4) //步進電機轉完一圈時index清零
 88                     index = 0;
 89                 n = 0; //到達max,n重置為0
 90             }
 91             if (direction == 1)
 92             {
 93                 switch(index) //反轉時以DA,CD,BC,AB順序
 94                 {
 95                 case 0:P1 = 0x09;break;
 96                 case 1:P1 = 0x0c;break;
 97                 case 2:P1 = 0x06;break;
 98                 case 3:P1 = 0x03;break;
 99                 }
100                 index ++;
101                 if (index == 4)
102                     index = 0;
103                 n = 0;
104             }
105             else n = 0;
106         }
107         n++; //n!=max時,n++
108     }
109     else n = 0; //在關狀態下,n始終為0,無法觸發電機轉動
110 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 導出: 結束!!! ...
  • 怎樣查看MySql資料庫物理文件存放位置? 使用命令行查找: show global variables like '%datadir%'; 我查找的位置:C:\ProgramData\MySQL\MySQL Server 5.7\Data\ 修改預設保存的位置: 在C:\ProgramData\M ...
  • 1.Mysql中可用存儲過程和函數來實現複雜邏輯處理,兩者的對比如下:存儲過程作為可執行文件,編譯一次放在資料庫中,函數又返回值。可設定使用許可權。 存儲過程中可使用游標,聲明變數。用call調用。 2.Hive可用udf(user defined function)來實現複雜邏輯處理 編輯Pytho... ...
  • 1. 安裝前的準備 1.1 硬體要求 無特殊需求(根據Hadoop各個組件需求及實際情況,一般建議單個集群的機器數量在3台及以上:1台Master結點,2台機器作為Slave結點)。 1.2 軟體要求 1.2.1 操作系統 僅支持如下操作系統: Red Hat Enterprise Linux (R ...
  • ———————————————————————————————————————————— PWM(脈衝寬度調製) 對模擬信號電平進行數字編碼的方法 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...
  • Ubuntu目錄 / /bin /sbin /boot /etc /mnt /home d :directory - :file b :block 磁碟以塊進行 l :link Ubuntu許可權 User Group Other r :read w :write x :execute - :none ...
  • xx-net在ubuntu上運行用起來很方便,如果有一些原因必須用CentOS,麻煩就比較大了。 首先需要升級python版本,CentOS自帶的2.6版本是用不了的,必須升級到2.7以上,但是不能用python3,yum可能升不到2.7,所以只能去官網下載源碼編譯安裝。yum本身依賴python, ...
  • 概述 iptables是linux自帶的防火牆軟體,用於配置IPv4數據包過濾或NAT(IPv6用ip6tables)。 在linux上,防火牆其實是系統內核的一部分,基於Netfilter構架,基本原理就是在內核網路層數據包流經的不同位置放置一些鉤子(hook),利用這些嵌入網路層的hook來對數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...