使用Proteus仿真:51单片机控制直流电机

一、直流电机及其控制

(一)直流电机:输出或输入为直流电能得旋转电机,能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。

(二)直流电机的控制

1.方向控制:直流电机只有正负极,只需交换正负极就可以调节正反转。

2.转速控制:在负载变化不大的时候,加在直流电动机两端的电压大小与其速度近似成正比。


二、PWM技术

在一里,我们大概了解电机是通过电压控制转速,正负极控制方向,可到底是怎么控制电压和正负极的呢?不得不说PWM啦。

但在说之前,还得了解一下占空比:D为PWM信号的占空比:D=t1/T(即高电平持续时间比整个周期的值)

则电动机的电枢组两端电压平均值U为:U = (t1/T)*Us=D*Us

三、使用L298驱动直流电机范例

原理图如下:


 

 原理图需要的器件如下:

 其中主要是电机,电机选MOTOR或MOTOR-DC都可,剩下的电机就不要选啦,这个之所以有这么多电机,是因为我之前试错来着,当然也可以自己康康每一个电机运行起来是什么样子的,

#include <reg52.h>

#define uint  unsigned int
#define uchar unsigned char

sbit IN1=P1^0;
sbit IN2=P1^1;
sbit ENA=P1^2; 

sbit k0=P2^0;//正转
sbit k1=P2^1;//反转
sbit k2=P2^2;//加速
sbit k3=P2^3;//减速
sbit k4=P2^4;//停止

uchar Counter=0,Compare=0;

void delay(uint n)
{
	uint i=0,j=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<120;j++);
	}
}

void Timer0_init()//100us
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x9C;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	ET0=1;
	EA=1;	
	TR0=1;
}

void main()
{
	ENA=0;
	IN1=0;
	IN2=0;//一开始让电机停止
	Timer0_init();
	Compare=50;
	while(1)
	{
		
		if(k0==0)//正转
		{
			delay(100);
			while(!k0);
            ENA=1;
			IN1=1;
			IN2=0;
		}
	  else if(k1==0)//反转
		{
			delay(100);
			while(!k1);
            ENA=1;
			IN1=0;
			IN2=1;
		}
		else if(k2==0)//加速
		{
			delay(100);
			while(!k2);
			Compare=Compare+20;
		}
		else if(k3==0)//减速
		{
			delay(100);
			while(!k3);
			Compare=Compare-20;
		}
		if(k4==0)//停止
		{
			delay(100);
			while(!k4);
			ENA=0;
			TR0=0;
			IN1=0;
			IN2=0;								
		}	
		 
	}
}

void Timer0() interrupt 1
{
	TL0 = 0x9C;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	Counter++;
	Counter%=100;
	if(Counter<Compare)//如果小于占空比
	{
		IN1=1;
	}
	else
	{
		IN1=0;
	}
}

这个代码应该是能实现效果,如果不能实现,欢迎私我讨论。

物联沃分享整理
物联沃-IOTWORD物联网 » 使用Proteus仿真:51单片机控制直流电机

发表评论