久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 30642|回復: 11
打印 上一主題 下一主題
收起左側

單片機直流電機的pwm調速與控制設計

  [復制鏈接]
跳轉到指定樓層
樓主
ID:609796 發表于 2019-9-10 08:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

設計一個直流伺服電機電機控制系統,控制功能要求實現電機的啟動、停止控制、正轉、反轉、加速、減速共六種功能,為了能實現人機交互,需要用到按鍵和數碼管。

具體要求如下:K0為啟動/停止控制、K1正轉、K2反轉;K3加速,K4減速,用3個發光二極管顯示狀態:正轉時紅燈亮,反轉時黃燈亮,不轉時綠燈亮。并利用4位LED數碼管顯示電機轉速。

要求分析:

按鍵K1用來控制電機反轉,若電機正在停止或正轉狀態,當按下k1時,電機開始反轉;若電機處于反轉狀態,電機不響應按鍵命令。

按鍵K2用來控制電機正轉,若電機正在停止或反轉狀態,當按下k2時,電機開始正轉;若電機處于正轉狀態,電機不響應按鍵命令。

按鍵K3用來控制電機加速,當電機處于運行狀態時,如果電機尚未達到最大轉速,當按下按鍵K3時,電機會加速,每按一次,電機加速一個節拍,若需要一直加速,則需要多次按下按鍵K3,當電機到達最大速度時,電機將保持在最大速度運行,不再響應按鍵命令。

按鍵K4用來控制電機減速,當電機處于運行狀態時,如果電機尚未達到最小轉速,即停止狀態,當按下按鍵K4時,電機會減速,每按一次,電機減速一個節拍,若需要一直減速,則需要多次按下按鍵K4,當電機到達最小速度時,即電機處于停止狀態,電機將保持停止,不再響應按鍵命令。

為了知道電機是否按控制要求工作,需要知道電機的轉速,這里用到了4位數碼管來顯示,最高位顯示轉動方向,正轉顯示“0”,反轉顯示“-”。后3位用來顯示轉速的數值大小。

此外,設置三個發光二極管,來顯示電機的運行狀態。當電機停止時,綠燈亮,當電機正轉時,紅燈亮,當電機反轉時,黃燈亮。

2. 控制方案設計

因為直流電機的工作電壓和電流與控制電路的電壓和電流不匹配,所以需要設計接口電路,用來把控制電路的指令轉化為電機的工作信號,這種接口電路稱為直流電機的驅動電路。直流電機的驅動電路有多種不同的設計方案,這里著重介紹了用分立元件構成的驅動電路和用集成芯片構成的驅動電路。

2.1用分立元件構成直流電機的驅動電路

利用晶體管,電阻等分立元件,來組成直流電機的全橋驅動電路。因為電機的工作電流較大,而一個三極管的電流放大能力有限,所以采用達林頓組成全橋(H橋)驅動電路控制電機,以滿足電機工作的需要。如圖1所示。圖中的Q1~Q4是功率三極管,其中Q1和Q2組成一個橋臂,其中Q3和Q4組成一個橋臂。每個功率三極管旁邊有一個續流二極管。當Q1和Q4打開時,直流電機的控制電流從A流向B,此時直流電機正轉;當Q2和Q3打開時,直流電機的控制電流從B流向A,此時直流電機反轉。這樣,通過Q1~Q4的控制就可以控制直流電機的轉向了。

1 直流電機全橋控制原理圖

2.2用電機驅動芯片來構成直流電機的驅動電路

這里所用的驅動芯片是L298,L298起到方大電流的作用。L298有4路輸入,4路輸出,2個使能端。用L298構成的驅動電路如圖2所示。

其工作原理為:L298芯片中,IN1對應OU1,IN2對應OUT2,IN3對應OU3,IN4對應OUT4,使能端ENA對應IN1和IN2,使能端ENB對應IN3和IN4。在使能端為高電平的狀態下,當IN1輸入高電平IN2輸入低電平時,電機正轉,當IN1輸入低電平IN2輸入高電平時,電機反轉,當IN1和IN2輸入電平相等時,電機不轉。如果使能端為低電平,那么電機不受控制,而處于停止狀態。

2直流電機驅動電路圖

L298的工作電壓范圍在7V~50V之間,輸出電流可達2A,能夠滿足直流電機的控制需要。

2.3.方案選擇

以上所給的兩種直流電機的驅動方案都能滿足要求,現在來對它們進行分析比較,選出合適的方案。

用分立元件構成的直流電機驅動電路,其優點是:電路由分立元件組成,通過分析電路,能直觀的了解驅動電路的工作原理,對于理論學習是非常有幫助的。其缺點是:電路過于復雜,在制作實物時容易出錯,另一方面,分立元件過多,其可靠性很難保證。

用集成芯片構成的直流電機驅動電路,其優點是,電路簡單,元件減少,電路的可靠性高,制作實物時相對較容易。其缺點是,對于初學者很難知道期內的工作原理,只能簡單的用。

通過上面的分析,我決定選用集成芯片L298來構成直流電機的驅動電路,這樣實現起來較為容易。

2.4.總體方案設計

控制系統的核心控制芯片是AT89C51單片機,單片機作為整個系統的大腦,協調各個部件的工作。首先,當按鍵發出的控制指令時,單片機利用外部中斷采集控制指令,并對控制指令進行處理,之后輸出信號控制直流電機的驅動電路。與此同時,單片機要計算直流電機的轉速,并且要把電機的轉速在數碼管上顯示出來。直流電機的調速是通過單片機控制輸出PWM的占空比實現的,為了提高單片機的工作效率,對按鍵的掃描采用中斷方式。其原理框圖如圖3:


3控制系統原理框圖

3.硬件電路設計

3.1單片機最小工作系統

單片機最小工作系統指單片機能正常工作的最少配置,包括電源、時鐘電路、復位電路和一塊51單片機。

189C51

AT89C51是一種帶4K字節FLASH字節存儲器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓、高性能CMOS 8位微處理器,俗稱單片機。如圖4所示。

4 AT89C51

2時鐘電路

MCS-51單片機的時鐘有兩種工作方式:一種是內部振蕩方式,它是利用單片機內部的振蕩電路,產生時鐘信號,這種方式單片機的時鐘引腳上接石英晶體和振蕩電容;另外一種是外部振蕩方式,它是把外部已有的時鐘引入單片機。下面來介紹較為常用的內部振蕩方式:

如圖5,單片機內部有一個用于構成振蕩器的高增益反相放大器,它的輸入端為XTAL1引腳,輸出端為XTAL2引腳,分別是8051單片機的19腳和18腳,其頻率范圍為fOSC=0~12MHZ。

5 內部振蕩方式時鐘電路圖

3復位電路

往單片機的復位引腳上輸入24個時鐘周期以上的高電平,即執行復位操作。在此次課設中我用的是按鍵復位,電路如圖6所示,系統在運行時,按下復位按鍵,就能在RST引腳產生一段時間的高電平,使系統復位。此處,取12MHZ的晶振,電容取30pF。

6 按鍵復位電路

3.2數碼管顯示電路

LED數碼管是由a、b、c、d、e、f、g、h這8段發光二極管組成的“8”字形顯示器件。LED數碼管分為共陽極和共陰極兩種,如圖7所示,如果每段的陽極接在一起則為共陽極LED,如果每段的陰極接在一起則為共陰極LED。此次課設中,我所用的數碼管為共陰極的。

7  LED數碼管

這里用到了4位數碼管,如圖8所示,段選端接單片機的P0口,因為P0口內部沒有上拉電阻,為高阻態,不能正常的輸出高/低電平,所以這里需要上拉電阻。為了電路的簡化,這里使用了排阻。數碼管的位選端接單片機的P1.0~P1.3,當輸出低電平時,表示該位數碼管被選中。

8數碼管電路

3.3直流電機驅動電路

L298是一款高電壓、高電流型的全橋驅動電路,輸入為TTL電平,用來驅動如繼電器、直流電機或步進電機等感性負載。兩個獨立的使能端,可以獨立的控制兩組四個輸入。

直流電機的驅動電路由L298構成,51單片機通過P1.5~P1.7口控制L298的使能端口和輸入端口,而驅動芯片則輸出被放大的控制信號,用以控制電機運行。驅動電路如圖9所示,圖中所加4個二極管是起到保護作用。

9直流電機驅動電路

3.4按鍵控制電路

單片機檢測按鍵的原理是:單片機的I/O口既可作為輸出也可以作為輸入使用,當檢測按鍵時用的是它的輸入功能,我們把按鍵的一端接地,另一端與單片機的某個I/O口相連,開始時先給該I/O口賦一個高電平,然后讓單片機不斷的檢測該I/O口是否變為低電平,當按鍵閉合時,即相當于該I/O口通過按鍵與地相連,變成低電平,程序一旦檢測到I/O變為低電平則說明按鍵被按下,然后執行相應的指令。

這種按鍵在按下和松開時都會有抖動現象,可以采用硬件或者軟件的方式來消除抖動,為了節約成本,采用軟件延時的方式來消除抖動的影響。

為了提高單片機的工作效率,本次設計將5個按鍵通過一個與門連至單片機的外部中斷輸入口。當有按鍵按下時,單片機停下正在做的工作,轉而執行按鍵掃描程序,然后執行相應指令。按鍵控制電路如圖10所示:

10按鍵控制電路

4.軟件設計

4.1 主程序設計

當程序開始運行時,不斷采集直流電機的轉速并顯示。其流程圖如圖11所示:

11主程序流程圖

4.2定時器0控制產生PWM波形

直流電機調速一般運用PWM原理來進行。對于直流電機來說,如果加在電樞兩端的電壓為脈動電壓,可以看出,在T不變的情況下,改變t1和t2的寬度,電壓將發生變化。

                        

式中,是常數。

利用PWM調速的原理,也就是通過改變占空比來改變加在電機兩端的電壓,從而改變電機的轉速,其流程圖如圖12所示。

12  PWM波形控制流程圖

直流電機在進行調速時,通過改變變量num的值實現。加速時,num的值增加,而TH0的初值則相應的減小,也就是一個周期中,高電平相應的時間延長,低電平的時間相應減小速度增加。減速時num的值減小,也就是TH0的初值增加,一個周期中,高電平的時間減小,低電平的時間增加,速度降低。

4.3按鍵掃描程序

當發生外部中斷時,單片機進入外部中斷程序,開始掃描按鍵,先掃描KEY0按鍵,看是否按下了起/停鍵,如果按下了該鍵,則執行起/停程序;如果沒有則判斷KEY1鍵,看是否按下了該鍵,若果按下了,則執行正轉程序;若果沒有判斷KEY2鍵,若該鍵按下,則執行反轉程序;若沒有則檢測KEY3鍵是否按下,若按下,則執行加速程序;若沒有則檢測KEY4鍵,若該鍵按下,則執行減速程序,否則退出中斷程序。按鍵顯示程序流程圖如圖13所示。在這段中斷程序中,掃描按鍵,并執行相應的指令。因為把按鍵掃描程序放到外部中斷程序中,單片機只有在接收到外部中斷的申請時,才去掃描按鍵,在無按鍵按下時,不必浪費時間去掃描按鍵,提高了CPU的效率。

13外部中斷按鍵掃描程序

5.仿真分析

5.1Proteus簡介

Proteus開發平臺不僅能夠勝任PCB電路板設計制作的工作,同時還擁有進行交互式的仿真測試的功能。Proteus軟件是目前用戶最為青睞的仿真軟件,它不僅能夠完成單一電路以及混合電路的仿真與設計,同時能夠很好的和市面上常見的微型控制器系統兼容匹配。它完美的完成了從設計原理圖→仿真分析→代碼調試→功能測試→形成PCB的完整過程。經過多年的發展與完善,如今無論是在性能上還是功能上都越來越值得廣大用戶的信賴。

5.2軟件仿真

這部分仿真主要是解決程序中的語法錯誤。由于程序代碼較長,在書寫過程中難免出現語法錯誤和函數參數類型方面的錯誤,我選擇使用keil4軟件編寫程序,通過這道程序的仿真,能基本解決這方面的錯誤,為下一步應用proteus軟件仿真做好準備。其仿真結果見圖14:

14源程序仿真結果

由圖可知,程序已無語法錯誤,編譯成功,并且生成hex文件,利用該文件可以與proteus軟件聯合仿真,進一步檢查程序的語法錯誤。

5.3運用proteus軟件聯合仿真

首先在proteus軟件中畫好硬件電路,并檢查硬件電路是否滿足要求。在確定硬件功能正常后,載入編譯源程序生成的hex文件,在proteus軟件中仿真運行,通過電路中各元件引腳顯示的電平狀態,檢查軟件邏輯上是否存在問題。再確認沒有問題之后,開始進入仿真的環節。

點擊左下角運行之后,電機顯示0轉速,數碼管也顯示速度為0000,右下角顯示電機狀態的LED燈全滅。如圖15:

15開始運行

點擊啟動停止按鈕,電機開始正轉,并維持一定的速度,速度顯示在數碼管上為0209,右下角紅燈亮,表示電機處在正轉狀態,如圖16:

16點擊啟動停止按鈕后畫面

點擊反轉按鈕,電機開始反轉,并維持一定的速度,速度顯示在數碼管上為-209,右下角黃燈亮,表示電機處在反轉狀態,如圖17:

17點擊反轉按鈕后畫面

點擊正轉按鈕,電機開始正轉,并維持一定的速度,速度顯示在數碼管上為0209,右下角紅燈亮,表示電機處在正轉狀態,如圖18:

18點擊正轉按鈕后畫面

點擊加速按鈕,電機開始正轉加速,速度顯示在數碼管上為0220,右下角紅燈亮,表示電機處在正轉狀態,如圖19:

19點擊加速后畫面

點擊兩次減速按鈕,電機開始正轉減速,速度顯示在數碼管上為0199,右下角紅燈亮,表示電機處在正轉狀態,如圖20:

20點擊兩次減速按鈕后畫面

點擊啟動停止按鈕,電機停止轉動,速度顯示在數碼管上為0000,右下角綠燈亮,表示電機處在停止狀態,如圖21:

21點擊啟動停止按鈕后畫面

  1. #include"reg52.h"
  2. #define uchar unsigned char
  3. #define  uint unsigned int
  4. sbit IN1=P1^6;
  5. sbit IN2=P1^7;
  6. sbit ENA=P1^5;
  7. sbit KEY0=P2^0;
  8. sbit KEY1=P2^1;
  9. sbit KEY2=P2^2;
  10. sbit KEY3=P2^3;
  11. sbit KEY4=P2^4;
  12. sbit LEDR=P2^5;
  13. sbit LEDY=P2^6;
  14. sbit LEDG=P2^7;
  15. sbit WE1=P1^0;
  16. sbit WE2=P1^1;
  17. sbit WE3=P1^2;
  18. sbit WE4=P1^3;
  19. sbit led=P1^4;

  20. bit flag=0;
  21. bit sign=1;
  22. uint num=0;
  23. uchar code table[]={
  24. 0x3f,0x06,0x5b,0x4f,0x66,
  25. 0x6d,0x7d,0x07,0x7f,0x6f};

  26. void delay(uint n)
  27. {
  28.      uint i,j;
  29.               for(i=n;i>0;i--)
  30.                   for(j=0;j<110;j++);
  31. }
  32. void initial()
  33. {
  34.       IN1=0;
  35.                 IN2=0;
  36.                 ENA=0;
  37.                 num=0;
  38.                 TMOD=0x01;
  39.                 TL0=0xff;
  40.                 TH0=0xff;
  41.                 EA=1;
  42.                 EX0=1;
  43.                 ET0=1;
  44.                 IT0=1;
  45.                 TR0=1;
  46. }
  47. void display(bit flag,uint n)
  48. {
  49.     uint v;
  50.               uchar qian,bai,shi,ge;
  51.               v=(uint)(n*535.0/255);
  52.               qian=v/1000;
  53.               bai=(v-1000*qian)/100;
  54.               shi=v%100/10;
  55.               ge=v%10;

  56.               WE1=0;
  57.               if(flag==1)
  58.               P0=table[0];
  59.               else
  60.               P0=0x40;
  61.               delay(10);
  62.               WE1=1;

  63.               WE2=0;
  64.               P0=table[bai];
  65.               delay(10);
  66.               WE2=1;

  67.               WE3=0;
  68.               P0=table[shi];
  69.               delay(10);
  70.               WE3=1;

  71.               WE4=0;
  72.               P0=table[ge];
  73.               delay(10);
  74.               WE4=1;
  75. }

  76. void main()
  77. {
  78.     initial();
  79.     while(1)
  80.               {
  81.                 display(sign,num);

  82.      }
  83. }
  84. void int0() interrupt 0
  85. {
  86.     if(KEY0==0)
  87.        {
  88.                               delay(10);
  89.                               if(KEY0==0)
  90.                               {
  91.                                  flag=~flag;
  92.                                           if(flag==0)
  93.                                           {
  94.                                               num=0;
  95.                                               P2=0xff;
  96.                                                         ENA=0;
  97.                                                         IN1=0;
  98.                                                         IN2=0;
  99.                                                         LEDG=0;
  100.                                                         sign=1;
  101.                                           }
  102.                                           else
  103.                                           {
  104.                                               P2=0xff;
  105.                                                         num=100;
  106.                                                         IN1=0;
  107.                                                         IN2=1;
  108.                                                         LEDR=0;
  109.                                                         sign=1;
  110.                                           }
  111.                                           while(!KEY0);
  112.                               }
  113.                             }
  114.                             if(KEY1==0)
  115.                             {
  116.                                  delay(10);
  117.                                           if(KEY1==0)
  118.                                           {
  119.                                               P2=0xff;
  120.                                                         //ENA=1;
  121.                                                         IN1=0;
  122.                                                         IN2=1;
  123.                                                         LEDR=0;
  124.                 sign=1;
  125.                                           }
  126.                                           while(!KEY1);
  127.                             }
  128.                             if(KEY2==0)
  129.                             {
  130.                                  delay(10);
  131.                                           if(KEY2==0)
  132.                                           {
  133.                                                P2=0xff;
  134.                                                         //ENA=1;
  135.                                                         IN1=1;
  136.                                                         IN2=0;
  137.                                                         LEDY=0;
  138.                                                         sign=0;
  139.                                           }
  140.                                           while(!KEY2);
  141.                             }
  142.                             if(KEY3==0)
  143.                             {
  144.                                 
  145.                                           delay(10);
  146.                                           if(KEY3==0)
  147.                                           {
  148.                                                num+=5;
  149.                                                         if(num>=255)
  150.                                                             num=255;
  151.                                           }
  152.                                           while(!KEY3);                  
  153.                   }
  154.                             if(KEY4==0)
  155.                             {
  156.                                 
  157.                                           delay(10);
  158.                                           if(KEY4==0)
  159.                                           {
  160.                                                num-=5;
  161.                                                         if(num<=0)
  162.                                                             num=0;
  163.                                           }
  164.                                           while(!KEY4);                  
  165.                   }
  166. }
  167. void itt0() interrupt 1
  168. {
  169.       ENA=~ENA;
  170.                 TL0=0xff;                    //定時器重裝初值
  171.                 led=~led;
  172.                 if(ENA==1)
  173.                    TH0=255-num; //定時器高8位裝初值
  174.                 else               
  175.                    TH0=num;
  176. }
復制代碼
完整的Word格式文檔51黑下載地址:
直流電機的調速與控制.docx (808.31 KB, 下載次數: 322)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏14 分享淘帖 頂5 踩
回復

使用道具 舉報

沙發
ID:663096 發表于 2019-12-13 11:59 | 只看該作者
有清楚一點的圖片嗎
回復

使用道具 舉報

板凳
ID:671899 發表于 2019-12-23 23:31 | 只看該作者
贊,感謝樓主分享,對我的課程設計很有幫助
回復

使用道具 舉報

地板
ID:617260 發表于 2019-12-23 23:59 | 只看該作者
學習一下,有注釋更好
回復

使用道具 舉報

5#
ID:684850 發表于 2020-5-28 22:24 | 只看該作者
電機的速度是怎么得出的啊
回復

使用道具 舉報

6#
ID:761802 發表于 2020-6-8 17:48 | 只看該作者
看不清楚
回復

使用道具 舉報

7#
ID:791288 發表于 2020-6-27 21:30 | 只看該作者
感謝分享~
回復

使用道具 舉報

8#
ID:837267 發表于 2020-11-1 11:46 | 只看該作者
為啥直流電機無法反轉?
回復

使用道具 舉報

9#
ID:893396 發表于 2021-3-18 16:50 來自手機 | 只看該作者
博主請問n*535/255最后的初值為209這個怎么來
回復

使用道具 舉報

10#
ID:607312 發表于 2021-3-23 10:32 | 只看該作者
學習了,程序測試了沒法反轉
回復

使用道具 舉報

11#
ID:617391 發表于 2021-11-30 21:29 | 只看該作者
誰能根據這個畫個Proteus仿真嗎?
回復

使用道具 舉報

12#
ID:1077225 發表于 2023-5-13 14:08 | 只看該作者
在100-1500范圍內連續可調這咋實現,在代碼中改哪
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产高清在线精品 | 欧美视频二区 | 免费观看一级毛片 | 免费在线观看黄网站 | 中文字幕日韩欧美一区二区三区 | 国产资源网| 国产免费一区二区三区 | 一级毛片视频在线观看 | 日本黄色大片免费 | 亚洲人成人一区二区在线观看 | 亚洲国产网址 | 国产精品欧美精品日韩精品 | 欧美日韩电影一区 | 久久亚洲一区二区三区四区 | 综合久久久| 国产精品综合视频 | 亚洲精品成人 | 国产精品久久久 | 日韩成人在线一区 | 国产精品久久久久久久模特 | 中文字幕亚洲一区二区三区 | 国产一级片免费看 | 日韩视频免费在线 | 成人深夜福利网站 | 亚洲视频二区 | 一区二区三区在线 | 国产精品mv在线观看 | 日韩一区二区在线播放 | 久久国产成人 | 国产精品污www一区二区三区 | 精品无码三级在线观看视频 | 亚洲欧美一区二区三区国产精品 | 国产精品久久久久久婷婷天堂 | 午夜欧美 | 久久国产一区 | 精品欧美一区二区三区久久久 | 国产成人精品一区二区三 | 亚洲啊v在线 | 国产精品亚洲综合 | 久久国产精品久久久久久 | 国产精品视频网 |