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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機+霍爾元件電機轉速測量系統電路程序設計

  [復制鏈接]
跳轉到指定樓層
樓主
ID:853387 發表于 2020-12-2 21:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

如圖1所示,此方案是以STC89C52RC單片機作為主控芯片,采用霍爾測速傳感器磁場頻率測速法測量電機轉速、采集電機參數,向單片機輸入脈沖信號。選取LCD1602液晶顯示屏顯示電機每分鐘轉速及占空比。采取獨立按鍵作為按鍵模塊,為單片機提供按鍵信息,實現電機啟動/停止、正轉、反轉、加速、減速功能。選擇雙極PWM控制配合H型橋式驅動電路實現電機驅動,利用USB-TTL轉串口模塊完成系統供電以及燒錄程序。整體硬件需求較小,硬件成本較低。


3.8總體方案框圖




四、電路設計

4.1總體電路設計原理圖


圖2 系統電路設計原理圖

系統電路構成:由STC89C52RC單片機最小系統作為運算處理和控制的核心,采用USB-TTL轉串口實現電路5V供電,選擇3144測速傳感器(P3.3)作為輸入模塊,LCD1602液晶顯示模塊(P0.0—P0.7,P2.7:RS,P2.6:RW,P2.7:EN)作為顯示電路,并配合按鍵電路控制直流電機、設定占空比,最后通過由三級管及開關二極管組成的H橋電路(P3.4,P3.7)驅動5V直流電機,共六個部分組成,如圖2所示。

4.2供電電路

圖3 供電模塊接線電路圖

在PCB板子的一側焊上四個排針,外接USB-TTL轉串口的5V,RXD,TXD,GND端口,實現對電路的5V供電以及對STC89C52RC單片機程序的燒錄,具體電路如圖3所示。

4.3直流電機驅動電路

圖4 電機驅動模塊電路圖

直流電機驅動電路由四個三極管組成H橋驅動電路,H橋的輸入受STC89C52RC單片機輸出的PWM信號控制,在實現轉速控制的同時,也可以實現正反轉控制,具體電路如圖4所示。

4.4霍爾傳感器測速模塊電路

圖5 霍爾傳感器測速模塊實物圖

霍爾傳感器測速模塊電路應用霍爾效應原理,是由電壓調整器、霍爾電壓發生器、差分放大器、施密特觸發器,溫度補償電路和集電極開路的輸出級組成的磁敏傳感電路。使用3144E開關型霍爾傳感器,其輸入為磁感應強度,輸出是一個數字電壓信號。當傳感器感應到磁場時,數字輸出低電平,信號燈亮;如果沒有感應到磁場,則數字輸出高電平,信號燈不亮,準確度、可靠性高。

圖6 霍爾傳感器測速模塊接線電路圖

霍爾傳感器測速模塊的數字信號輸出端口通過10K的上拉電阻與STC89C52RC的P3.3端口相連,使其輸出信號更穩定,如圖6所示。

4.5按鍵電路

圖7 按鍵電路圖

按鍵電路由5個普通的自復位式四腳按鍵組成,將它們同一側的引腳縱向連在一起接到GND,另一端分別接入STC89C52RC單片機的P1.0—P1.4引腳,主要實現電機啟動/停止、正轉、反轉、加速、減速,如圖7所示。

4.6單片機及顯示電路

圖8 單片機最小系統圖

圖9 LCD1602液晶顯示圖

單片機及顯示電路包括單片機最小系統、LCD1602液晶顯示,如圖8、圖9所示,LCD1602液晶顯示通過并行通信接口(D0—D7,P2.7:RS,P2.6:RW,P2.7:EN)與單片機相連,在電路中主要實現電機轉速及占空比的顯示。

單片機通過P3.4、P3.7端口向直流電機驅動電路輸出PWM信號,控制電機轉速。霍爾傳感器測速模塊電路輸出的方波信號送入單片機的P3.3端口。

4.7元器件清單

表1 元器件清單表

元器件
型號規格
個數
IC插座集成塊
40P腳
1
測速傳感器模塊
Risym
1
輕觸式開關
直插6*6*5 中二腳
1
輕觸式開關
直插6*6*5 四腳
5
單排排針
插針 1*40PIN
2
1/4W金屬膜電阻
10K
2
1/4W金屬膜電阻
1K
4
1/4W金屬膜電阻
4.7K
1
藍白滑動變阻器
10K
1
排阻
103
1
排母
40P腳
1
鋁電解電容
10uf
1
瓷片電容
33pf 50v
2
獨石電容
104
2
石英晶振
12M 直插2腳
1
開關二極管
1N4148
4
微型直流電機
RC300帶線
1
萬用板
10*15cm
1
三極管
S8050
4
三極管
S8550
2
顯示屏
LCD1602
1
USB轉串口模塊(刷機板)
CH340模塊
1
單片機
STC89C52RC
1


元器件的選擇,根據可靠性、可行性、穩定性、價格以及最終方案,選擇元器件均為直插式,選擇STC89C52RC單片機為主控芯片,使用IC插座集成塊,方便單片機的更換,利用排母使LCD1206實現外接模式,方便顯示屏安裝與拆卸。

五、軟件設計

程序設計部分主要包括主程序、初始化子程序、鍵盤掃描子程序、LCD1602顯示子程序、中斷子程序、信息處理子程序及PWM生成程序七個部分組成,大致通過LCD1602顯示信息,通過按鍵輸入信息,對LCD1602顯示的轉速和占空比等信息進行操作。

5.1主程序

主程序中主程序中包含了初始化程序,鍵盤掃描程序,主程序代碼如下:

void main()
{
flag_1=0;
              m=100;                           
              zhuansu=0;                                         
              flag=0;
              zheng=1;                                                      
              fan=0;
    init();               
              while(1)
              {
                            keyscan();                                         
              }
}


5.2中斷程序

1.外部中斷

(1)工作過程:每來一個電機脈沖信號,產生中斷計數。

(2)流程圖:如圖11所示。

(3)程序:

void int1()interrupt 2                                         
{
  zhuansu++;

}

2.定時器中斷

(1)工作過程:TT0 定時器每2秒定時中斷一次,讀取記錄的脈沖個數,顯示轉速。

(2)流程圖:如圖12所示。

(3)程序:

void int2()interrupt 3                                         

{
  

TH0=0xdc;
  TL0=0x00;               
  flag++;
  if(flag==200)
  {                                         
              display();                                                         
              zhuansu=0;                                                      
              flag=0;
  }
}

5.3鍵盤掃描程序



(1)工作過程:按鍵1按下時占空比加一,按鍵2按下時占空比減一,按鍵3按下時電機正轉,按鍵4按下時電機反轉,按鍵5按下時電機啟動/停止。

(2)流程圖:如圖13所示。

(3)程序:

void keyscan()
{
  if(num1==0)   
  {
     delay(20);
              if(num1==0)
              {
                            if(m<=199)
                                          m++;
                            displaym();
     }
  }
  if(num2==0)
  {
                delay(20);
              if(num2==0)
              {
                              if(m>=1)
                                          m--;
                            displaym();

              }
  }
  if(num3==0)
  {
                delay(20);
              if(num3==0)
              {
                            zheng=1;
                            fan=0;
              }
  }
  if(num4==0)
  {
     delay(20);
              if(num4==0)
              {
                            zheng=0;            
                            fan=1;               
              }
  }
  if(num5==0)
  {
     delay(20);
              if(num5==0)
              {
                            while(num5==0);
                            kai=1-kai;
              }
  }
}

5.4信息處理子程序


1.占空比顯示

(1)工作過程:在LCD1602上顯示占空比,若轉速百位為零則百位顯示空格、其余正常顯示,反之百位也正常顯示;若轉速十位為零則只顯示個位,反之十位也正常顯示、百位顯示空格。

(2)流程圖:如圖14所示。

(3)程序:

void displaym()

{
  write_com(0xcb);
  if(m/200%10!=0)
                write_data(m/200%10+0x30);                                          
  else
                write_data(' ');

  if(m/200%10==0&&m/20%10==0)
                write_data(' ');
  else
                write_data(m/20%10+0x30);                           
  write_data(m/2%10+0x30);                                                      
}

2.轉速顯示:

(1)工作過程:在LCD1602上顯示轉速,若轉速萬位為零則萬位顯示空格、其余正常顯示,反之都正常顯示;若轉速千位為零則萬位、千位顯示空格、其余正常顯示,反之千位也正常顯示;若轉速百位為零則萬位、千位、百位顯示空格、其余正常顯示,反之百位也正常顯示;若轉速十位為零則只顯示個位,反之十位也正常顯示、其余顯示空格。

(2)流程圖:如圖15所示。

(3)程序:

void display()
{
  write_com(0x82);
  zhuansu=zhuansu*30;                                 

  if(zhuansu/10000!=0)
                write_data(zhuansu/10000+0x30);                  
  else
                write_data(' ');

  if(zhuansu/1000==0)
                write_data(' ');
  else
                write_data(zhuansu%10000/1000+0x30);            

  if(zhuansu/100==0)
                write_data(' ');
  else
                write_data(zhuansu%10000%1000/100+0x30);   

  if(zhuansu/10==0)
                write_data(' ');
  else
                write_data(zhuansu%10000%1000%100/10+0x30);
  write_data(zhuansu%10000%1000%100%10+0x30);
  write_com(0xd0);}


5.5PWM生成子程序



(1)工作過程:電機正轉時,若0<flag_1<m,向電機輸出高電平;若m<flag_1<199,向電機輸出低電平。電機反轉時,若0<flag_1<m,向電機輸出低電平;若m<flag_1<199,向電機輸出高電平。

(2)流程圖:如圖15所示。

(3)程序:

void int3()interrupt 1                              
{
  TH1=0xff;
  TL1=0x00;               
              flag_1++;
              if(flag_1>199)
              flag_1=1;
              if(kai==1)                                      
              {
                            if(zheng==1)                              
                            {
                                          if(flag_1<m)               
                                 {
                                          out=0;
                                          out1=1;
                                          }
                                          else
                                          {
                                             out=1;
                       out1=1;
                                          }
                            }
                            if(fan==1)                                          
                  {
                                          if(flag_1<m)               
                      {
                                out=1;
                                          out1=0;
                                            }
                                          else                                            
                                            {
                       out=1;
                                 out1=1;
                                            }
                            }
              }
              if(kai==0)                                                
              {
                out=1;
                out1=1;
              }
}

六、制作、調試過程

6.1制作

圖17 萬用板元件分布圖

將電路原理圖繪制完成,然后根據原理圖準備相應的元件,再根據要求改變各元件的屬性并把各個元件按原理圖焊接于萬用板之上。焊接完成后,用萬用表檢測電路的通斷情況,檢查無誤后,向IC插座集成塊中插入芯片,下載測試程序,觀察LCD1602顯示模塊、電機、霍爾傳感器測速模塊以及按鍵是否按程序正常運行。

圖18 PCB照片預覽及3D仿真

圖19 PCB實物圖

圖20 萬用板實物圖

6.2調試

利用制作的實物進行運行調試,通過按不同的按鍵,觀察LCD1602顯示情況,判斷是否存在邏輯錯誤的情況。調試過程中,肯定會出現因邏輯錯誤而顯示不正常,需要配合仿真調試進行排查。發現出錯原因后,及時想辦法解決問題。

圖21 實物調試圖


九、附錄

圖 22  系統電路原理圖


圖 2  實物正面電路

圖 3  實物反面電路走線


圖 4  實物調試

單片機系統程序:


  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. void displaym();
  5. sbit en=P2^5;               
  6. sbit rs=P2^7;               
  7. sbit rw=P2^6;   
  8. sbit num1=P1^2;               
  9. sbit num2=P1^3;               
  10. sbit num3=P1^0;               
  11. sbit num4=P1^1;               
  12. sbit num5=P1^4;               
  13. sbit out=P3^4;            
  14. sbit out1=P3^7;                           
  15. uint zhuansu,flag,z1,z2,m,flag_1,zheng,fan,kai;
  16. void delay(uint z)
  17. {

  18. uint x,y;
  19. for(x=0;x<z;x++)
  20.      for(y=0;y<110;y++);
  21. }
  22. void write_com(uchar com)  
  23. {
  24.   rs=0;
  25.   P0=com;
  26.   delay(5);
  27.   en=0;
  28.   delay(10);
  29.   en=1;
  30. }
  31. void write_data(uchar date)  
  32. {
  33.   rs=1;
  34.   P0=date;
  35.   delay(5);
  36.   en=0;
  37.   delay(5);
  38.   en=1;
  39. }
  40. void init()         
  41. {
  42.   en=0;
  43.   rw=0;
  44.   write_com(0x01);   
  45.   write_com(0x38);                           
  46.   write_com(0x0c);                           
  47.   TMOD=0x01;                    
  48.   TH0=0xdc;
  49.   TL0=0x00;            
  50.   EA=1;                  
  51.   ET0=1;              
  52.   TR0=1;
  53.   EX1=1;
  54.   IT1=1;               
  55.   TH1=0xfc;
  56.   TL1=0x66;         
  57.   ET1=1;              
  58.   TR1=1;
  59.   write_com(0x80);
  60.   write_data('V');
  61.   write_data(':');
  62.   write_com(0x87);                           
  63.   write_data('r');
  64.   write_data('p');
  65.   write_data('m');
  66.   write_com(0xc0);
  67.   write_data('z');
  68.   write_data('h');
  69.   write_data('a');
  70.   write_data('n');
  71.   write_data('k');
  72.   write_data('o');
  73.   write_data('n');
  74.   write_data('g');
  75.   write_data('b');
  76.   write_data('i');                    
  77.   write_data(':');                           
  78.   displaym();
  79. }
  80. void keyscan()           
  81. {
  82.   if(num1==0)   
  83.   {
  84.      delay(20);         
  85.               if(num1==0)
  86.               {
  87.                             if(m<=199)
  88.                                           m++;
  89.                             displaym();      
  90.      }
  91.   }
  92.   if(num2==0)
  93.   {
  94.                 delay(20);
  95.               if(num2==0)
  96.               {
  97.                               if(m>=1)
  98.                                           m--;
  99.                             displaym();     
  100.               }
  101.   }
  102.   if(num3==0)
  103.   {
  104.                 delay(20);
  105.               if(num3==0)
  106.               {
  107.                             zheng=1;            
  108.                             fan=0;               
  109.               }
  110.   }
  111.   if(num4==0)
  112.   {
  113.      delay(20);
  114.               if(num4==0)
  115.               {
  116.                             zheng=0;            
  117.                             fan=1;            
  118.               }
  119.   }
  120.   if(num5==0)
  121.   {
  122.      delay(20);
  123.               if(num5==0)
  124.               {
  125.                             while(num5==0);
  126.                             kai=1-kai;
  127.               }
  128.   }
  129. }
  130. void display()
  131. {
  132.   write_com(0x82);
  133.   zhuansu=zhuansu*30;                                 
  134.   if(zhuansu/10000!=0)
  135.                 write_data(zhuansu/10000+0x30);                     
  136.   else
  137.                 write_data(' ');
  138.   if(zhuansu/1000==0)
  139.                 write_data(' ');
  140.   else
  141.                 write_data(zhuansu%10000/1000+0x30);               
  142.   if(zhuansu/100==0)
  143.                 write_data(' ');
  144.   else
  145.                 write_data(zhuansu%10000%1000/100+0x30);
  146.   if(zhuansu/10==0)
  147.                 write_data(' ');
  148.   else
  149.                 write_data(zhuansu%10000%1000%100/10+0x30);
  150.   write_data(zhuansu%10000%1000%100%10+0x30);
  151.   write_com(0xd0);                 
  152. }
  153. void displaym()
  154. {
  155.   write_com(0xcb);
  156.   if(m/200%10!=0)
  157.                 write_data(m/200%10+0x30);                           
  158.   else
  159.                 write_data(' ');
  160.   if(m/200%10==0&&m/20%10==0)
  161.                 write_data(' ');
  162.   else
  163.                 write_data(m/20%10+0x30);                           
  164.   write_data(m/2%10+0x30);                           
  165. }

  166. void main()
  167. {
  168.   flag_1=0;
  169.               m=100;                                         
  170.               zhuansu=0;                                         
  171.               flag=0;
  172.               zheng=1;                           
  173.               fan=0;
  174.     init();
  175.               while(1)
  176.               {
  177.               keyscan();                           
  178.               }
  179. }

  180. void int1()interrupt 2
  181. {
  182.   zhuansu++;
  183. }

  184. void int2()interrupt 3                           
  185. {
  186.   TH0=0xdc;
  187.   TL0=0x00;
  188.   flag++;
  189.   if(flag==200)            
  190.   {
  191.               display();            
  192.               zhuansu=0;                                                         
  193.               flag=0;
  194.   }
  195. }

  196. void int3()interrupt 1            
  197. {
  198.   TH1=0xff;
  199.   TL1=0x00;
  200.               flag_1++;
  201.               if(flag_1>199)
  202.               flag_1=1;
  203.               if(kai==1)
  204.               {
  205.                             if(zheng==1)            
  206.                             {
  207.                                           if(flag_1<m)
  208.                                  {
  209.                                           out=0;
  210.                                           out1=1;
  211.                                           }
  212.                                           else
  213.                                           {
  214.                                              out=1;
  215.                        out1=1;
  216.                                           }
  217.                             }
  218.                             if(fan==1)
  219.                   {
  220.                                           if(flag_1<m)            
  221.                       {
  222.                                 out=1;
  223.                                           out1=0;
  224.                                             }
  225.                                           else            
  226.                                             {
  227.                        out=1;
  228.                                  out1=1;
  229.                                             }
  230.                             }
  231.               }
  232.               if(kai==0)
  233.               {
  234.                 out=1;
  235.                 out1=1;
  236.               }
  237. }
復制代碼
完整的Word格式文檔51黑下載地址:

基于霍爾元件電機轉速測量系統設計.docx (5.7 MB, 下載次數: 85)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:796531 發表于 2021-4-13 19:12 | 只看該作者
好東西,正好在做一個PWM升壓電路,思路參考一下
回復

使用道具 舉報

板凳
ID:765415 發表于 2021-4-30 00:11 | 只看該作者
樓主好厲害,不過有個問題想請教一下,霍爾傳感器不是感應磁鐵嗎,你的風扇上好像沒有,但是也能感應,請問是什么原理呢(⊙o⊙)?
回復

使用道具 舉報

地板
ID:889094 發表于 2021-4-30 08:19 來自觸屏版 | 只看該作者
程序結構性很好,學習了,一點注釋沒有,放下一周再過來看就會費勁,像lcd1602顯示部分,定時器初始化和中斷服務部分,可以注釋好形成單獨文件或模塊,便于再利用。另外沒有說明晶振就直接出來的delay函數有點突兀
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人在线影视 | 色一情一乱一伦一区二区三区 | 亚洲精品一区二三区不卡 | 日本理论片好看理论片 | 国产999精品久久久久久 | 欧美99久久精品乱码影视 | 成人在线精品视频 | 成人午夜精品一区二区三区 | 欧美bondage紧缚视频 | 日本一区高清 | а√中文在线8 | 午夜在线视频 | 国精日本亚洲欧州国产中文久久 | 国产精品成人在线 | 欧美精品一区二区在线观看 | 噜噜噜噜狠狠狠7777视频 | 在线成人| 美女三区 | 成人免费一区二区三区牛牛 | 最新黄色毛片 | 国产欧美精品一区二区 | 一区二区在线 | 日本在线精品视频 | 紧缚调教一区二区三区视频 | 视频一区二区三区中文字幕 | 亚洲视频在线播放 | 91麻豆精品国产91久久久久久 | 精品国产不卡一区二区三区 | 国产特一级黄色片 | 日韩国产一区二区三区 | 国产成人午夜高潮毛片 | 成人小视频在线观看 | 国产精品一区在线观看 | 亚洲第一天堂 | 久久麻豆精品 | 欧美亚洲国产日韩 | 午夜精品网站 | 亚洲一区国产 | 欧美激情精品久久久久久免费 | 欧美成年网站 | 欧美高清hd|