51单片机——直流电机驱动PWM

目录

 

一、功能描述

二、主要模块介绍

2.1 直流电机

2.1.1 直流电机外部

2.2 PWM介绍

 2.2.1 产生PWM的方法

 三、测试文件test.c

四、效果演示


一、功能描述

        利用定时器产生PWM,对直流电机进行调速。

二、主要模块介绍

2.1 直流电机

        直流电机是一种将电能转换为机械能的装置。一般直流电机有两个电极,电极正接时,电机正转;电极反接时,电机反转。

2.1.1 直流电机外部

50ca7c9b32e14c339b0c2d11d5536f18.png

芯片内部: 

b19f4e3eccf24ddbb7cde1b07ef06fe4.jpeg

        ULN2003D就是采用第一种方式直接驱动电机。电机的一根线连接在 VCC 上,另一根连接在 OUT1 上,因此可通过单片机 P1.0 口输出高电平来控制电机旋转,输出低电源控制电机停止。

2.2 PWM介绍

​         脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在电机控速、开关电源领域中。

  • 频率=1/Ts
  • 占空比=Ton/Ts
  • 精度=占空比变化步距

    e8cde4dbddea4e82bfd57182aee90524.jpeg

 2.2.1 产生PWM的方法

391224c47dd94f03a32681abd84e8175.jpeg

  1. 用计数器,定时自增。
  2. 设置一个比较值。

 三、测试文件test.c

#include <REGX52.H>
#include"Timer0_Init.h"
#include"Displaytube.h"
#include"IndependentKey.h"
sbit motor=P1^0;
unsigned char counter,setnum;
int main()
{
	unsigned char keynum,temp=0;
	Timer0_Init();
	setnum=100;
	while(1)
	{
		 keynum=key();		 
		 if(keynum!=0)
		 {	  
		 	 if(keynum==1){setnum=100;}
			 if(keynum==2){setnum=50;}
			 if(keynum==3){setnum=25;}
			 if(keynum==4){setnum=0;}
			   Set_Nixiesegs(8,keynum); 
		 }
		
	}

}
void Timer0_ISR() interrupt 1
{	
	static int count1,count2=0;
	count1++;
	count2++;
	counter++;
	TH0=0xFF; //100us
	TL0=0xA4;
	if(count1==200)
	{
		count1=0;
		Key_Loop();	
	} 
	if(count2==20)
	{
		count2=0;
		Nixie_Loop();
	}
	if(counter>=100){counter=0;}
	if(counter>=setnum)
	{
		 motor=1;
	}
	else
	{
		 motor=0;
	}
}

四、效果演示

        分别按下独立键盘key1,key2,key3,key4,4档调速。

猜你喜欢

转载自blog.csdn.net/ssssshhbh/article/details/129289927