STC89C52学习笔记(十一)

本文详细介绍了直流电机的工作原理、驱动电路(包括三极管直接驱动和H桥驱动)、PWM调速技术,以及如何通过定时器实现LED亮度控制和呼吸灯效果,以STC89C52单片机为例进行讲解。
摘要由CSDN通过智能技术生成

STC89C52学习笔记(十一

综述:本文讲述了直流电机以及PWM调速。

一、直流电机

1、特点

(1)直流电机能将电能转化位机械能。

(2)直流电机有两个电极,电极正接时,电机正转;电极反接时,电机反转。

(3)电机的功率比较大,不可以直接接在单片机的IO口上,需要在IO口和电机之间接驱动电路。

2、常见的两种驱动电路

(1)直接驱动电路:电机只能固定一个方向转动。

①三极管直接驱动

电路原理:如果IN输入低电平,三极管导通,电流从电源流向三极管流向电机。当IN输入高电平时,三极管截止,电流不导通,而由于电机是一个感性元件,电流不能突变,于是,电机会产生一个极大的电压,这时,电机和三极管产生对抗:当电机的感性很大时,三极管击穿或者IO击穿,对电路的稳定性和安全性造成影响。所以这里必须要有二极管,做续流二极管的作用,可以在三极管断开时,和电机形成回路,使电机的电流流向二极管,逐渐消耗电流,达到保护电路的作用。

(拓展:如果电路中有电感元件,由于电流不能突变,那么可能会产生一个高于电源的电压,产生巨大的危险。)

②ULN2003驱动电路

ULN2003驱动电路也是只能使电机往一个方向转动的电路。由于ULN2003内部相当于有达林顿管,也能够达到保护电路的作用,左移可以直接在芯片外部接电机(Vcc接电机正极,OUT1接电机负极),当P10为高电平时,OUT1输出为低电平,电机转动。

(2)H桥驱动电路:电机可以向两个方向转动。

IN1和IN4导通,IN2和IN3断开时,电机正转;IN2和IN3导通,IN1和IN4断开时,电机反转。这里由于电机既能正转,又能反转,所以不需要加续流二极管,也能具有很强的耐压性。

二、PWM

1、PWM调速原理

通过控制开关断开闭合来控制电机速度(脉冲宽度调制)。由于PWM在开关断开时不会立马停止,所以,当单片机快速断开开关,再打开开关时,电机还是转动的,而且,电机会以一个比一直闭合开关小的速度在转动。当电机断开的时间占比越大时,速度就会越小,因此,可以通过控制开关断开闭合时间来控制电机的速度。(类似于开关电源的原理,开关电源是控制开关断开闭合时间来控制输出电压。)

注意:需要在惯性系统里!

2、PWM相关参数

Ts是周期,Ton是高电平时间,Toff是低电平时间。频率f=1/Ts,占空比=Ton/Ts,精度=占空比变化布距(一般会保证调制时间一样的情况下来调整占空比,不同也行)

三、代码

1、LED不同亮度

(1)直接给LED赋值来实现
While(1)

{

  LED=0;

  LED=1;

  LED=1;

  LED=1;

  LED=1;

  LED=1;

  LED=1;


}
(2)利用延时函数来实现
While(1)

{

  LED=0;

  Delay(5);

  LED=0;

  Delay(95);

}
(3)利用定时器来实现

思路:将LED置0(也可以是1,那么结果就会反过来),然后定时器中设置变量进行计数,在变量未达到比较值时,LED始终保持0的状态,即亮灯状态(LED在低电平时为亮灯状态),当超过比较值后,产生中断,LED置1,待计数值达到最高限度(这里可以看成周期)之内,LED始终为1,即灭灯状态,待计数达到最高限度后,计数会重新开始,LED为0,也即是循环之前的操作。这种循环使LED能够维持它的亮度。这里可以通过改变比较值来改变占空比,从而改变LED灯的亮度。

(利用定时器和计数器来实现计数,再通过计数的值和比较值相比来实现置1还是置0,实现LED占空比,最终实现改变比较值的大小就能控制LED亮度。)

void Timer0_Routine()  interrupt 1
{
  TL0=0x9C;
  TH0=0xFF;
  Counter++;
  Counter%=100;
  if (Counter<Compare)
  {
    LED=0
  }
  else
  {
    LED=1;
  }
}

2、LED呼吸灯

(1)在while里运用for循环和延时函数

思路:

①使LED亮一小段时间,灭一小段时间,使LED达到一种亮度;

②延长①状态相应的时间,呈现维持LED亮度的现象;

③慢慢增加LED高电平的时间,呈现LED慢慢变亮的现象;

④再慢慢减少LED高电平的时间,呈现LED慢慢变暗的现象;

⑤循环增加LED高电平的时间与减少LED高电平的时间,呈现LED慢慢变暗后又慢慢变亮的,达到一种呼吸灯的效果。

while(1)
	{
		for(Time=0;Time<100;Time++)		
		{
			for(i=0;i<20;i++)			
			{
				LED=0;					
				Delay(Time);			
				LED=1;					
				Delay(100-Time);		
			}
		}
		for(Time=100;Time>0;Time--)		
		{
			for(i=0;i<20;i++)			
			{
				LED=0;					
				Delay(Time);			
				LED=1;					
				Delay(100-Time);		
			}
		}
	}
}

(2)利用定时器

由于(1)需要不断进行for循环和Delay,占用太多CPU资源,于是可以利用定时器来实现减少CPU资源浪费。


参考视频:51单片机学习.视频

侵权联系删除!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值