标题: 以单片机为核心的PWM占空比输出的直流调速系统的风扇 [打印本页]
作者: 大大29 时间: 2017-1-11 23:45
标题: 以单片机为核心的PWM占空比输出的直流调速系统的风扇
源程序代码: 直流电机控制+速度显示
#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://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |