proteus中led灯在哪
Proteus LED灯的说明——解决仿真中LED灯无法呈现呼吸灯效果的问题
- 前言
- 问题
- 问题1,LED灯不亮或只会闪烁
- 伪解决方法(同时进阶问题2)
- 问题2,LED灯只会常亮
- 绕过该问题核心的其他解决方法
- 问题解决方法的探索过程
- 最简单的LED模型
- LED的设置界面
- 解决方法
- 最终成效
- 关于批量修改元件参数的教程
- 总结
前言
这段时间,在用Proteus做一个项目,用到了PWM调制。想用PWM做一个呼吸灯,LED灯要么是常亮,要么是不亮,弄得我头疼。上网查询甚久,都没找到合适的解决方法(有一个是使用外置电路+PWM调制让LED呈现呼吸灯的效果,后面会放这个电路图)。我想就仅仅使用LED灯+PWM调制呈现,但是一直很难找到解决方法。但仔细想想,不对啊,Proteus这么出名的仿真软件,怎么可能连这个小功能都做不到?一定是哪里出了问题,后面我开始自己捣鼓。终于,功夫不负苦心人,我在尝试了十几次后,终于找到了解决方法。在贴上解决方法之前,我先把问题和其他人的解决方法放上来。
问题
问题1,LED灯不亮或只会闪烁
在加入了PWM脉冲源后,当频率较低时,LED灯只会闪烁,当频率变高后,不管你脉冲宽度为多少,LED灯干脆不亮了。如下面这两张动图。
伪解决方法(同时进阶问题2)
那是因为LED的元件设置为数字模式,没有设置为模拟模式,所以把这个设置成模拟模式即可。
问题2,LED灯只会常亮
设置成模拟模式后,当你脉冲宽度设置得稍微高了一些,LED灯就只会常亮了。而当你将脉冲宽度调到1%时,才能看到它的由暗到亮,由亮到暗的闪烁,但是没过多久,就又常亮了。正常来说,一般不会出现亮暗闪烁的,只会让LED变得很暗。但总体而言,还是有进步的,至少让LED有了亮暗的变化。如下图。
至此,有人选择了放弃,或绕过该问题的核心,转而寻求另一种解决方法。
绕过该问题核心的其他解决方法
这个解决方法是我在网上找到的,即使用外部电路来配合PWM实现呼吸灯效果,里面使用了PNP、NPN、电容等元器件,虽复杂,但也可行。但是对于想要让多个LED实现呼吸灯效果的人来说,算是非常非常非常复杂的。
/* 特别注意,因为在我这个的仿真中,PWM信号源就1个频率,因此无法实现呼吸灯效果,只能让LED在一个亮度等级上稳定。而他们的仿真是连接了单片机的PWM程序,相当于接了一个正弦信号源。如下图所示。*/
问题解决方法的探索过程
最简单的LED模型
从上面我们就可以看出,Proteus都可以让LED有亮暗变化了,怎么可能会在LED的呼吸灯效果上出BUG?首先让我们看看最简单的LED模型。给LED正极接一个逻辑信号源,负极接地,一个最简单的LED模型就出来了。
我们可以看到,当为高电平时,LED迅速被点亮,但是当切回低电平时,LED大概要过个两三秒的样子才会完全熄灭。不难看出,LED点亮只需很短的时间,但是熄灭却需要很久,问题就是出在这里。当PWM信号源频率过高时,会导致LED没时间熄灭。再者,即使脉冲宽度为1%,也有足够的时间点亮LED。因此,我们需要找到这个问题的核心。
LED的设置界面
从上面我们可以看出,LED设置界面有模型选择、正向电压、满载电流等。但注意,最下面还有一个“高阶属性”。
点开下拉菜单,可以看到高阶属性里有关断电阻、串联电阻(即内阻)、击穿电压、点亮最小时间。
关断电阻,我属实没弄明白,貌似和IGBT的关断电阻的作用差不多。
//更新一下
在网上查了很多关于“off resistance”的意思,有“关态电阻”、“关断电阻”、“断开电阻”、“关门电阻”、“截止电阻”等意思。我找到了一个类似的解释,放在下面,仅供参考。
串联电阻,就是LED自带的电阻阻值。
击穿电压,就是LED到多大电压就会被破坏,在仿真里就是表现为不工作。但是在Proteus里,有一个“优秀”传统,就是在一些情况下,即使你停止了仿真,LED也是照样亮。所以估计和这个差不多,当你的电压超过击穿电压时,LED灯也在亮。
点亮最小时间,即LED通电后到最亮的时间(默认设置为10ms)。所以依照之前说的,点亮只要10ms,而熄灭要2~3秒,假如按这个去弄PWM占空比…想都不敢想…
解决方法
所以解决方法大家也都猜到了,降低熄灭的时间,提高点亮的时间。(难道大家就没发现在数字模式和模拟模式下,点亮的时间都一样么?)按道理在模拟模式下应该有一个由暗到亮的过程,但是因为官方把点亮时间设定得过于短暂,因此就像瞬间点亮一样(估计是为了满足大部分人的需求吧)。
所以我们就直接去调“点亮最小时间”?错!!!因为这只是治标不治本,到后面你只会发现LED灯只是多了一个由暗到亮的过程,但是,到最亮后依旧常亮!!
因此我们真正要调整的应该是“串联电阻”!可以看到,官方为了增加点亮速度,不但调小了点亮时间,还把这个内阻调到3欧。而3欧的内阻才是真正的罪魁祸首。
//更新一下,如果调了内阻还没有亮暗的效果,可以调整点亮最小时间,将其调整至30m即可。
从网上搜索一下就可以知道,一般实物的LED灯珠,其内阻大概在200欧~300欧左右。
因此我们可以随便取个中间值,填入250欧即可。(内阻的大小会影响LED点亮的时间和熄灭的时间,建议根据正向电压和满载电流计算找到合适的阻值)
最终成效
可以看到,现在点亮的时间和熄灭的时间几乎一样。
再回过头来看之前那个由外部电路构成的呼吸灯模块,是不是觉得很麻烦。只需要修改那小小的内阻,就可以轻轻松松实现那个由许多元器件构成的呼吸灯电路。
关于批量修改元件参数的教程
可能有的人现在就要去修改了,但是一个一个点开属性表改很麻烦,我在这里分享一个批量修改元件参数的教程。
教程链接如下 ↓:
proteus如何批量修改元件参数值
总结
写了将近2000个字。也许有人会说,“妈的,不就是调整一下内阻的事情,非得扯这么多,真啰嗦”。但是我想说的是,我主要是将解决问题的思路记下来,分享给大家,过程是更为重要的,顺便也分享一些LED参数的说明。
最后再吐槽一下,
“真没想到小小的LED也有这么多东西o(╥﹏╥)o”
最近想学习下C51单片机,懒得折腾硬件了,就用proteus软件学习下,把过程记录下,希望能够帮助到想学习C51的人吧。
一、软件安装
1)proteus 8.13安装,请看这里:https://www.aliyundrive.com/s/9DRfHAQfo5G 提取码: 1d9b ,英文环境好,不用担心中文兼容性。
2)安装keil,请看这里:迪文屏幕T5L平台学习笔记一:开发环境搭建注意事项_无痕幽雨的博客-CSDN博客,说明如果仅仅是开发C51,ARM和迪文屏幕开发环境不需要搭建。
二、目录构建
我一般喜欢把和这个项目有关的资料放一个文件夹里面,创建LED文件夹(路径不要有中文),然后再里面创建4个文件夹:hardware、simulation、software、手册资料。
hardware:放置PCB工程文件,制版使用,如AD9工程。
simulation:放置仿真工程文件,如proteus工程。
software:放置软件工程文件,如:keil工程文件。
手册资料:放置本工程用到的硬件资料手册等。
三、创建proteus工程
1)file->new project,路径不要有中文。
2)选择器件,单击左方的P按钮,出现器件选择界面:
3)选择C51单片机,在搜索栏数据89C51,这你选择AT89C51RD2
双击,左侧的器件栏就会出现选中器件名称:
4)搜索LED,选择蓝色
6)选择电阻,1K:
7)选择电源和地
8)连接电路图
双击灯,修改电流为2mA,不然IO口驱动不了。
整体电路:
直接点击运行,灯就会亮:
四、创建keil工程
创建工程过程忽略,不知道的小伙伴请自行百度,要实现的功能就是灯亮1S,然后灭1S,实现闪烁。
1)写一个1ms的延时函数,这用示波器查看下,是不是1ms
代码:
- //LED
- sbit tLed1 = P2^7;
-
-
- static void delay_ms(uint16_t hwTimer)
- {
- uint16_t i = 0,j=0;
-
- for(i=0;i
- #if (11059200 == HSE_VALUE)
- j = 110;
- #elif (12000000 == HSE_VALUE)
- j = 109;
- #endif
- while(j--);
- }
- }
-
- int main(void)
- {
- //初始化
- DIS_INT();
- {
- //锁存输出
- }
- EN_INT();
-
-
- while(1){
- tLed1 = 0;
- delay_ms(1);
- tLed1 = 1;
- delay_ms(1);
- }
- }
把生产的HEX文件拷贝到仿真文件夹,然后双击单片机,选择HEX文件,这里晶振选择的12M:
运行:
从示波器看,是1MS。
修改代码:
- int main(void)
- {
- //初始化
- DIS_INT();
- {
- //锁存输出
- }
- EN_INT();
-
-
- while(1){
- tLed1 = 0;
- delay_ms(1000);
- tLed1 = 1;
- delay_ms(1000);
- }
- }
生成HEX,然后选择HEX文件,运行,即可实现1S亮,1S灭的效果。
目录
- 一、流水灯仿真图
- 二、程序编写
- 三、仿真结果
- 四、小结
一、流水灯仿真图
1、打开Proteus软件,然后点击左上角蓝色标志“isis”;
2、然后在左侧工具栏中点击“P”键选择元器件,在关键字中输入98c51,然后在“结果”栏中点击第一个,并点击确认。
在仿真界面上单击,就会把元器件放在界面上。
然后在最左侧工具栏中找到“总线模式”,在单片机的右侧画一条总线。
然后在总线和单片机之间用线依次连接(本次只用到单片机的P0口);
注意:在连接总线的时候要注意总线的每条线要一一对应。
然后在总线右侧接入不同颜色的LED灯,并接入保护电阻和电源。
总的仿真图如下:
二、程序编写
通过上篇文章安装的Keli软件进行程序的编写,把编译好的程序生成HEX文件下载到单片机中。
1、打开Keli软件,点击“Project”中的“New μVision Project”;
然后命名为“LED流水灯”,点击“保存”;
然后在“Data base”中选择“AT89C51”,点击“OK”;
然后会弹出对话框,点击“是”;
在左上角点击“File ”中选择“New”,建立新文件,会出现‘Text1;
然后把以下代码复制到文本中;
//51单片机编程常用的头文件
#include
#include
//延迟函数
void delay_ms(int a)
{
int i,j;
for(i=0;i
{
for(j=0;j<1000;j++) _nop_();
}
}
void main(void)
{
while(1)
{
P0=0xfe;
delay_ms(50);
P0=0xfd;
delay_ms(50);
P0=0xfb;
delay_ms(50);
P0=0xf7;
delay_ms(50);
P0=0xef;
delay_ms(50);
P0=0xdf;
delay_ms(50);
P0=0xbf;
delay_ms(50);
P0=0x7f;
delay_ms(50);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
因为要把程序下载到单片机中需要生成HEX文件,下面就先修改一下设置;
在Keil uVision的“Project”中点击Options for Target进入一个新的界面,首先点击Output,然后勾选Create Hex File,最后点击OK。
然后点击保存并命名为“LED流水灯.c”(需要有.c)
然后点击编译。结果显示没有错误,但是有两个警告,也显示了生成了HEX文件。
至此,编译生成的HEX文件就准备好了。
三、仿真结果
在Proteus中仿真图中双击单片机,在显示的界面中在“Program File”中选择刚刚生成的HEX 文件,点击确定。
然后点击左下角的仿真开关,结果如图:
至此,LED流水灯的仿真就结束了。
四、小结
1、本次内容在完成整个仿真实验的同时,还熟练的练习了Proteus软件仿真图的设计和Keli中程序的编译、HEX文件生成。
2、本篇内容没有很详细的介绍仿真图的连接原理,只是按照原理图进行了连接。流水灯的程序也没有进行原理解释,本次作业的重点是输入Proteus软件和Keil软件的操作和联系。
3、本次实验作业的内容主要是参考以下同学的博客才完成的,感谢。
https://blog.csdn.net/qq_43279579/article/details/108908566
上一篇: c语言数组的使用方法(c语言数组的使用方法有哪些)
下一篇: 编程软件mastercam怎么下载(编程软件mastercam下载要钱吗)