单片机

实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。

1 使用定时器/计数器实现精确延时

单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。

2 软件延时与时间计算

在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。

2.1 短暂延时

可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10 μs的延时函数可编写如下:

void Delay10us( ) {
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
}

Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。  可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用[4],以实现较长时间的延时;但需要注意,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延时时间将是42 μs,而不是40 μs。这是因为执行Delay40us( )时,先执行了一次LCALL指令(2 μs),然后开始执行第一个Delay10us( ),执行完最后一个Delay10us( )时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在Delay80us( )中两次调用Delay40us( ),则也要先执行一次LCALL指令(2 μs),然后执行两次Delay40us( )函数(84 μs),所以,实际延时时间为86 μs。简言之,只有最内层的函数执行RET指令。该指令直接返回到上级函数或主函数。如在Delay80μs( )中直接调用8次Delay10us( ),此时的延时时间为82 μs。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。

2.2 在C51中嵌套汇编程序段实现延时

在C51中通过预处理指令#pragma asm和#pragma endasm可以嵌套汇编语言语句。用户编写的汇编语言紧跟在#pragma asm之后,在#pragma endasm之前结束。

如:#pragma asm

汇编语言程序段

#pragma endasm

延时函数可设置入口参数,可将参数定义为unsigned char、int或long型。根据参数与返回值的传递规则,这时参数和函数返回值位于R7、R7R6、R7R6R5中。在应用时应注意以下几点:

◆ #pragma asm、#pragma endasm不允许嵌套使用;

◆ 在程序的开头应加上预处理指令#pragma asm,在该指令之前只能有注释或其他预处理指令;

◆ 当使用asm语句时,编译系统并不输出目标模块,而只输出汇编源文件;

◆ asm只能用小写字母,如果把asm写成大写,编译系统就把它作为普通变量;

◆ #pragma asm、#pragma endasm和 asm只能在函数内使用。

将汇编语言与C51结合起来,充分发挥各自的优势,无疑是单片机开发人员的最佳选择。

2.3 使用示波器确定延时时间

利用示波器来测定延时程序执行时间。方法如下:编写一个实现延时的函数,在该函数的开始置某个I/O口线如P1.0为高电平,在函数的最后清P1.0为低电平。在主程序中循环调用该延时函数,通过示波器测量P1.0引脚上的高电平时间即可确定延时函数的执行时间。方法如下:

sbit T_point = P1^0;
void Dly1ms(void) {
unsigned int i,j;
while (1) {
T_point = 1;
for(i=0;i<2;i++){
for(j=0;j<124;j++){;}
}
T_point = 0;
for(i=0;i<1;i++){
for(j=0;j<124;j++){;}
}
}
}
void main (void) {
Dly1ms();
}

把P1.0接入示波器,运行上面的程序,可以看到P1.0输出的波形为周期是3 ms的方波。其中,高电平为2 ms,低电平为1 ms,即for循环结构“for(j=0;j<124;j++) {;}”的执行时间为1 ms。通过改变循环次数,可得到不同时间的延时。当然,也可以不用for循环而用别的语句实现延时。这里讨论的只是确定延时的方法。

2.4 使用反汇编工具计算延时时间

用Keil C51中的反汇编工具计算延时时间,在反汇编窗口中可用源程序和汇编程序的混合代码或汇编代码显示目标应用程序。为了说明这种方法,还使用“for (i=0;i

C:0x000FE4CLRA//1T
C:0x0010FEMOVR6,A//1T
C:0x0011EEMOVA,R6//1T
C:0x0012C3CLRC//1T
C:0x00139FSUBBA,DlyT //1T
C:0x00145003JNCC:0019//2T
C:0x00160E INCR6//1T
C:0x001780F8SJMPC:0011//2T

可以看出,0x000F~0x0017一共8条语句,分析语句可以发现并不是每条语句都执行DlyT次。核心循环只有0x0011~0x0017共6条语句,总共8个机器周期,第1次循环先执行“CLR A”和“MOV R6,A”两条语句,需要2个机器周期,每循环1次需要8个机器周期,但最后1次循环需要5个机器周期。DlyT次核心循环语句消耗(2+DlyT×8+5)个机器周期,当系统采用12 MHz时,精度为7 μs。

当采用while (DlyT--)循环体时,DlyT的值存放在R7中。相对应的汇编代码如下:

C:0x000FAE07MOVR6, R7//1T

C:0x00111F DECR7//1T

C:0x0012EE MOVA,R6//1T

C:0x001370FAJNZC:000F//2T

循环语句执行的时间为(DlyT+1)×5个机器周期,即这种循环结构的延时精度为5 μs。

通过实验发现,如将while (DlyT--)改为while (--DlyT),经过反汇编后得到如下代码:

C:0x0014DFFE DJNZR7,C:0014//2T

可以看出,这时代码只有1句,共占用2个机器周期,精度达到2 μs,循环体耗时DlyT×2个机器周期;但这时应该注意,DlyT初始值不能为0。

注意:计算时间时还应加上函数调用和函数返回各2个机器周期时间。

本文章来源网络,如果原作者不支持咱们转发,请联系删除,谢谢!

围观 13

说到单片机编程,不得不说到状态机,状态机做为软件编程的主要架构已经在各种语言中应用,当然包括C语言,在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。灵活的应用状态机不仅是程序更高效,而且可读性和扩展性也很好。状态无处不在,状态中有状态,只要掌握了这种思维,让它成为您编程中的一种习惯,相信您会受益匪浅。

状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果联系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:

①现态:是指当前所处的状态。

②条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。

③动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。

④次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

如果我们进一步归纳,把“现态”和“次态”统一起来,而把“动作”忽略(降格处理),则只剩下两个最关键的要素,即:状态、迁移条件。

状态机的表示

状态机的表示要领有许多种,我们可以用文字、图形或表格的形式来表示一个状态机。

举个简单的例子:就按键处理来说,击键动作本身也可以看做一个状态机。一个细小的击键动作包含了:释放、抖动、闭合、抖动和重新释放等状态。

当我们打开思路,把状态机作为一种思想导入到程序中去时,就会找到处理疑问的一条有效的捷径。有时候用状态机的思维去思考程序该干什么,比用控制流程的思维去思考,可能会更有效。这样一来状态机便有了更实际的功用。废话不多说,实践才是检验真理的唯一标准。

几种状态机介绍

也许有人觉得状态机把问题复杂化了,其实做过软件设计的人无形之中已经在用状态机,下面就总结介绍几种状态机。

1、switch case结构状态机

switch( )
case1:
if(not反复执行状态1)
进入1状态前要做的准备
进入1状态的过程
if(not反复执行状态1)
离开状态1的过程
case2:

但这种方式不能很有效预定义所有的状态,也不能把这些状态之间的切换过程合理的定义出来,“状态”本身没有一个合理的定义,几乎是一种面向过程的方式,只过这种方式足够简单,也最容易让人接受,缺点就没有“状态”的定义和指派功能,导致状态的混乱,出现状态处理重复代码,甚至处理不一致的问题,按照OO的观念,状态描述本来就应该是一种实体。

2、ifelse语句结构状态机

这种状态机相对灵活一点,但对于一些大的项目,系统软件设计会相对复杂。

3、消息触发状态机

该类型的状态机实现方式也是很多的,形态多样,但万变不离其宗的就是状态机的4要素及现态、条件、动作、次态。

原理:一旦有消息触发,系统服务函数立即寻找所在状态的消息与消息处理函数对,找到后执行消息处理函数

步骤:

1.添加消息与消息映射

BEGIN_MESSAGE_ MAP(Name,Count) :状态机名,消息数
ADD_NEW_MSG_ITEM (Msg,OnMsg) :消息与消息处理函数
END_MESSAGE_MAP:结束

2.在这里注册
BEGIN_Register_Task:头
...
ADD_Register_Task(Name,Count):状态机名,消息数
...
END_Register_Task:尾

3.划分电子秤状态,完成以上步骤后,完成OnMsg消息处理函数。

Void OnMsg(void)
{

}

说明:以上用宏完成,具体宏是如下定义:
#defineBEGIN_MESSAGE_MAP(Name,Count)constMSG_NODE_TYP MSG_node_Array_##Name[(Count)]={
#defineADD_NEW_MSG_ITEM(Msg,OnMsg){Msg,OnMsg},
#define END_MESSAGE_MAP };
#define BEGIN_Register_Task const MSG_MAP TaskMap[TotalTask]={
#defineADD_Register_Task(Name,Count) {(MSG_NODE_TYP*)MSG_node_Array_##Name,Count},
#define END_Register_Task };

从以上代码可知:添加消息与消息映射实际上是定义消息与消息处理函数对的数组,以形成一个表;注册状态机实际上是把所有消息对数组的入口定义成一个数组,以形成一个表。

消息如何被执行

分发消息

void Default_DisposeMessage(unsigned char *pMsg)
{
unsigned chari;
unsigned charcount=TaskMap[g_Status].cItemCount;
//定位到状态表
for(i=0;i < count;i++)
{
if(*pMsg==TaskMap[g_Status].pMsgItems.msg)
//看能否匹配消息
{
TaskMap[g_Status].pMsgItems.pMsgFunc();
//找到就执行消息处理函数
return;
}
}
}

void DispatchMessage(unsigned char*pMsg)
{
if(*pMsg)
{
Default_DisposeMessage(pMsg);
}
}

核心函数:消息处理中心

void Message_Dispose_Central(void)
{
BYTE Msg;
while(GetMessage(&Msg)) //获取消息
{
TranslateMessage(&Msg); //解释消息
DispatchMessage(&Msg); //分发消息
}
}

本文转自:电子产品世界,转载此文目的在于传递更多信息,版权归原作者所有。

围观 15

1. 空闲模式

当单片机进入空闲模式时,除CPU处于休眠状态外,其余硬件全部处于活动状态,芯片中程序未涉及到的数据存储器和特殊功能寄存器中的数据在空闲模式期间都将保持原值。但假若定时器正在运行,那么计数器寄存器中的值还将会增加。单片机在空闲模式下可由任一个中断或硬件复位唤醒,需要注意的是,使用中断唤醒单片机时,程序从原来停止处继续运行,当使用硬件复位唤醒单片机时,程序将从头开始执行。

让单片机进入空闲模式的目的通常是为了降低系统的功耗,举个很简单的例子,大家都用过数字万用表,在正常使用的时候表内部的单片机处于正常工作模式,当不用时,又忘记了关掉万用表的电源,大多数表在等待数分钟后,若没有人为操作,它便会自动将液晶显示关闭,以降低系统功耗,通常类似这种功能的实现就是使用了单片机的空闲模式或是掉电模式。以STC89系列单片机为例,当单片机正常工作时的功耗通常为4mA~7mA,进入空闲模式时其功耗降至2mA,当进入掉电模式时功耗可降至0.1μA以下。

2. 休眠模式

当单片机进入掉电模式时,外部晶振停振、CPU、定时器、串行口全部停止工作,只有外部中断继续工作。使单片机进入休眠模式的指令将成为休眠前单片机执行的最后一条指令,进入休眠模式后,芯片中程序未涉及到的数据存储器和特殊功能寄存器中的数据都将保持原值。可由外部中断低电平触发或由下降沿触发中断或者硬件复位模式换醒单片机,需要注意的是,使用中断唤醒单片机时,程序从原来停止处继续运行,当使用硬件复位唤醒单片机时,程序将从头开始执行。

下面的例子演示单片机进入空闲和休眠模式,并且演示出从空闲和休眠模式中唤醒的过程。

【例】: 在TX-1C实验板上完成如下描述,开启两个外部中断,设置低电平触发中断,用定时器计数并且显示在数码管的前两位,当计到5时,使单片机进入空闲(休眠)模式,同时关闭定时器,当单片机响应外部中断后,从空闲(休眠)模式返回,同时开启定时器。

新建文件part3.4.1.c,程序代码如下:

(2)主程序中有“ET0=0;”下句是“PCON=0x02;”意思是在进入休眠模式之前要先把定时器关闭,这样方可一直等待外部中断的产生,如果不关闭定时器,定时器的中断同样也会唤醒单片机,使其退出休眠模式,这样我们便看不出进入休眠模式和返回的过程。

(3)voidex_int0()interrupt0

{
PCON=0;
ET0=1;
}

这是外部中断0服务程序,当进入外部中断服务程序后,首先将PCON中原先设定的休眠控制位清除(如果不清除,程序也可以正常运行,大家最好亲自做实验验证),接下来再重新开启定时器0。

(4)下载程序后,实验现象如下:数码管从“00”开始递增显示,到“05”后,再过一秒后,数码管变成只显示一个“5”,单片机进入休眠或空闲模式,用导线一端连接地,另一端接触P3.2或P3.3,数码管重新从“06”开始显示,递增下去。整个过程演示了单片机从正常工作模式进入休眠模式或空闲模式,然后再从休眠模式或空闲模式返回到正常工作模式。

(5)测试过程大家可将数字万用表调节到电流档,然后串接入电路中,观察单片机在正常工作模式、休眠模式、空闲模式下流过系统的总电流变化情况,经测试可发现结果如下:正常工作电流   空闲模式电流   休眠模式电流。

本文转自:畅学单片机,转载此文目的在于传递更多信息,版权归原作者所有。

围观 143

刚学单片机的学长告诉我单片机的晶振电路中就是用22pf或30pf的电容就行,听人劝吃饱饭吧,照着焊电路一切ok,从没想过为什么,知其所以然而不知其为什么所以然,真是悲哀。后来,我才懂得反思,调整,我对自己持有怎么的学习态度和应该如何付诸于行动有了新的理解,这远比单纯的交给我一些知识要好很多。

说起这个小知识点本人还有这么个经历呢也顺便和大家一块儿分享一下吧。话说我曾经帮一女生做东西,其实超级简单就是个ATMEGAL16单片机的温度采集系统,我焊工虽然一般但给女生帮忙么,还是比较用心的应该没问题的,事实却不尽人意焊出来的最小系统竟然不好使,我用万能表把电路查了几遍也没找出错误,然后就怀疑是不是单片机就锁死了,换了几块单片机也不好使,自己还一直认为我在同一届的同学中算还学得可以的,真是有点可笑,最后发现,在我原件短缺的情况下我糊里糊涂把两个0.1uf的电容焊在了晶振电路中,导致晶振不起振所以整个电路就表现为不好使,换成22pf的电容马上就好使了,当时其实应该马上弄明白,但我却没有予以理睬实属不应该。老师说得对我们确实缺少打破沙锅问到底的精神......

让我们一起来看看到底晶振电路中为什么用22pf或30pf的电容而不用别的了。

其实单片机和其他一些IC的振荡电路的真名叫“三点式电容振荡电路”,如下图


Y1是晶体,相当于三点式里面的电感,C1和C2就是电容,5404非门和R1实现一个NPN的三极管,接下来分析一下这个电路。

5404必需要一个电阻,不然它处于饱和截止区,而不是放大区,R1相当于三极管的偏置作用,让5404处于放大区域,那么5404就是一个反相器,这个就实现了NPN三极管的作用,NPN三极管在共发射极接法时也是一个反相器。

大家知道一个正弦振荡电路要振荡的条件是,系统放大倍数大于1,这个容易实现,相位满足360度,与晶振振荡频率相同的很小的振荡就被放大了。接下来主要讲解这个相位问题:

5404因为是反相器,也就是说实现了180°移相,那么就需要C1,C2和Y1实现180°移相就可以,恰好,当C1,C2,Y1形成谐振时,能够实现180移相,这个大家可以解方程等,把Y1当作一个电感来做。也可以用电容电感的特性,比如电容电压落后电流90°,电感电压超前电流90°来分析,都是可以的。当C1增大时,C2端的振幅增强,当C2降低时,振幅也增强。有些时候C1,C2不焊也能起振,这个不是说没有C1,C2,而是因为芯片引脚的分布电容引起的,因为本来这个C1,C2就不需要很大,所以这一点很重要。接下来分析这两个电容对振荡稳定性的影响。

因为5404的电压反馈是靠C2的,假设C2过大,反馈电压过低,这个也是不稳定,假设C2过小,反馈电压过高,储存能量过少,容易受外界干扰,也会辐射影响外界。C1的作用对C2恰好相反。因为我们布板的时候,假设双面板,比较厚的,那么分布电容的影响不是很大,假设在高密度多层板时,就需要考虑分布电容。

有些用于工控的项目,建议不要用无源晶振的方法来起振,而是直接接有源晶振。也是主要由于无源晶振需要起振的原因,而工控项目要求稳定性要好,所以会直接用有源晶振。在有频率越高的频率的晶振,稳定度不高,所以在速度要求不高的情况下会使用频率较低的晶振。

本文转自:玩转单片机,转载此文目的在于传递更多信息,版权归原作者所有。

围观 162

电子爱好者开始学习单片机知识,因单片机的内容比较抽象,相对电子爱好者已熟悉的模拟电路、数字电路,单片机中有一些新的概念,这些概念非常基本以至于一般作者不屑去谈,教材自然也不会很深入地讲解这些概念,但这些内容又是学习中必须要理解的,下面就结合作者的学习、教学经验,对这些最基本概念作一说明,希望对自学者有所帮助。

一、总线:

我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中,连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各器件之间的工作必须相互协调,所以就需要的连线就很多了,如果仍如同模拟电路一样,在各微处理器和各器件间单独连线,则线的数量将多得惊人,所以在微处理机中引入了总线的概念,各个器件共同享用连线,所有器件的8根数据线全部接到8根公用的线上,即相当于各个器件并联起来,但仅这样还不行,如果有两个器件同时送出数据,一个为0,一个为1,那么,接收方接收到的究竟是什么呢?这种情况是不允许的,所以要通过控制线进行控制,使器件分时工作,任何时候只能有一个器件发送数据(可以有多个器件同时接收)。器件的数据线也就被称为数据总线,器件所有的控制线被称为控制总线。在单片机内部或者外部存储器及其它器件中有存储单元,这些存储单元要被分配地址,才能使用,分配地址当然也是以电信号的形式给出的,由于存储单元比较多,所以,用于地址分配的线也较多,这些线被称为地址总线。

二、数据、地址、指令:

之所以将这三者放在一起,是因为这三者的本质都是一样的──数字,或者说都是一串‘0’和‘1’组成的序列。换言之,地址、指令也都是数据。

指令:由单片机芯片的设计者规定的一种数字,它与我们常用的指令助记符有着严格的一一对应关系,不可以由单片机的开发者更改。

地址:是寻找单片机内部、外部的存储单元、输入输出口的依据,内部单元的地址值已由芯片设计者规定好,不可更改,外部的单元可以由单片机开发者自行决定,但有一些地址单元是一定要有的(详见程序的执行过程)。

数据:这是由微处理机处理的对象,在各种不同的应用电路中各不相同,一般而言,被处理的数据可能有这么几种情况:

地址(如MOV DPTR,#1000H),即地址1000H送入DPTR。

方式字或控制字(如MOV TMOD,#3),3即是控制字。

常数(如MOV TH0,#10H)10H即定时常数。

实际输出值(如P1口接彩灯,要灯全亮,则执行指令:MOV P1,#0FFH,要灯全暗,则执行指令:MOV P1,#00H)这里0FFH和00H都是实际输出值。又如用于LED的字形码,也是实际输出的值。

理解了地址、指令的本质,就不难理解程序运行过程中为什么会跑飞,会把数据当成指令来执行了。

三、P0口、P2口和P3的第二功能用法:

初学时往往对P0口、P2口和P3口的第二功能用法迷惑不解,认为第二功能和原功能之间要有一个切换的过程,或者说要有一条指令,事实上,各端口的第二功能完全是自动的,不需要用指令来转换。如P3.6、P3.7分别是WR、RD信号,当微片理机外接RAM或有外部I/O口时,它们被用作第二功能,不能作为通用I/O口使用,只要一微处理机一执行到MOVX指令,就会有相应的信号从P3.6或P3.7送出,不需要事先用指令说明。事实上‘不能作为通用I/O口使用’也并不是‘不能’而是(使用者)‘不会’将其作为通用I/O口使用。你完全可以在指令中按排一条SETB P3.7的指令,并且当单片机执行到这条指令时,也会使P3.7变为高电平,但使用者不会这么去做,因为这通常这会导致系统的崩溃(即死机)。

来源:电工学习网:www.diangon.com
微信号:电工电气学习 dian_gon

围观 69

相对来说,plc更好学一些,更容易上手和入门。

为什么呢?因为现在的PLC基本上把应用电路都设计在了内部,所以学习的时候,可以不用花费很多心思关心电路,只需要用梯形图控制各个输出端口就可以了。而单片机呢,它的功能要比PLC强大很多,但是正如我们所知道的,功能越强大,电路就会越复杂,并且单片机的控制电路需要自己来做。另外从入门角度来看,梯形图上手要比C语言快一些。

单片机属于微控制器的一种,plc全称可编程逻辑控制器,对于是单片机好学还是plc好学,个人认为plc的入门简单更适合于新手,从编程语言、硬件、应用领域来说明下单片机好学还是plc好学。

1,编程语言plc的编程方式有这么几个,梯形图语言(LD)、指令表语言(IL)、功能模块图语言(FBD)、顺序功能流程图语言(SFC)、结构化文本语言(ST)。其中梯形图类似于继电器电路,被电气控制人员广泛接纳,新手推荐采用梯形图进行编程,而单片机的编程语言,我记得在大学时书上是用汇编语言吧,各种指令代码真看的痛不欲生啊,后边接触C语言了还好些,跑马灯程序的还隐约记得,相比于plc单片机的编程要更难一些尤其越到后面越难,需要计算机基础会更好一点。

2,单片机很便宜,整个开发板如下图,其中中的STC就是单片机的芯片,可以看到他的外设输入、输出很多。PLC很简答,输出输入两排、扩展接口,如果需要其他功能需要添加扩展模块,相比于单片机,plc的价格很贵,相对来说单片机没有plc好学,单片机看下图就知道你要了解的东西很多。

3,应用领域,单片机的使用要比plc广泛的多,几乎日常生活中的小电子产品都会有单片机,而plc几乎只在工业领域里使用,相比于单片机,plc的稳定性很强,抗干扰能力强,能满足工业生产环境的要求。

通过比较,单片机的门槛比plc高,单片机要软硬结合,要求掌握的知识内容要多,而plc相对来说就简单多了,有一些电工基础的就能快速入门。

编程的角度看,单片机一般是C语言,也有用汇编的但是相对较少了,而plc常用的是梯形图,相对而言,梯形图上手更快。但是到了后面做大型项目时,个人感觉没有太多高下之分,都挺复杂的。从成本来看,单片机相对成本低很多,因此应用的地方更多,市场上学习资料教程也很多,就业相对容易,我更加倾向于学习单片机。其实学习到了后面融会贯通后,会一通百通,学习其它东西都差不多,只是时间问题而已,而且越到后面学习效率越高。还有一点,这年头一招鲜吃遍天很难存在了,像本人之前从事的公司,一开始只有单片机,后来随着公司产品扩展转型等,逐渐对plc产生了需求,这时候又的学习plc。总之,相对而言,在一个企业里,学习能力更加重要。

1. 编程方面:可以用梯形图编程,有点像电气控制中继电器线圈和触电动作之间的关系,如果学过继电器-接触器控制的话,入门要简单的多。而单片机可以采用自带的编程语言(如51单片机的ASM语言),也可以用C语言,个人是直接用ASM语言进行小程序编写的,不算难,个人没用过C,没有发言权。

但是对于一些数据较多,逻辑关系比较复杂的程序,个人觉得单片机编程更加简单。比如控制数码显示器显示数字来说,单片机的查表指令很方便。

对于单片机和PLC来说,因为网上有很多可以借鉴的程序,因此难度是可以降低的。

2. 外部电路:PLC的外部电路更加简单,因为PLC的接口、电源、抗干扰电路都设计在了PLC的内部,使得用户在应用上更加简单。而单片机只是一个芯片,因此它的电路比较复杂,抗干扰能力不强,有时会出现信号失真,干扰过大的问题。当然这只针对初学者,大能们这些问题处理的很好。

3. 有缺点

PLC更注重于工业应用,对于防干扰、设备接口、联网、模块化都有完善的技术支撑,使用更简单,成本高。 而单片机技术含量高,使用灵活但是工作量很大的,对于抗干扰、模块化要求低,成本低廉,应用广泛。特别适合于开发消费电子、商业应用的电子、玩具、家电等等。

单片机可以构成各种各样的应用系统,从微型、小型到中型、大型都可,PLC是单片机应用系统的一个特例。小型系统用单片机更加经济。

PLC的应用领域其实主要是电气控制领域,适用范围相对较窄,而单片机在电子应用的各种领域几乎都可以用。

来源:电工学习网:www.diangon.com
微信号:电工电气学习 dian_gon

围观 184

随着单片机的频率和集成度、单位面积的功率及数字信号速度的不断提高,而信号的幅度却不断降低,原先设计好的、使用很稳定的单片机系统,现在可能出现莫名其妙的错误,分析原因,又找不出问题所在。另外,由于市场的需求,产品需要采用高速单片机来实现,设计人员如何快速掌握高速设计呢?

硬件设计包括逻辑设计和可靠性的设计。逻辑设计实现功能。硬件设计工程师可以直接通过验证功能是否实现,来判定是否满足需求。这方面的资料相当多,这里就不叙述了。硬件可靠性设计,主要表现在电气、热等关键参数上。我将这些归纳为特性阻抗、SI、PI、EMC、热设计等5个部分。

1 特性阻抗

近年来,在数字信号速度日渐增快的情况下,在印制板的布线时,还应考虑电磁波和有关方波传播的问题。这样,原来简单的导线,逐渐转变成高频与高速类的复杂传输线了。

在高频情况下,印制板(PCB)上传输信号的铜导线可被视为由一连串等效电阻及一并联电感所组合而成的传导线路,如图1所示。只考虑杂散分布的串联电感和并联电容的效应,会得到以下公式:

式中Z0即特性阻抗,单位为Ω。

PCB的特性阻抗Z0与PCB设计中布局和走线方式密切相关。影响PCB走线特性阻抗的因素主要有:铜线的宽度和厚度、介质的介电常数和厚度、焊盘的厚度、地线的路径、周边的走线等。

在PCB的特性阻抗设计中,微带线结构是最受欢迎的,因而得到最广泛的推广与应用。最常使用的微带线结构有4种:表面微带线(surface microstrip)、嵌入式微带线(embedded microstrip)、带状线(stripline)、双带线(dual-stripline)。

下面只说明表面微带线结构,其它几种可参考相关资料。

表面微带线模型结构如图2所示。

Z0的计算公式如下:

对于差分信号,其特性阻抗Zdiff修正公式如下:

公式中:

——PCB基材的介电常数;

b——PCB传输导线线宽;

d1——PCB传输导线线厚;

d2——PCB介质层厚度;

D——差分线对线边沿之间的线距。

从公式中可以看出,特性阻抗主要由、b、d1、d2决定。通过控制以上4个参数,可以得到相应的特性阻抗。

2 信号完整性(SI)

SI是指信号在电路中以正确的时序和电压作出响应的能力。如果电路中的信号能够以要求的时序、持续时间和电压幅度到达IC,则该电路具有较好的信号完整性。反之,当信号不能正常响应时,就出现了信号完整性问题。从广义上讲,信号完整性问题主要表现为5个方面:延迟、反射、串扰、同步切换噪声和电磁兼容性。

延迟是指信号在PCB板的导线上以有限的速度传输,信号从发送端发出到达接收端,其间存在一个传输延迟。信号的延迟会对系统的时序产生影响。在高速数字系统中,传输延迟主要取决于导线的长度和导线周围介质的介电常数。

当PCB板上导线(高速数字系统中称为传输线)的特征阻抗与负载阻抗不匹配时,信号到达接收端后有一部分能量将沿着传输线反射回去,使信号波形发生畸变,甚至出现信号的过冲和下冲。如果信号在传输线上来回反射,就会产生振铃和环绕振荡。

由于PCB板上的任何两个器件或导线之间都存在互容和互感,因此,当一个器件或一根导线上的信号发生变化时,其变化会通过互容和互感影响其它器件或导线,即串扰。串扰的强度取决于器件及导线的几何尺寸和相互距离。

信号质量表现为几个方面。对于大家熟知的频率、周期、占空比、过冲、振铃、上升时间、下降时间等,在此就不作详细介绍了。下面主要介绍几个重要概念。

①高电平时间(high time),指在一个正脉冲中高于Vih_min部分的时间。

②低电平时间(low time),指在一个负脉冲中低于Vil_max部分的时间,如图3所示。

③建立时间(setup time),指一个输入信号(input signal)在参考信号(reference signal)到达指定的转换前必须保持稳定的最短时间。

④保持时间(hold time),是数据在参考引脚经过指定的转换后,必须稳定的最短时间,如图4所示。

⑤建立时间裕量(setup argin),指所设计系统的建立时间与接收端芯片所要求的最小建立时间的差值。

⑥保持时间裕量(hold argin),指所设计系统的保持时间与接收端芯片所要求的最小保持时间之间的差值。

⑦时钟偏移(clock skew),指不同的接收设备接收到同一时钟驱动输出之间的时间差。

⑧Tco(time clock to output,时钟延迟),是一个定义包括一切设备延迟的参数,即Tco=内部逻辑延迟 (internal logic delay) + 缓冲器延迟(buffer delay)。

⑨最大经历时间(Tflightmax),即final switch delay,指在上升沿,到达高阈值电压的时间,并保持高电平之上,减去驱动所需的缓冲延迟。

⑩最小经历时间(Tflightmin),即first settle delay,指在上升沿,到达低阈值电压的时间,减去驱动所需的缓冲延迟。

时钟抖动(clock jitter),是由每个时钟周期之间不稳定性抖动而引起的。一般由于PLL在时钟驱动时的不稳定性引起,同时,时钟抖动引起了有效时钟周期的减小。

串扰(crosstalk)。邻近的两根信号线,当其中的一根信号线上的电流变化时(称为aggressor,攻击者),由于感应电流的影响,另外一根信号线上的电流也将引起变化(称为victim,受害者)。

SI是个系统问题,必须用系统观点来看。以下是将问题的分解。

  ◆ 传输线效应分析:阻抗、损耗、回流……

  ◆ 反射分析:过冲、振铃……

  ◆ 时序分析:延时、抖动、SKEW……

  ◆ 串扰分析

  ◆ 噪声分析:SSN、地弹、电源下陷……

  ◆ PI设计:确定如何选择电容、电容如何放置、PCB合适叠层方式……

  ◆ PCB、器件的寄生参数影响分析

  ◆ 端接技术等

3 电源完整性PI

PI的提出,源于当不考虑电源的影响下基于布线和器件模型而进行SI分析时所带来的巨大误差,相关概念如下。

◆ 电子噪声,指电子线路中某些元器件产生的随机起伏的电信号。

◆ 地弹噪声。当PCB板上的众多数字信号同步进行切换时(如CPU的数据总线、地址总线等),由于电源线和地线上存在阻抗,会产生同步切换噪声,在地线上还会出现地平面反弹噪声(简称地弹)。SSN和地弹的强度也取决于集成电路的I/O特性、PCB板电源层和地平面层的阻抗以及高速器件在PCB板上的布局和布线方式。负载电容的增大、负载电阻的减小、地电感的增大、同时开关器件数目的增加均会导致地弹的增大。

◆ 回流噪声。只有构成回路才有电流的流动,整个电路才能工作。这样,每条信号线上的电流势必要找一个路径,以从末端回到源端。一般会选择与之相近的平面。由于地电平面(包括电源和地)分割,例如地层被分割为数字地、模拟地、屏蔽地等,当数字信号走到模拟地线区域时,就会产生地平面回流噪声。

◆ 断点,是信号线上阻抗突然改变的点。如用过孔(via)将信号输送到板子的另一侧,板间的垂直金属部分是不可控阻抗,这样的部分越多,线上不可控阻抗的总量就越大。这会增大反射。还有,从水平方向变为垂直方向的90°的拐点是一个断点,会产生反射。如果这样的过孔不能避免,那么尽量减少它的出现。

在一定程度上,我们只能减弱因电源不完整带来的系列不良结果,一般会从降低信号线的串绕、加去耦电容、尽量提供完整的接地层等措施着手。

4 EMC

EMC包括电磁干扰和电磁抗干扰两个部分。

一般数字电路EMS能力较强,但是EMI较大。电磁兼容技术的控制干扰,在策略上采用了主动预防、整体规划和“对抗”与“疏导”相结合的方针。

主要的EMC设计规则有:

① 20H规则。PowerPlane(电源平面)板边缘小于其与GroundPlane(地平面)间距的20倍。

② 接地面处理。接地平面具有电磁学上映象平面(ImagePlane) 的作用。若信号线平行相邻于接地面,可产生映像电流抵消信号电流所造成的辐射场。PCB上的信号线会与相邻的接地平面形成微波工程中常见的Micro-strip Line(微带线)或Strip Line(带状线)结构,电磁场会集中在PCB的介质层中,减低电磁辐射。

因为,Strip Line的EMI性能要比Micro-strip Line的性能好。所以,一些辐射较大的走线,如时钟线等,最好走成Strip Line结构。

③ 混合信号PCB的分区设计。第一个原则是尽可能减小电流环路的面积;第二个原则是系统只采用一个参考面。相反,如果系统存在两个参考面,就可能形成一个偶极天线;而如果信号不能通过尽可能小的环路返回,就可能形成一个大的环状天线。对于实在必须跨区的情况,需要通过,在两区之间加连接高频电容等技术。

④ 通过PCB分层堆叠设计控制EMI辐射。PCB分层堆叠在控制EMI辐射中的作用和设计技巧,通过合适的叠层也可以降低EMI。

从信号走线来看,好的分层策略应该是把所有的信号走线放在一层或若干层,这些层紧挨着电源层或接地层。对于电源,好的分层策略应该是电源层与接地层相邻,且电源层与接地层的距离尽可能小,这就是我们所讲的“分层"策略。

⑤ 降低EMI的机箱设计。实际的机箱屏蔽体由于制造、装配、维修、散热及观察要求,其上一般都开有形状各异、尺寸不同的孔缝,必须采取措施来抑制孔缝的电磁泄漏。一般来说,孔缝泄漏量的大小主要取决于孔的面积、孔截面上的最大线性尺寸、频率及孔的深度。

⑥ 其它技术。在IC的电源引脚附近合理地安置适当容量的电容,可使IC输出电压的跳变来得更快。然而,问题并非到此为止。由于电容呈有限频率响应的特性,这使得电容无法在全频带上生成干净地驱动IC输出所需要的谐波功率。除此之外,电源汇流排上形成的瞬态电压在去耦路径的电感两端会形成电压降,这些瞬态电压就是主要的共模EMI干扰源。为了控制共模EMI,电源层要有助於去耦和具有足够低的电感,这个电源层必须是一个设计相当好的电源层的配对。问题的答案取决于电源的分层、层间的材料以及工作频率(即IC上升时间的函数)。通常,电源分层的间距是0.5mm(6mil),夹层是FR4材料,则每平方英寸电源层的等效电容约为75pF。显然,层间距越小电容越大。

5 热设计

电子元件密度比以前高了很多,同时功率密度也相应有了增加。由于电子元器件的性能会随温度发生变化,温度越高其电气性能会越低。

(1)数字电路散热原理

半导体器件产生的热量来源于芯片的功耗,热量的累积必定导致半导体结点温度的升高。随着结点温度的提高,半导体器件性能将会下降,因此芯片厂家都规定了半导体器件的结点温度。在高速电路中,芯片的功耗较大,在正常条件下的散热不能保证芯片的结点温度不超过允许工作温度,因此需要考虑芯片的散热问题。

在通常条件下,热量的传递通过传导、对流、辐射3种方式进行。

散热时需要考虑3种传热方式。例如使用导热率好的材料,如铜、铝及其合金做导热材料,通过增加风扇来加强对流,通过材料处理来增强辐射能力等。

简单热量传递模型:热量分析中引入一个热阻参数,类似于电路中的电阻。如果电路中的电阻计算公式为R=ΔE/I,则对应的热阻对应公式为 R = Δt/P(P表示功耗,单位W;Δt表示温差,单位℃)。热阻的单位为℃/W,表示功率增加1W时所引起的温升。考虑集成芯片的热量传递,可以使用图5描述的温度计算模型。

由上所述,可推导出

Tc=Tj-P × RJC

也就是说,当 Tc 实测值小于根据数据手册所提供数据计算出的最大值时,芯片可正常工作。

(2)散热处理

为了保证芯片能够正常工作,必须使 Tj 不超过芯片厂家提供的允许温度。根据 Tj = Ta + P × R 可知,如果环境温度降低,或者功耗减少、热阻降低等都能够使 Tj 降低。实际使用中,对环境温度的要求可能比较苛刻,功耗降低只能依靠芯片厂家技术,所以为了保证芯片的正常工作,设计人员只能在降低热阻方面考虑。

如图5所示,可变的热阻由芯片外壳与散热器间的热阻(接触热阻)、散热器到环境的热阻组成。这就要求设计人员减少接触热阻,比如选用接触热阻小的导热胶,考虑大的接触面积等。散热器方面还要选择热传导率高的散热器材,考虑使用风冷、水冷等对流散热措施,增强辐射能力,扩展散热面积等措施。 

结语

以上提到的高速单片机设计思想和方法,目前已经在国外的公司得到实践和发展,但是国内这方面的研究和实践还很少。该设计思想在我们公司实践、摸索,提高了产品可靠性。在这里推荐给各位同行,期望共同探讨。

来源:网络,电子发烧友,转载此文目的在于传递更多信息,版权归原作者所有。

围观 54

本文主要参考自《MICROCONTROLLER DESIGN GUIDELINES FOR ELECTROMAGNETIC COMPATIBILITY》,此文虽然写在多年前,不过有很多很现实的参考意义。另外别的IC厂商也有很多的参考文档,如果大家有兴趣可以参考一下。 题外话,写这个话题主要是去剖析模块内部主要的干扰源和敏感器件,通过这些主要的东西的设计来慢慢体会模块的EMC设计,不过难免有些一鳞半爪之嫌,积累 多了可能未来在设计电路的时候在前期就很容易把问题考虑周到和细致。

1. 单片机的工作频率

1.1 单片机的设计应根据客户的需求来选择较低的工作频率

首先介绍一下这样做的优点:采用低的晶振和总线频率使得我们可以选择较小的单片机满足时序的要求,这样单片机的工作电流可以变得更低,最重要的是VDD到VSS的电流峰值会更小。

当然我们这里需要做一个妥协,因为客户的要求可能是兼容的和平台化的(目前汽车电子的发展趋势就是平台化),选择较高的工作频率可以兼容更多的平台,也方便以后升级和扩展,因此要选择一个较低的可以接受的工作频率。

2. 恰当的输出驱动能力

在给定负载规范,上升和下降时间,选择适当的输出的上升时间,最大限度地降低输出和内部驱动器的峰值电流是减小EMI的最重要的设计考虑因素之一。驱动能 力不匹配或不控制输出电压变化率,可能会导致阻抗不匹配,更快的开关边沿,输出信号的上冲和下冲或电源和地弹噪声。

2.1 设计单片机的输出驱动器,首先确定模块需求的负载,上升和下降的时间,输出电流等参数,根据以上的信息驱动能力,控制电压摆率,只有这样才能得到符合模块需求又能满足EMC要求。

驱动器能力比负载实际需要的充电速度高时,会产生的更高的边沿速率,这样会有两个缺点

1. 信号的谐波成分增加了.

2. 与负载电容和寄生内部bonding线,IC封装,PCB电感一起,会造成信号的上冲和下冲。

选择合适的的di/dt开关特性,可通过仔细选择驱动能力的大小和控制电压摆率来实现。最好的选择是使用一个与负载无关的恒定的电压摆率输出缓冲器。同样的 预驱动器输出的电压摆率可以减少(即上升和下降时间可以增加),但是相应的传播延迟将增加,我们需要控制总的开关时间)。

2.2 使用单片机的可编程的输出口的驱动能力,满足模块实际负载要求。

可编程的输出口的驱动器的最简单是的并联的一对驱动器,他们的MOS的Rdson不能,能输出的电流能力也不相同。我们在测试和实际使用的时候可以选择不同的模式。实际上目前的单片机一般至少有两种模式可选择,有些甚至可以有三种(强,中等,弱)

2.3 当时序约束有足够的余量的时候,通过降低输出能力来减缓内部时钟驱动的边沿。

减少同步开关的峰值电流,和di/dt,一个重要的考虑因素就是降低内部时钟驱动的能力(其实就是放大倍数,穿通电流与之相关型很大)。降低时钟边沿的电 流,将显著改善EMI。当然这样做的缺点就是,由于时钟和负载的开通时间的变长使得单片机的平均电流可能增加。快速边沿和相对较高的峰值电流,时间更长边 沿较慢的电流脉冲这两者需要做一个妥协。


2.4 晶振的内部驱动(反向器)最好不要超过实际的需求。

这个问题,实际上前面也谈过了,当增益过大的时候会带来更大的干扰。

3. 设计最小穿通电流的驱动器

3.1 时钟,总线和输出驱动器应尽可能使得传统电流最小

穿通电流【重叠电流,短路电流】,是从单片机在切换过程中,PMOS和NMOS同时导通时候,电源到地线的电流,穿通电流直接影响了EMI和功耗。

这个内容实际上是在单片机内部的,时钟,总线和输出驱动器,消除或减少穿通电流的方法是尽量先关闭一个FET,然后再开通一个FET。当电流较大时,需要额外的预驱动电路或电压摆率。

4. 时钟的生成和分配

4.1 就单片机内部而言,我们宁可给每个部分分配时钟(尽可能小的高频时钟),当然我们需要额外的管理时钟偏移工作。这样做要比使用一个增益很大的的时钟缓冲器,驱动整个IC的时钟好很多

同步CMOS的设计,在时钟边沿产生很大的峰值电流。时钟树的结构使用(在系统时间允许的条件下),比起主时钟驱动器和时钟分配线路,将减少同步开关电流。【时钟树结构中固有的延迟时间使得开关在不同时间分离开来】

4.2 使用电源管理技术。

把时钟源尽可能靠近需要的IC,如果在一个模块内需要分配时钟的话。在不需要时钟的时候,关闭时钟源。【睡眠模式的时候通常需要做时钟的切换】

4.3 在系统的限制允许的条件下,尽量使用非重叠时钟。

非重叠时钟,是指没有同步边缘的时钟。从系统的角度来说,非重叠的时钟边沿有助于消除竞争冒险和亚稳态。从EMC的角度看,加入时钟边沿之间的过渡时间会降低峰值电流和谐波的峰值幅度。平均电流从时间跨度上来看将保持大致相同,但幅度和频谱形状会发生变化。

如果时钟间的过渡是接近的但不同步(假设边沿速度相对于时钟周期要快得多),电流波形会变平和持续时间会变长。随着过渡时间的增加,对每个边沿来说到电流波形会分离成若干个脉冲。较低的脉冲幅度相应降低了谐波的频谱幅度,电流脉冲边沿很可能依然大致相同(维持脉冲带宽)。理想情况下,两相系统中非重叠的占空比为33%,最大限度地加大时钟边沿之间的时间。然而,实际应用中不可能使用这种方式,必须做一些妥协,实际系统中不容许时钟边沿的有这么大的跨度。

4.4 使时钟电路尽量远离I / O逻辑电路,减少共模辐射问题发生的可能性。

时钟信号需要远离I / O逻辑或平行的引线。时钟暂态边沿可以耦合到I / O逻辑,产生电压的噪声。

4.5 输入引脚同步器移动远离单片机引脚区域,进入单片机的核心模块。

这项方法可以减少所需的时钟驱动器的大小,

移动同步器靠近时钟源可减少时钟信号线路长度。时钟驱动器上的电容负载部分取决于引线的寄生电容的,时钟驱动充电负荷将变小。

本文转自:张飞实战电子,转载此文目的在于传递更多信息,版权归原作者所有。

围观 83

页面

订阅 RSS - 单片机