|
我為了排版,排了一個小時。。
設計亮點是:
示波器顯示正反轉的占空比波形。
1、示波器的藍色線:代表電機反轉
2、示波器的黃色線:代表電機正轉
3、外接電源可調
4、液晶顯示不會亂碼
5、程序有一定的注釋
有完整的程序+仿真原件+仿真調試的過程說明!在附件!!!
Proteus仿真測試:
一、電機啟動測試
仿真部分采用的是Proteus軟件,如圖1所示,程序在加載完之后系統處于靜止的狀態,液晶屏幕也不會有顯示。在這時我們只需要按下仿真左下角的開始按鍵,但這時系統還不能完全工作,還需要手動按下開始按鍵,如圖2所示,系統默認的脈沖是50%然后轉速是968rpm/min。
圖1 系統整體仿真圖.png (132.48 KB, 下載次數: 59)
下載附件
1
2022-5-23 23:55 上傳
圖1 系統整體仿真圖
圖2 系統的啟動.png (152.09 KB, 下載次數: 67)
下載附件
2
2022-5-23 23:56 上傳
圖2 系統的啟動 二、 電機調速測試
電機的轉速加快是通過脈沖波形的變化實現的,如圖3所示,現在的脈沖是50%速度是927rpm/min,和上圖的速度不一致是因為電機在運行過程中,即使電壓一致也不能完全保障電機的速度不會發生變化,我們想要電機速度增加那么就要按下加速的按鍵,為了使電機的變化速度較為明顯,我們以30%為一個加速標準值,如圖4所示,當前屏幕顯示的脈沖是80%,速度變成了1512rpm/min,速度是已經提升上去了。最大速度是占空比為100%,這時如圖5所示,1877rpm/min,電壓+23.1。
圖3 初始速度界面.png (165.04 KB, 下載次數: 58)
下載附件
3
2022-5-23 23:56 上傳
圖3 初始速度界面
圖4 加速之后界面.png (157.65 KB, 下載次數: 69)
下載附件
4
2022-5-23 23:56 上傳
圖4 加速之后界面
圖5 最大轉速界面.png (167.09 KB, 下載次數: 68)
下載附件
5
2022-5-23 23:56 上傳
圖5 最大轉速界面 同理想要轉速減慢,我們還是以50%的脈沖作為參照情況,這時屏幕顯示的速度是967rpm/min,這時我們按下減按鍵,同樣我們以30%為一個減速標準值,這時如圖6所示,脈沖調整成了20%,就會發現速度真的下降了變成了427rpm/min,這里驗證電機轉速的減速也成功了。下降的速度與上升的速度在相同比例占空比的調節下實現的減速量也是基本一致的,沒有出現較大的且不能接受無法控制在一定范圍內的誤差。最小速度是占空比為0,這時如圖7所示,轉速不再液晶屏顯示數據,所以為0 rpm/min,電壓值+0.00V。
圖6 初始速度界面.png (175.97 KB, 下載次數: 62)
下載附件
6
2022-5-23 23:56 上傳
圖6 初始速度界面
圖7 減速之后界面.png (180.76 KB, 下載次數: 66)
下載附件
7
2022-5-23 23:56 上傳
圖7 減速之后界面
圖8 減速到0之后界面.png (148.94 KB, 下載次數: 52)
下載附件
8
2022-5-23 23:56 上傳
圖8 減速到0之后界面 三、 電機正反轉測試
正反轉的測試在電路中需要觀察電機的旋轉方向或者電壓值,如圖9所示,示波器顯示的是黃色波形,并且電機旋轉的方向是順時針,如圖10所示,按下反轉按鍵后示波器顯示的是藍色波形,電機會逆時針旋轉。這樣電機便可帶動窗簾實現拉開和關閉窗簾的工作。
圖9正轉界面.png (180.76 KB, 下載次數: 68)
下載附件
9
2022-5-23 23:56 上傳
圖9正轉界面
圖10反轉界面.png (170.16 KB, 下載次數: 56)
下載附件
10
2022-5-23 23:56 上傳
圖10反轉界面
單片機源程序:
- #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,m,flag_1,zheng,fan,kai,j,su,qian,bai,shi,ge;
-
- 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=1;
- delay(10);
- en=0;
- }
- void write_data(uchar date)//向1602寫一字節(數據)
- {
- rs=1;
- P0=date;
- delay(5);
- en=1;
- delay(5);
- en=0;
- }
- void init()//初始化函數
- {
- en=0;
- rw=0;
- write_com(0x38); //5X7顯示
- write_com(0x0c); //關閉光標
- write_com(0x01); //lcd初始化
- TMOD=0x11; //定時器方式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); //第一行第一位顯示V:
- write_data('V');
- write_data(':');
- write_com(0x87); //第一行第三位顯示轉速 千位、百位、十位、個位
- write_data('r');
- write_data('p');
- write_data('m');
- write_data('/');
- write_data('m');
- write_data('i');
- write_data('n');
- write_com(0xc0); //第二行顯示zhankongbi:
- 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');
- write_data(':');
- displaym();
- }
-
- void keyscan() //鍵盤掃描函數
- {
- if(num1==0)
- {
- delay(50); //消除抖動
- if(num1==0)
- {
- if(m<=199)
- m++;
- displaym(); //設定占空比加一
- }
- }
- if(num2==0)
- {
- delay(50);
- if(num2==0)
- {
- if(m>=1)
- m--;
- displaym(); //設定占空比減一
-
- }
- }
- if(num3==0) //正轉
- {
- delay(50);
- if(num3==0)
- {
- zheng=1;
- fan=0;
- }
-
- }
- if(num4==0) //反轉
- {
- delay(50);
- if(num4==0)
- {
- zheng=0;
- fan=1;
-
- }
- }
- if(num5==0)
- {
- delay(50);
- if(num5==0)
- {
- while(num5==0) ;
- kai=1-kai;
-
- }
- }
-
- }
- void display()
- {
- zhuansu=zhuansu*30; //將兩秒內的計數乘以30得到轉每分
- su=zhuansu*0.01*2*3.14/2; //0.0001 得到的是10轉左右
- /////////////////////////***********************////////////////////////////////////////
- write_com(0x82);
- if(su/1000%100!=0)
- write_data(su/1000%100+0x30); //如果qian位不為0則顯示千位否則顯示空格
- else
- write_data(' ');
- if(su/100%10!=0)
- write_data(su/100%10+0x30); //如果bai不為0則顯示百位否則顯示空格
- else
- write_data(' ');
- if(su/10%10!=0)
- write_data(su/10%10+0x30); //如果shi位不為0則顯示十位否則顯示空格
- else
- write_data(' ');
- if(su%10!=0)
- write_data(su%10+0x30); //如果ge位不為0則顯示個位否則顯示空格
- else
- write_data(' ');
- write_com(0xd0);
- //////////////*******************************************////////////////////////////////////////
- // write_com(0x82);
- // qian=(su/1000)%100;
- // write_data(qian+0x30);
- //
- // bai=(su/100)%10;
- // write_data(bai+0x30);
- //
- // shi=(su/10)%10;
- // write_data(shi+0x30); //顯示000000,
- //
- // ge=su%10;
- // write_data(ge+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%10==0&&m/20%10==0)
- 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;
- j=67;
- init(); //初始化
- while(1)
- {
- keyscan(); //鍵盤掃描程序
- }
- }
- void int1()interrupt 2 //外部中斷1脈沖技術記錄電機的轉速 電機轉一圈zhuansu加一
- {
- zhuansu++;
- }
- void int2()interrupt 1 //定時器0顯示轉速
- {
-
- TH0=0xdc;
- TL0=0x00;//定時10ms
- flag++;
-
- if(flag==200) //計時到達2s
復制代碼 |
-
-
proteus仿真.rar
2022-5-24 00:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
125.4 KB, 下載次數: 229, 下載積分: 黑幣 -5
仿真圖原件
-
-
程序 注釋2022年05月23日.rar
2022-5-24 00:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
36.48 KB, 下載次數: 233, 下載積分: 黑幣 -5
程序+注釋
-
-
PWM控制直流電機.docx
2022-5-24 00:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
1.59 MB, 下載次數: 150, 下載積分: 黑幣 -5
仿真測試流程
評分
-
查看全部評分
|