0°

(八)51进阶:直流电机与8051连接

介绍

(八)51进阶:直流电机与8051连接

直流电机

直流电动机将直流电形式的电能转换为机械能。

  • 在电动机旋转的情况下,产生的机械能是电动机轴的旋转运动的形式。
  • 通过反向通过电动机的直流电的方向,可以反转电动机轴的旋转方向。
  • 通过向其施加固定电压,电动机可以以一定速度旋转。如果电压变化,则电动机的速度会发生变化。
  • 因此,可以通过施加变化的DC电压来控制DC电动机速度; 而电动机的旋转方向可以通过反转通过它的电流方向来改变。
  • 为了施加变化的电压,我们可以使用PWM技术控制。
  • 为了反转电流,我们可以使用采用H桥技术或任何其他机制的H桥电路或电机驱动器IC。

连接图

(八)51进阶:直流电机与8051连接

带8051微控制器的直流电机接口

让我们将直流电机与AT89S52微控制器连接,并使用速度增量开关和速度减量开关通过方向开关连接到微控制器端口和方向来控制直流电机速度。

我们将使用L293D电机驱动器IC来控制两个方向的直流电机运动。它内置H桥电机驱动器。

  • 如上图所示,我们在AT89S52微控制器的P1.0和P1.1引脚上连接了两个拨动开关,将直流电机的速度改变了10%。
  • P1.2引脚上的一个拨动开关控制电机旋转方向。
  • P1.6和P1.7引脚用作输出方向控制引脚。它控制L293D电机驱动器的电机1输入引脚,通过改变其端子极性顺时针和逆时针旋转电机。
  • 通过PWM输出引脚P2.0改变直流电机的速度。
  • 这里我们使用AT89S52的定时器来产生PWM。

程序

/*
 * DC_Motor与8051连接
 * https://www.qutaojiao.com
 */
#include <reg52.h>
#include <intrins.h>

/* Define value to be loaded in timer for PWM period of 20 milli second */
#define PWM_Period 0xB7FE

sbit PWM_Out_Pin 	= P2^0;	/* PWM Out Pin for speed control */
sbit Speed_Inc 		= P1^0;	/* Speed Increment switch pin */
sbit Speed_Dec 		= P1^1;	/* Speed Decrement switch pin */
sbit Change_Dir		= P1^2;	/* Rotation direction change switch pin */

sbit M1_Pin1		= P1^6;	/* Motor Pin 1 */
sbit M1_Pin2		= P1^7;	/* Motor Pin 2 */

unsigned int ON_Period, OFF_Period, DutyCycle, Speed;

/* Function to provide delay of 1ms at 11.0592 MHz */
void delay(unsigned int count)
{int i,j;
    for(i=0; i<count; i++)
			for(j=0; j<112; j++);
}

void Timer_init()
{
	TMOD = 0x01;		/* Timer0 mode1 */
	TH0 = (PWM_Period >> 8);/* 20ms timer value */
	TL0 = PWM_Period;
	TR0 = 1;		/* Start timer0 */
}

/* Timer0 interrupt service routine (ISR) */
void Timer0_ISR() interrupt 1	
{
	PWM_Out_Pin = !PWM_Out_Pin;
	if(PWM_Out_Pin)
	{
		TH0 = (ON_Period >> 8);
		TL0 = ON_Period;
	}	
	else
	{
		TH0 = (OFF_Period >> 8);
		TL0 = OFF_Period;
	}	
			
}

/* Calculate ON & OFF period from PWM period & duty cycle */
void Set_DutyCycle_To(float duty_cycle)
{
	float period = 65535 - PWM_Period;
	ON_Period = ((period/100.0) * duty_cycle);
	OFF_Period = (period - ON_Period);	
	ON_Period = 65535 - ON_Period;	
	OFF_Period = 65535 - OFF_Period;
}

/* Initially Motor Speed & Duty cycle is zero and in either direction */
void Motor_Init()
{
	Speed = 0;
	M1_Pin1 = 1;
	M1_Pin2 = 0;
	Set_DutyCycle_To(Speed);
}

int main()
{
  EA  = 1;			/* Enable global interrupt */
  ET0 = 1;   			/* Enable timer0 interrupt */
  Timer_init();
  Motor_Init();while(1)
    {
	/* Increment Duty cycle i.e. speed by 10% for Speed_Inc Switch */
	if(Speed_Inc == 1)
		{
			if(Speed < 100)
			Speed += 10;
			Set_DutyCycle_To(Speed);
			while(Speed_Inc == 1);
			delay(200);
		}
	/* Decrement Duty cycle i.e. speed by 10% for Speed_Dec Switch */
	if(Speed_Dec == 1)
		{
			if(Speed > 0)
			Speed -= 10;
			Set_DutyCycle_To(Speed);
			while(Speed_Dec == 1);
			delay(200);
		}
	/* Change rotation direction for Change_Dir Switch */
	if(Change_Dir == 1)
		{
			M1_Pin1 = !M1_Pin1;
			M1_Pin2 = !M1_Pin2;
			while(Change_Dir == 1);
			delay(200);
		}
    }
}

本节课项目完整工程下载:

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论