(十五)51单片机——呼吸灯与直流电机调速(PWM)

 

目录

学习目标

成果展示 

引言

代码

硬件知识

介绍

驱动电路

大功率器件直接驱动 

H桥驱动

PWM介绍

产生PWM

模型结构

波形 

代码 

总结 


学习目标

        今天我们的学习目标就是实现一个简单的呼吸灯,之后再用PWM实现直流电机的调速功能,驱动我们的电机,制造一个可以调速的小电风扇。

成果展示 

呼吸灯

直流电机

引言

        首先,我们要解决一个问题,就是我们如何去调节LED灯的亮度?第一时间想到的肯定是调电压,只要电压低,亮度不久下来了吗?确实是这样的,但是在单片机中调节电压不现实,所以我们采用让灯亮一下,灭一会,我们通过控制供电的时间,来达到控制LED灯的亮度。其实PWM也是这样类似的思想,那我们从控制灯的亮度开始,来慢慢理解PWM的工作原理吧!

代码

#include <REGX52.H>

sbit LED = P2^0;

void Delay(unsigned int t)
{
	while(t--);
}

void main(){
	unsigned int Time,i;
	while(1){
		for(Time = 0; Time < 100; Time++){//改变亮灭时间,由暗到亮
			for(i = 0; i < 20; i++){//计次延时
			LED = 0;//LED亮
			Delay(Time);	//延时Time
			LED = 1;//LED灭
			Delay(100 - Time);//延时100-Time
		}
	}
		
	for(Time = 100; Time > 0; Time--){//改变亮灭时间,由亮到暗
			for(i = 0; i < 20; i++){
			LED = 0;
			Delay(Time);
			LED = 1;
			Delay(100 - Time);
		}
	}
	}
}

        运行结果如上所示,起到了控制LED灯亮度的功能。 

硬件知识

介绍

  • 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转
  • 直流电机主要由永磁体(定子)、线圈(转子)和换向器组成
  • 除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等

驱动电路

大功率器件直接驱动 

        ULN2003D在我们之前介绍过,后面那个相当三极管,起到放大电路的作用,下面的二极管起到保护电路的作用,因为电机可能感应出来比较大电压,从而烧坏电路,

 

H桥驱动

        就是通过导通Q1、Q4形成正向电流或者Q2、Q3形成反向电流,但就是需要确保反向电流不会损坏电路。

 

PWM介绍

  • PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域
  • PWM重要参数:

     频率 = 1 / TS            占空比 = TON / TS           精度 = 占空比变化步距

        其实就是通过不断给电压,不给电压,来调节频率,和之前的呼吸灯类似。 

 

产生PWM

模型结构

波形 

 

        其实核心原理还是一样的,只不过我们使用定时器来实现PWM。我们结合我们的代码来理解要好一点。 

代码 

#include "Nixie.h"
#include "Time0.h"

sbit Motor = P1^0;

unsigned char Counter,Compare;//计数值和比较值,用于输出PWM
unsigned char KeyNum,Speed;

void main(){
	Timer0_Init();
	Compare = 4;
	while(1){

		KeyNum = Key();
		if(KeyNum == 1){
			Speed++;
			Speed %= 4;
			if(Speed==0){Compare=0;}	//设置比较值,改变PWM占空比
			if(Speed==1){Compare=45;}
			if(Speed==2){Compare=70;}
			if(Speed==3){Compare=90;}
		}
		Nixie(1,Speed);
	}
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0xAD;		//设置定时初始值
	TH0 = 0xFF;
	Counter++;
	Counter%=90;
	if(Counter < Compare){
		Motor = 1;
	}else
	Motor = 0;
}

总结 

        总体来说本节知识不难,希望对大家有所帮助,如果有错误也希望能及时指出,谢谢大家。 

  • 10
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
呼吸灯是一种常见的LED灯光效果,它可以让LED灯逐渐亮起或熄灭,模拟呼吸的效果。在51单片机中,可以使用PWM(脉冲宽度调制)技术来实现呼吸灯效果。 以下是51单片机实现PWM呼吸灯的步骤: 1. 确定使用的IO口,将其设置为输出模式。 2. 初始化定时器,设置定时器的工作模式和定时器的时钟源。 3. 配置PWM输出模式,设置占空比和PWM输出频率。 4. 进入主循环,不断调整PWM占空比,实现呼吸灯效果。 具体实现代码如下: ``` #include <reg51.h> #define uint unsigned int #define uchar unsigned char // 定义LED灯控制IO口 sbit LED = P0^0; // 定义PWM输出占空比和周期 uchar pwmDuty = 0; uchar pwmPeriod = 100; // 定义定时器计数器初值 uint timerCount = 0; // 定时器中断服务程序 void timer() interrupt 1 { TH0 = (65536 - 1000) / 256; TL0 = (65536 - 1000) % 256; timerCount++; if (timerCount >= pwmPeriod) { timerCount = 0; } if (timerCount < pwmDuty) { LED = 1; } else { LED = 0; } } void main() { // 定时器初始化 TMOD = 0x01; // 定时器0工作在模式1 TH0 = (65536 - 1000) / 256; TL0 = (65536 - 1000) % 256; EA = 1; // 允许中断 ET0 = 1; // 允许定时器0中断 TR0 = 1; // 启动定时器0 // PWM输出模式初始化 pwmDuty = 0; pwmPeriod = 100; LED = 0; while (1) { // 调整PWM占空比,实现呼吸灯效果 for (pwmDuty = 0; pwmDuty <= pwmPeriod; pwmDuty++) { for (uint i = 0; i < 5000; i++); // 延时 } for (pwmDuty = pwmPeriod; pwmDuty >= 0; pwmDuty--) { for (uint i = 0; i < 5000; i++); // 延时 } } } ``` 在以上代码中,定时器使用的是定时器0,并且工作在模式1下,也就是每隔1ms产生一次中断。在中断服务程序中,通过计数器来控制LED灯的亮灭状态,从而实现PWM输出。在主循环中,不断调整PWM占空比,实现呼吸灯效果。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值