直流電機控制電路仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- ///*************************************************************************************************************
- ///直流電機的pwm控制程序
- ///功能:直流電機的速度控制,速度測試,速度顯示。
- ///作者:廖維斌,郭留濤
- ///*************************************************************************************************************
- #include<reg51.h> ///包含頭文件
- #include<absacc.h>
- #define gew DBYTE[0X40] ///定義顯示緩沖區 個位
- #define shiw DBYTE[0X41] //////////////////十位
- #define baiw DBYTE[0X42] //////////////////百位
- #define qianw DBYTE[0X43] //////////////////千位
- #define unint unsigned int ///自定義變量
- #define uchar unsigned char
- sbit in1=P3^0; ///控制位定義
- sbit in2=P3^1;
- sbit ena=P3^7;
- uchar code zm[12]={0Xc0,0Xf9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0x73,0x71};///在程序存儲區定義字型碼表
- uchar code wm[4]={0xfe,0xfd,0xfb,0xf7};///在程序存儲區定義字位控制碼表***選位
- uchar a=8; ///占空比控制字
- uchar n=1; ///速度增減量一
- uchar m=2; ///速度增減量二
- unint speedbuf=0; ///速度值
- uchar zc=0;
- unint ys=0;
- key(); ///子函數聲明
- display();
- control();
- delays();
- speedcan();
- ///*************************************************************************************************************
- ///主函數
- ///*************************************************************************************************************
- main()
- {
- gew=shiw=baiw=qianw=0; ///顯示初始化
- P0=0xc0;
- P2=0;
- in1=0; ///電機控制的初始化
- in2=0;
- ena=1;
- TMOD=0X15; ///定時器1為定時模式,使用方式2;定時器0為計數模式,使用方式2
- TH1=0Xfa; ///裝定時器初值
- TL1=0X24;
- TH0=0; ///裝計數器初值
- TL0=0;
- EA=1; ///開總中斷
- ET0=1; ///允許定時器0中斷
- ET1=1; ///允許定時器1中斷
- TR0=1; ///開計數器
- TR1=1; ///開定時器
- while(1) ///無限循環
- {
- key(); ///調用按鍵掃描程序
- control(); ///調用電機控制程序
- display(); ///調用顯示程序
- speedcan(); ///調用速度處理程序
- }
- }
- ///*************************************************************************************************************
- ///中斷處理程序,實現輸出方波占空比控制
- ///*************************************************************************************************************
- timer_1() interrupt 3 using 1 ///定時器1中斷,使用寄存器組1
- {
- TR1=0; ///停止定時
- zc++; ///中斷次數加1
- ys++;
- control();
- speedcan();
- TH1=0Xfa; ///重裝定時初值
- TL1=0X24;
- TR1=1;
- }
- ///************************************************************************************************************
- ///脈寬控制程序,實現PWM的輸出
- ///***********************************************************************************************************
- control()
- {
- if(zc==a)
- {
- ena=0;
- }
- if(zc==15)
- {
- zc=0;
- ena=1;
- }
- }
- ///*****************************************************************************************************************
- ///顯示子函數,顯示當前電機的速度
- ///****************************************************************************************************************
- display()
- {
- uchar i;
- gew=speedbuf%10; ///求速度個位值送各位顯示緩沖
- shiw=(speedbuf/10)%10; ///求速度十位值送十位顯示緩沖
- baiw=(speedbuf/100)%10; ///求速度百位值送百位顯示緩沖
- qianw=speedbuf/1000; ///求速度千位值送千位顯示緩沖
- for(i=0;i<4;) ///循環選中數碼管的每一位
- {
- P2=wm[i];
- if(i==0) ///顯示個位
- {
- P0=zm[gew];
- delays();
- }
- else if(i==1) ///顯示十位
- {
- P0=zm[shiw];
- delays();
- }
- else if(i==2) ///顯示百位
- {
- P0=zm[baiw];
- delays();
- }
- else if(i==3) ///顯示千位
- {
- P0=zm[qianw];
- delays();
- }
- i++;
- }
- }
- ///**********************************************************************************************************
- ///讀速度值子函數,從計數器0中讀計數值,經過計算,求出當前速度值
- ///*************************************************************************************************************
- speedcan()
- {
- if(ys==500)
- {
- TR0=0; ///停止計數
- speedbuf=((TH0*256+TL0)*8)/3;///讀計數器
- ys=0;
- TH0=0; ///重裝計數初值
- TL0=0;
- TR0=1; ///開計數器
- }
- }
- ///*********************************************************************************************************
- ///延時子函數
- ///***********************************************************************************************************
- delays()
- {
- uchar i;
- for(i=80;i>0;i--);
- }
- ///************************************************************************************************************
- ///鍵盤掃描子函數,實現電機的方向 速度的控制
- ///*********************************************************************************************************
- key()
- {
- uchar i;
- P1=0xff; ///拉高P1口的電平
- i=P1; ///讀P1口
- if(i==0xfe) ///第一個鍵按下
- { delays(); ///延時去抖動
- if(i==0xfe) ///再判斷按鍵是否按下
- {
- in1=0; ///電機順時針轉動
- in2=1;
- }
- }
- if(i==0xfd) ///第二個鍵是否按下
- {
- delays(); ///延時去抖動
- if(i==0xfd) ///再判斷按鍵是否按下
- {
- in1=1; ///電機逆時針轉動
- in2=0;
- }
- }
- if(i==0xfb) ///第三個鍵是否按下
- {
- delays();
- if(i==0xfb)
- {
- a=a+n; ///速度加((慢速)
- if(a>=15)
- a=15;
- }
- }
- if(i==0xf7)
- {
- delays();
- if(i==0xf7)
- {
- if(a>3) ///速度減(慢速)
- a=a-n;
- else
- a=3;
- }
- }
- if(i==0xef)
- {
- delays();
- if(i==0xef)
- {
- a=a+m; ///速度加,(快速)
- if(a>=15)
- a=15;
- }
- }
- if(i==0xdf)
- {
- delays();
- if(i==0xdf)
- if(a>3) ///速度減,(快速)
- a=a-m;
- else
- a=3;
- }
- if(i==0xbf)
- {
- delays();
- if(i==0xbf)
- {
- in1=0; ///停止轉動
- in2=0;
- }
- }
- if(i==0x7f)
- {
- delays();
- if(i==0x7f)
- a=5; ///回到中間速度
- }
- while(P1!=0xff); ///等待按鍵放下
- }
復制代碼
所有資料51hei提供下載:
直流電機的pwm控制.rar
(162.44 KB, 下載次數: 158)
2018-11-3 00:32 上傳
點擊文件名下載附件
|