51單片機霍爾測速與PWM調直流電機轉速快慢

1.本設計採用STC89C51/52(與AT89S51/52、AT89C51/52通用,可任選)單片機作爲主控制器
· 2.採用霍爾傳感器非接觸式測電機轉速
· 3.LCD1602液晶顯示當前的轉速,轉速單位爲轉/分(RPM)。和顯示當前的pwm佔空比0~100%。
· 4.電機的速度可以通過按鍵調整,也可以開始暫停,正轉和反轉。
注意:磁鐵和霍爾元件最近距離在2mm左右,太近可能會在電機轉動時碰到霍爾元件,太遠霍爾元件可能會檢測不到磁鐵。
使用說明:
液晶屏第一行顯示電機轉速,第二行顯示佔空比,佔空比數值越大,電機轉速越快。
系統一共有6個按鍵,單片機附近的獨立按鍵是系統的復位按鍵,按下單片機會復位。
下面一排是控制按鍵:
1鍵:加速鍵,可以短按,佔空比加1,也可長按,佔空比連續加;
2鍵:減速鍵,可以短按,佔空比減1,也可長按,佔空比連續減;
3鍵:正轉切換鍵,按下後電機正轉;
4鍵:反轉切換鍵,按下後電機反轉;
5鍵:開始暫停鍵,按一下開始,再按一下暫停。

1.本選題的理由及意義
現在電氣傳動的主要方向之一是電機調速系統採用微處理器實現數字化控制,近年來,隨着科技的進步,直流電機得到了越來越廣泛的應用,直流具有優良的調速特性,調速平滑,方便,調速範圍廣,過載能力強,能承受頻繁的衝擊負載,可實現頻繁的無極快速起動、制動和反轉,需要滿足生產過程自動化系統各種不同的特殊要求,從而對直流電機提出了較高的要求,改變電樞迴路電阻調速、改變電壓調速等技術已遠遠不能滿足現代科技的要求,並且隨着現代化生產規模的不斷擴大,各個行業對直流電機的需求愈益增大,並對其性能提出了更高的要求。爲此,研究並製造高性能、高可靠性的直流電機控制系統有着十分重要的現實意義。
本題正是以此爲出發點, 利用單片機來實現對電機轉速的監測和控制。
2.需要重點研究的關鍵問題及解決問題的思路
關鍵問題一:如何選擇合適的單片機
如何選擇合適的單片機是本課題待解決的第一個問題。綜合各方面因素考慮,本課題將採用AT89S52,利用AT89S52芯片進行低成本直流電動機控制系統的設計,能夠簡化系統構成、降低系統成本、增強系統性能、滿足更多應用場合的需要。系統實現對電機的正轉、反轉、急停、加速、減速的控制。
關鍵問題二:如何選擇合適的電機驅動
如何選擇合適的電機驅動是本課題待解決的第二個問題。綜合各方面因素考慮,本課題將採用三極管驅動電機
關鍵問題三:採用何種方法來改變佔空比
如何選改變佔空比是本課題待解決的第三個問題。改變佔空比的方法通常有定寬調頻法,調頻調寬法,定頻調寬法,由於前兩種方法在調速時改變了控制脈衝的週期(或頻率),當控制脈衝的頻率與系統的固有頻率接近時,將會引起震盪,因此採用定頻調寬法來改變佔空比。
關鍵問題四:軟件編程及調試
軟件編程及調試是本題待解決的第四個問題,也是最爲重要關鍵的問題,關係着該系統能否實現其功能。
3.創新點及實踐價值
PWM-脈衝寬度調製技術,通過對微處理器輸出的一系列數字脈衝寬度進行調製,等效地獲得模擬電路所需的波形,從而實現對模擬電路控制的一種有效技術。採用PWM技術可以避免傳統調速系統模擬電路容易隨時間飄移、產生一些不必要的熱損耗、以及對噪聲敏感等缺點,並且PWM調速系統低速特性好,動態抗干擾能力強的特點.由此來實現直流電機的啓動、停止、加速、減速、正轉、反轉以及速度的動態顯示,並且大幅度提高了轉速顯示的精確性。
4.完成本選題所需的工作條件(如資料、工具書、計算機設計繪圖、實驗、調研)及解決辦法
工具:
(1)直流電機原理簡述的相關資料
(2) PWM控制轉速等的一些資料
(3) 模電、數電書籍
(4) 焊接工具一套

67-元件清單

  1. 9*15萬用板
  2. STC89C51單片機
  3. 40腳IC座
  4. 1602液晶
  5. 16p母座
  6. 16p排針
  7. 10k電阻*3
  8. 1k電阻*5
  9. 3v直流電機
  10. 3*1萬用板
  11. 磁鐵*2
  12. 塑料管
  13. 3144霍爾傳感器
  14. 4148二極管*4
  15. 8050三極管*4
  16. 8550三極管*2
  17. 103排阻
  18. 104獨石電容
  19. 10uf電解電容
  20. 30pf瓷片電容*2
  21. 12M晶振
  22. 按鍵*6
  23. 自鎖開關
  24. DC電源插口
  25. 導線若干
  26. 焊錫若干
  27. USB電源線或電池盒

製作出來的實物:
在這裏插入圖片描述
單片機直流電機控制轉速仿真原理圖如下
在這裏插入圖片描述
在這裏插入圖片描述
電路原理圖如下:
在這裏插入圖片描述
PCB圖如下:
在這裏插入圖片描述
部分源代碼:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void displaym();
sbit en=P2^5; //1602 6管腳
sbit rs=P2^7; //1602端口 4管腳
sbit rw=P2^6;//lcd1602控制端口 5管腳
sbit num1=P1^0; //佔空比加1
sbit num2=P1^1; //佔空比減一
sbit num3=P1^2; //正傳
sbit num4=P1^3; //反轉
sbit num5=P1^4; //開始停止切換

sbit out=P3^4; //PWM輸出用於正傳
sbit out1=P3^7; //PWM輸出用於反轉

uint zhuansu,flag,z1,z2,m,flag_1,zheng,fan,kai;

void delay(uint z)//延時1ms函數
{

uint x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}

void write_com(uchar com)//向1602寫一字節(控制指令)
{
rs=0;
P0=com;
delay(5);
en=0;
delay(10);
en=1;
}
void write_data(uchar date)//向1602寫一字節(數據)
{
rs=1;
P0=date;
delay(5);
en=0;
delay(5);
en=1;
}
void init()//初始化函數
{
en=0;
rw=0;
write_com(0x01); //lcd初始化
write_com(0x38); //5X7顯示
write_com(0x0c); //關閉光標
TMOD=0x01; //定時器方式1
TH0=0xdc;
TL0=0x00; //定時器裝入初值
EA=1; //開總中斷
ET0=1; //定時器0開中斷
TR0=1;
EX1=1;
IT1=1; //定時器啓動
TH1=0xfc;
TL1=0x66;//定時100us
ET1=1; //定時器1開中斷
TR1=1;
write_com(0x80);
write_data(‘V’);
write_data(’:’);
write_com(0x87); //第一行顯示轉速
write_data(‘r’);
write_data(‘p’);
write_data(‘m’);
write_com(0xc0);
write_data(‘z’);
write_data(‘h’);
write_data(‘a’);
write_data(‘n’);
write_data(‘k’);
write_data(‘o’);
write_data(‘n’);
write_data(‘g’);
write_data(‘b’);
write_data(‘i’); //在第二行顯示zhankongbi:
write_data(’:’);
displaym();
}
void keyscan() //鍵盤掃描函數
{
if(num10)
{
delay(5); //消除抖動
if(num1
0)
{
if(m<=199)
m++;
displaym(); //設定佔空比加一
}
}
if(num20)
{
delay(5);
if(num2
0)
{
if(m>=1)
m–;
displaym(); //設定佔空比減一

     }

}
if(num30)
{
delay(5);
if(num3
0)
{
zheng=1; //正傳標誌置1
fan=0; // 反轉標誌置0

     }

}
if(num40)
{
delay(5);
if(num4
0)
{
zheng=0; //正傳標誌置0
fan=1; // 反轉標誌置1

     }

}
if(num50)
{
delay(5);
if(num5
0)
{
while(num5==0) ;
kai=1-kai;
}
}
}
void display()
{
write_com(0x82);
zhuansu=zhuansu*30; //將兩秒內的計數乘以30得到轉每分

if(zhuansu/10000!=0)
write_data(zhuansu/10000+0x30); //如果轉速的萬位不爲0 正常顯示否則顯示空格
else
write_data(’ ');

if(zhuansu/1000==0)
write_data(’ ');
else
write_data(zhuansu%10000%1000+0x30); //如果轉速小於1000 千位爲空格 否則正常顯示

if(zhuansu/100==0)
write_data(’ ');
else
write_data(zhuansu%10000%1000/100+0x30); //如果轉速小於100 百位爲空格 否則正常顯示

if(zhuansu/10==0)

write_data(’ ');
else
write_data(zhuansu%10000%1000%100/10+0x30); //如果轉速小於10 十位爲空格 否則正常顯示

write_data(zhuansu%10000%1000%100%10+0x30);
write_com(0xd0); //如果沒有這句,當中斷內的顯示函數執行完,就會在轉速的位置顯示佔空比數據,導致亂碼
}
void displaym()
{
write_com(0xcb);
if(m/200%10!=0)
write_data(m/200%10+0x30); //如果佔空比百位不爲0則顯示百位否則顯示空格
else
write_data(’ ');

if(m/200%100&&m/20%100)
write_data(’ ');
else
write_data(m/20%10+0x30); //如果佔空比小於10 十位正常顯示 否則顯示空格

write_data(m/2%10+0x30); //顯示個位
}
void main()
{
flag_1=0;
m=100; //佔空比爲100
zhuansu=0; //轉速初值0
flag=0;
zheng=1; //初始化電機正轉動
fan=0;

init();              //初始化

    while(1)
    {
    keyscan();                                //鍵盤掃描程序



      
    }

}
void int1()interrupt 2 //外部中斷1脈衝技術記錄電機的轉速 電機轉一圈zhuansu加一
{
zhuansu++;
}
void int2()interrupt 3 //定時器0顯示轉速
{

TH0=0xdc;
TL0=0x00;//定時10ms
flag++;

if(flag==200) //計時到達2s
{

    display();                                        //顯示轉速
    zhuansu=0;                                          //轉速置0
    flag=0;

    }

}
void int3()interrupt 1 //產生PWM
{

TH1=0xff;
。。。。。。。。。。

…………限於本文篇幅有限 完整代碼請從文章中下載附件…………

最後,如果有什麼意見或者建議歡迎您留言給我,讓我們共同學習一起進步,
如果需要 完整代碼或設計文件,請在下方留言或者私信我,看到後會第一時間回覆。

謝謝!

發佈了92 篇原創文章 · 獲贊 161 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章