標題: 以單片機為核心的PWM占空比輸出的直流調速系統的風扇 [打印本頁]
作者: 大大29 時間: 2017-1-11 23:45
標題: 以單片機為核心的PWM占空比輸出的直流調速系統的風扇
圖片.png (69.79 KB, 下載次數: 98)
下載附件
仿真圖
2017-1-11 23:44 上傳
源程序代碼: 直流電機控制+速度顯示
#include<reg52.h> //頭文件
#define uchar unsigned char //宏定義
#define uint unsigned int
#define CYCLE 10 //定義PWM的周期T為10ms
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0Xff,0xc6,0x88};//0-9 R 共陽數碼管段選數據
端口定義
sbit PWM1=P1^4; //PWM輸出口1(電機正轉)
sbit PWM2=P1^3; //PWM輸出口2(電機反轉)
sbit K1=P1^0; //加速
sbit K2=P1^1; //減速
sbit K3=P1^2; //正反轉
//sbit W1=P2^3; //數碼管位選
/***************************************************/
uchar PWM_ON=0; //PWM高電平時間
uchar count=0; //中斷計時
uchar num=0;
uchar num1=0; //中斷時間計數
uint num2=0; //外部中斷次數
uchar flat=0; //正反轉標示位
uchar flag=0; //刷新數據標示位
sbit W0=P2^6; //位選口定義
sbit W1=P2^5;
sbit W2=P2^4;
sbit W3=P2^7;
函數名稱:延時子函數
函數功能:按鍵消抖
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
函數名稱:按鍵子函數
函數功能:
void key()
{
if(K1==0) //加速鍵
{
delayms(5);
if(K1==0)
{
while(!K1);
if(num<3)
num++;
}
}
if(K2==0) //減速鍵
{
delayms(5);
if(K2==0)
{
while(!K2);
if(num>0)
num--;
}
}
if(K3==0) //電機正反轉按鍵
{
delayms(5);
if(K3==0)
{
while(!K3);
flat++;
if(flat==2)
flat=0;
}
}
switch(num)
{
case 0: PWM_ON=0; break; //占空比為00%
case 1: PWM_ON=7; break; //占空比為10%
case 2: PWM_ON=8; break; //占空比為40%
// case 4: PWM_ON=7; break; //占空比為70%
case 3: PWM_ON=10; break; //占空比為100%
default:
break;
}
}
速度數據采集
void sudu()
{
uint shuju;
if(flag==1)
{
flag=0;
shuju=num2*2; //電機一秒轉的圈數
num2=0;
}
P2=0xbf;
if(flat==0)
P0=table[11]; //"C"
else
P0=table[12]; //"A"
delayms(5);
P2=0xdf;
P0=table[shuju/100];
delayms(5);
P2=0xef;
P0=table[shuju%100/10];
delayms(5);
P2=0x7f;
P0=table[shuju%10];
delayms(5);
P2=0xff;
}
void init()
{
PWM1=1; //初始化
PWM2=1;
TMOD=0x11; //打開定時器
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
EX1=1;
IT1=1;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
EA=1;
ET1=1;
TR1=1;
W0=1;
W1=1;
W2=1;
W3=1;
}
函數名稱:主函數
函數功能:
void main()
{
init();
while(1)
{
key();
sudu();
}
}
函數名稱:定時器/計數器0中斷子函數
函數功能:
void T1_time() interrupt 3
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
count++;
if(count>CYCLE)
count=0;
if(count<PWM_ON) //如果計時時間在不大于高電平時時間,電機轉
{
if(flat==0)
{
PWM1=0;
PWM2=1;
}
if(flat==1)
{
PWM1=1;
PWM2=0;
}
}
else //如果計時時間大于高電平時時間,電機停
{
PWM1=1;
PWM2=1;
}
}
void T0_time() interrupt 1 //定時器0
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num1++;
if(num1==10) //每0.5s刷新一次數據
{
num1=0;
flag=1;
}
}
void timer() interrupt 2 //外部中斷1
{
num2++;
}
作者: 吳天創 時間: 2017-1-12 11:01
學習學習
作者: faridzled 時間: 2017-1-12 19:15
thanks for sharing knowledge
作者: faridzled 時間: 2017-1-12 19:16
thanks for sharing knowledge
作者: a234358 時間: 2017-1-12 20:22
學習一下,謝謝了
作者: 迷失之吻 時間: 2017-7-24 10:55
pwm輸出輸入口在哪里呢?我用的是l289n的電機驅動!
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |