目录
目的/效果
1:电机转速同步LED呼吸灯
2 通过独立按键 控制直流电机转速。
一,STC单片机模块
二,直流电机
2.1 简介
2.2 驱动电路
2.2.1 大功率器件直接驱动
2.2.2 H桥驱动
正转
反转
2.2.3 ULN2003D 引脚、电路
2.3 PWM(脉冲宽度调制)
2.3.1 什么是PWM
2.3.2 PWM的频率
2.3.3 PWM的周期
2.3.4 占空比
2.3.5 PWM的主要用途
2.4 控制流程
2.4.1 模拟LED呼吸灯控制电机转速
2.4.2 独立按键控制电机转速(类似于电风扇档位切换)
三,创建Keil项目
四,代码
4.1 电机转速同步LED呼吸灯
4.2 独立按键对电机调速
五,代码编译、下载到51单片机
目的/效果
1:电机转速同步LED呼吸灯
2 通过独立按键 控制直流电机转速。
K1:降低速度
K2:增大速度
一,STC单片机模块
二,直流电机
2.1 简介
直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转 。直流电机主要由永磁体(定子)、线圈(转子)和换向器组成 。除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等。
2.2 驱动电路
2.2.1 大功率器件直接驱动
电路图
这种只能朝一个方向转。
电路导通图
这里为什么有个续流二极管,因为电机、继电器 都是电感(物理惯性导致电路电压超过电源电压)元件 。
在断开电路瞬间,会产生很高的电压。对晶体管有击穿损伤。我们来看断开瞬间的电流方向。
有了这个续流二极管,可以形成回路,降低对晶体管的击穿损害
2.2.2 H桥驱动
形状像“H”所以称为H桥,可以实现程序控制电机正传和反转
正转
反转
2.2.3 ULN2003D 引脚、电路
这里我们将VCC接电机一个引脚,P10引脚对应OUT1,
将P10引脚输出0 (高电平)电机转动
将P10引脚输出1 (低电平)电机停止转动
断开瞬间电流方向
其内部基本电路是达林顿管
2.3 PWM(脉冲宽度调制)
本节与《51单片机STC89C52RC——10.1 LED呼吸灯-CSDN博客》保持一致。
2.3.1 什么是PWM
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
2.3.2 PWM的频率
是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);
也就是说一秒钟PWM有多少个周期
单位: Hz
表示方式: 50Hz 100Hz
2.3.3 PWM的周期
T=1/f
周期=1/频率
50Hz = 20ms 一个周期
如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期
2.3.4 占空比
是一个脉冲周期内,高电平的时间与整个周期时间的比例
单位: % (0%-100%)
表示方式:20%
周期为T
T1为高电平时间
T2 为低电平时间
假设周期T为 1s 那么频率就是 1Hz 那么高电平时间0.5s ,低电平时间0.5s 总的占空比就是 0.5 /1 =50%
控制LED的通断时间比例,占空比。如下图
2.3.5 PWM的主要用途
PWM对电机转速的控制
占空比可以实现对电机转速的调节,我们知道,占空比是高电平在一个周期之中的比值,高电平的所占的比值越大,占空比就越大,对于直流电机来讲,电机输出端引脚是高电平电机就可以转动,当输出端高电平时,电机会转动,但是是一点一点的提速,在高电平突然转向低电平时,电机由于电感有防止电流突变的作用是不会停止的,会保持这原有的转速,以此往复,电机的转速就是周期内输出的平均电压值,所以实质上我们调速是将电机处于一种,似停非停,似全速转动又非全速转动的状态,那么在一个周期的平均速度就是我们占空比调出来的速度了,
在电机控制中,电压越大,电机转速越快,而通过PWM输出不同的模拟电压,便可以使电机达到不同的输出转速
当然,在电机控制中,不同的电机都有其适应的频率 频率太低会导致运动不稳定,如果频率刚好在人耳听觉范围,有时还会听到呼啸声。频率太高的电机可能反应不过来
正常的电机频率在 6-16kHZ之间为好
PWM对舵机的控制
舵机的控制就是通过一个固定的频率,给其不同的占空比的,来控制舵机不同的转角
舵机的频率一般为频率为50HZ,也就是一个20ms左右的时基脉冲,而脉冲的高电平部分一般为0.5ms-2.5ms范围。来控制舵机不同的转角
500-2500us的PWM高电平部分对应控制180度舵机的0-180度
以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
2.4 控制流程
2.4.1 模拟LED呼吸灯控制电机转速
与LED呼吸灯控制方式相同,分为两个阶段:
第一阶段:由暗到亮。就是输出占空比由0%到100%以1%为间隔递增,共100个周期。
第二阶段:由亮到暗。就是输出占空比由100%到0%以1%为间隔递减,共100个周期。
这里我们直接复用LED呼吸灯的代码。加一个电机供电引脚的输出。
for(Time=0;Time<100;Time++) //改变亮灭时间,由暗到亮
{
for(i=0;i<20;i++) //计次延时
{
LED=0; //LED亮
Motor=1; //电机转
Delay(Time); //延时Time
LED=1; //LED灭
Motor=0; //电机停
Delay(100-Time); //延时100-Time
}
}
for(Time=100;Time>0;Time--) //改变亮灭时间,由亮到暗
{
for(i=0;i<20;i++) //计次延时
{
LED=0; //LED亮
Motor=1; //电机转
Delay(Time); //延时Time
LED=1; //LED灭
Motor=0; //电机停
Delay(100-Time); //延时100-Time
}
}
2.4.2 独立按键控制电机转速(类似于电风扇档位切换)
通过独立按键调整占空比,每个档位固定一个占空比,实现电风扇档位切换。
三,创建Keil项目
详细参考:51单片机STC89C52RC——创建Keil项目-CSDN博客
四,代码
代码详情 请参考 STC89C52RC: 51单片机学习资料、代码
4.1 电机转速同步LED呼吸灯
#include <REGX52.H>
sbit LED=P2^0; //LED 呼吸灯
sbit Motor=P1^0; //电机供电
/**
* 函 数:延时函数
* 参 数:无
* 返 回 值:无
*/
void Delay(unsigned int t)
{
while(t--);
}
/**
* 函 数:主函数
* 参 数:无
* 返 回 值:无
*/
void main()
{
unsigned char Time,i;
while(1)
{
for(Time=0;Time<100;Time++) //改变亮灭时间,由暗到亮
{
for(i=0;i<20;i++) //计次延时
{
LED=0; //LED亮
Motor=1; //电机转
Delay(Time); //延时Time
LED=1; //LED灭
Motor=0; //电机停
Delay(100-Time); //延时100-Time
}
}
for(Time=100;Time>0;Time--) //改变亮灭时间,由亮到暗
{
for(i=0;i<20;i++) //计次延时
{
LED=0; //LED亮
Motor=1; //电机转
Delay(Time); //延时Time
LED=1; //LED灭
Motor=0; //电机停
Delay(100-Time); //延时100-Time
}
}
}
}
4.2 独立按键对电机调速
#include <REGX52.H>
#include "Timer0.h"
#include "key.h"
#include "LCD1602.h"
#include "Delay.h"
unsigned char Counter,//计数器
KeyNum,//按键值
Speed=1,//档位
Compare=35;//占空比
/**
* 函 数:主函数
* 参 数:无
* 返 回 值:无
*/
void main()
{
Timer0_Init(); //初始化定时器
LCD_Init();
while(1)
{
LCD_ShowNum(1,1,Speed,3);
KeyNum=GetKey();
if(KeyNum==1)
{
Speed--;
}
else if(KeyNum==2)
{
Speed++;
}
Speed=Speed%5;
if(Speed==0)Compare=0;
if(Speed==1)Compare=35;
if(Speed==2)Compare=50;
if(Speed==3)Compare=75;
if(Speed==4)Compare=100;
}
}
/**
* 函 数:定时器0中断函数
* 参 数:无
* 返 回 值:无
*/
void Timer0_Routine() interrupt 1
{
TL0 = 0x91; //设置定时初值
TH0 = 0xFF; //设置定时初值
Counter++;
Counter%=100;
if(Counter>=Compare)
{
P2_0=1;//led 熄灭
P1_0=0;//电机断电
}
else {
P2_0=0;//led 亮起
P1_0=1;//电机通电
}
}
五,代码编译、下载到51单片机
代码编译请参考
《51单片机STC89C52RC——代码编译-CSDN博客》
代码下载请参考
《51单片机STC89C52RC——STCAI-ISP代码下载-CSDN博客》