单片机学习笔记---LED呼吸灯&直流电机调速

这篇具有很好参考价值的文章主要介绍了单片机学习笔记---LED呼吸灯&直流电机调速。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

LED呼吸灯

直流电机调速

模型结构

波形

定时器初始化函数

中断函数

主程序


上一节讲了电机的工作原理,这一节开始代码演示!

我们上一篇说Ton的时间长Toff时间短电机会快,Ton的时间短Toff时间长电机会慢

单片机学习笔记---LED呼吸灯&直流电机调速,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

并且我们还要保证无论Ton和Toff哪个时间比较长,Ts都得是固定值,因为为了保证周期一定。

下面我们先做一个“呼吸灯”感受一下上一篇博客中提到的PWM的意义:

LED呼吸灯

新创建本节第一个工程:LED呼吸灯

开始代码讲解:

首先根据LED的原理图定义一下引脚,P20(LED)为0时,灯亮。

#include <REGX52.H>

sbit LED=P2^0;//D1号LED的所接的单片机引脚

如果LED亮的时长比LED灭的时长要久,那么灯看上去就比较亮,反之就比较暗。这和前面说的Ton的时间长Toff时间短电机会快,Ton的时间短Toff时间长电机会慢是类似的。并且我们要保证LED亮灭的时间是一定的,即亮灭周期一定。

void Delay(unsigned int t)//传过来一个时间
{
	while(t--);//传过来一个时间,每一次while循环都减1
}

void main()
{
	unsigned char Time,i;
	while(1)
	{
		for(Time=0;Time<100;Time++)		//改变亮灭时间,由暗到亮
		{
			//比如TIME=1时,100-Time=99,然后进去循环20次再出来
			//这时TIME=2,100-Time=98......如此循环
			for(i=0;i<20;i++)			//计次延时
			{
				//TIME+(100-TIME)等于固定值是为了保持周期是一样的
				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;					//LED亮
				Delay(Time);			//延时Time
				LED=1;					//LED灭
				Delay(100-Time);		//延时100-Time
			}
		}
	}
}

效果请看视频:

LED呼吸灯

呼吸灯就做成了,但是这种方式的缺点是显而易见的。它需要占用主循环不断地来翻转IO口来延时,在这一段时间内,也就是呼吸灯的整个过程中,主循环是没办法做其他事情的。

我们通常将PWM写到定时器里面,而且现在稍微高级一点的单片机,像STC的12系列或15系列及最新的系列都会有硬件的PWM,或者STM32单片机也会有硬件的PWM。因为不断地翻转IO口是一种比较简单但是比较占用CPU的一种操作,所以通常我们会用硬件来实现。而且硬件实现通常会寄生到定时器里面去,就是定时器既可以定时还可以兼具PWM的任务。但是我们STC89C52是没有这种功能的。所以我们就用定时器中断来实现这个功能。

直流电机调速

接下来我们开始演示第二个代码,并且是用定时器的这种方式来实现PWM。

写这个程序之前,我们先来看看产生PWM的方法。

模型结构

图中的比较值在硬件PWM里面是一个寄存器,我们可以从这个寄存器写一个固定值,那这个比较值就决定了我们的占空比(占空比 = TON / TS)。在我们的程序中可以定义一个变量,把它当做一个比较值,如果占空比不变的话,这个比较值通常也是固定的。

最终我们如何翻转IO口呢?我们就通过一个比较大小(在硬件是硬件比较器,在软件是 if 判断),将计数器的值和比较值进行比较。如果这个计数器的值小于比较值,就会输出0;如果计数器的值大于等于比较值,则输出1。当然,到底是大于输出0还是小于输出0呢,这就涉及到PWM的输出极性,在程序中是可以调节的,在硬件中也有这样相应的配置。

单片机学习笔记---LED呼吸灯&直流电机调速,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

这个模型结构和单片机里面硬件的定时器以及PWM的结构是相似的,如果理解了这个结构,以后再学那些定时器PWM就会比较简单。

我们即将会写程序来模拟这个结构,来看看它是如果产生PWM的。

我们有了这个结构之后,如果知道它怎么工作的呢?主要是看这个波形

波形

单片机学习笔记---LED呼吸灯&直流电机调速,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

PS:蓝色的波形对应的是模型结构图中的计数器那部分,它会定时自增,假设它是从0自增到100再回到0,它的波形就是这样的:

单片机学习笔记---LED呼吸灯&直流电机调速,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

这个比较值是设置值,比如说我们想设置为60(即图中的红线所示),它在时间上就是固定肯定为60的。它会和计数器的值有一个交点。如果我们再把这两个值比较大小的话,那它的输出波形,就会呈现下面这个效果:

单片机学习笔记---LED呼吸灯&直流电机调速,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

 比如第一个交点前,计数器的值小于比较值,则输出0,在PWM传输的波形图上就是0。然后第一个交点过后,计数器的值大于比较值,则输出1,在PWM传输的波形图上就是1。

如果将比较值设置为10,则PWM输出的波形也发生相应的变化,占空比会变得高一些。

单片机学习笔记---LED呼吸灯&直流电机调速,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

因此我们通过控制这个比较值就可以控制占空比。 

比较值越大,占空比越小的;比较值越小,占空比越大。我们就利用这一点来控制电机的速度。

下面开始代码讲解:

新创建一个工程:直流电机调速

把这几个程序文件添加进来(下面每一个程序在之前的博客中都讲过了,如果不懂的可以翻之前的博客来看看)

单片机学习笔记---LED呼吸灯&直流电机调速,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

然后新创建主程序main.c

根据原理图定义引脚,如果p10(Motor)=1,则电机旋转

单片机学习笔记---LED呼吸灯&直流电机调速,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "Nixie.h"
#include "Timer0.h"

sbit Motor=P1^0;

定义四个变量

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

定时器初始化函数

然后初始化定时器,但是我们之前写的定时器初始化函数是1ms中断一次太慢了,我们重新生成一个100微秒中断一次的函数。

单片机学习笔记---LED呼吸灯&直流电机调速,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

将生成的这个重装载值复制下来替换掉我们原先Timer0.c中的重装载值。

void Timer0_Init(void)
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x9C;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
	PT0=0;
}

中断函数

相应的,我们写好的中断函数里的重装载值也要改。(中断函数在之前的博客中也讲过了)

PS:这个PWM驱动电机在一定范围内是越快越好,越快越稳定,但是过快的话也没必要,这会占用资源,并且会增加开关损耗。我们通常设置在10K到20KHz的频率。如果频率比较低的话电机会抖动。如果频率在1K附近的话,电机可能会产生鸣叫。

根据模型结构图中的计数器那部分,设置它会定时自增,假设它是从0自增到100再回到0

所以将Counter设置为Counter%=100;

如果Counter=99,那99对100取余是99,
如果Counter=100,那99对100取余是0,
所以Counter%=100和If(Counter>100)Counter=0是一个效果

然后我们将计数器的值和比较值进行比较。

void Timer0_Routine() interrupt 1 //每100微秒进来一次
{
	TL0 = 0x9C;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	Counter++;
	Counter%=100;	//计数值变化范围限制在0~99
	//如果Counter等于100,Counter自动清零
	
	if(Counter<Compare)	//计数值小于比较值
	{
		Motor=1;		//输出1,电机旋转
	}
	else				//计数值大于比较值
	{
		Motor=0;		//输出0,电机停止
	}
}

注意:我们这里设置的极性和模型结构图上的例子是不一样的,根据原理图Motor(p10)为高电平1时,电机转动,所以我们这里设置成:当计数值小于比较值时输出1,电机旋转,反之则输出0,电机停止。所以如果比较值越大,则输出1的之间就越大,电机速度越快。

主程序

那我们要设置占空比的话只需要设置比较值Compare

void main()
{
	Timer0_Init();//定时器初始化
	while(1)
	{
		KeyNum=Key();
		if(KeyNum==1)//如果K1按下
		{
			Speed++;
			Speed%=4;//如果speed等于4,speed自动清零
			//设置速度的档次为0,1,2,3
			//比较值compare越大,速度越大
			if(Speed==0){Compare=0;}	//设置比较值,改变PWM占空比
			if(Speed==1){Compare=50;}
			if(Speed==2){Compare=75;}
			if(Speed==3){Compare=100;}
		}
		Nixie(1,Speed);//在第一个数码管上显示速度档次
	}
}

刚上电的时候电机会转一下是因为单片机默认上电时IO口都是高电平。

效果请看视频:

直流电机调速

以上就是本篇的内容,源码会放在评论区,如有问题可评论区留言!

​​​​​​​文章来源地址https://www.toymoban.com/news/detail-827896.html

到了这里,关于单片机学习笔记---LED呼吸灯&直流电机调速的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【32单片机学习】(3)霍尔编码器减速直流电机控制及测速

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1.实验现象 2.实验接线及原理图 接线图 原理图  电机接线图 3.代码部分 1.主函数  main.c 2.按键部分   key.c  key.h pwm代码   pwm.c  pwm.h 电机驱动   motor.c   motor.h  OLED显示 oled.c oled.h  编码器

    2024年02月11日
    浏览(42)
  • STM32F103RCT6开发板M3单片机教程07-TIMER1CH1输出 PWM做LED呼吸灯

    本教程使用是( 光明谷SUN_STM32mini开发板 )   免费开发板   在谷动谷力社区注册用户,打卡,发帖求助都可以获取积分,当然最主要是发原创应用文档奖励更多积分. (可用积分换取,真的不用钱,开发板免费玩):STM32F103RCT6开发板M3单片机核芯小系统板学习板 ... 已经购买用

    2024年02月22日
    浏览(47)
  • 学习笔记|基于Delay实现的LED闪烁|模块化编程|SOS求救灯光|STC32G单片机视频开发教程(冲哥)|第六集(下):实现LED闪烁

    在模块化编程里,函数使用分为如下三步: 返回值 函数名称( 入口参数 ) { 函数要执行的功能 } @返回值:没有返回值就是void @函数名称:避开(IDE中标蓝),不重复,非特殊字符随便取 @入口参数:类型+名称,多个参数“,”分开,空就写void 返回值 函数名称( 入口参

    2024年02月12日
    浏览(38)
  • 学习笔记|课后练习解答|电磁炉LED实战|逻辑运算|STC32G单片机视频开发教程(冲哥)|第八集(下):课后练习分析与解答

    增加按键3,按下后表示启动,选择的对应的功能的LED持续闪烁,表示正在工作,且在工作的时候无法切换功能。 1 增加按键3 2 按下后表示启动 电平控制 3 工作状态锁定 表示正在工作,且在工作的时候无法切换功能。 该功能需要检测的标志位,且工作的时候无法进行切换。

    2024年02月11日
    浏览(30)
  • 51单片机学习--LED流水灯

    延时代码可通过软件生成,系统频率要和开发板的晶振频率相对应。  

    2024年02月16日
    浏览(40)
  • 学习笔记|认识蜂鸣器|控制原理|电磁炉LED实战|逻辑运算|STC32G单片机视频开发教程(冲哥)|第八集(上):蜂鸣器应用

    反面包上黑胶的是有源蜂鸣器。 在背面裸露的一块线路板的是无源蜂鸣器。 YX55675-无源蜂鸣器模块的资料 提取码:nl73 1、有源蜂鸣器内部带震荡源,所以只要一通电就会叫(一边高电平,一边低电平),而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫(必须不断给高

    2024年02月11日
    浏览(39)
  • 【【51单片机直流电机调速】】

    PWM的生成方法 先用户设定一个比较值,然后计数器定时自增。 当计数器比较值,输出0 当计数器比较值,输出1

    2024年02月15日
    浏览(33)
  • 51单片机学习--LED点阵屏显示图形&动画

    为了通用性考虑,需要把用到的几个口用特殊位声明来重新命名,由于RCLK在头文件中已有定义,所以这里把P3^5声明成RCK吧。。这样的做法可以提高可读性 接下来编写74HC595的输入函数 执行完八次循环后数据就会存到移位寄存器里面了,接下来要输出只需要给RCLK一个高电平即

    2024年02月14日
    浏览(28)
  • 【单片机】11-步进电机和直流电机

    电能转换为动能 (1) 交流电机【大功率】 :两相【200W左右】,三相【1000W左右】 (2) 直流电机【小功率】 :永磁【真正的磁铁】,励磁【电磁铁】 (3) 步进电机【精确控制功率】,伺服电机【非常精确功率】 (1)外观 (2)接线和工作原理 在电池位置有VCC和GND (3)

    2024年02月03日
    浏览(32)
  • 基于单片机串口控制直流电机调速

    一、系统方案 (2)本设计采用STC89C5单片机作为主控器,串口控制直流电机调速,串口助手发送1-8,改变电机速度,数码管显示对应速度。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 TMOD=0x21;//定时器0工作方式1 ET1=0; SM0=0; SM1=1; REN=1; EA=1; ES=1; 2、数码管

    2024年02月12日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包