单片机

本文主要参考自《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 输入引脚同步器移动远离单片机引脚区域,进入单片机的核心模块。

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

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

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

围观 5

上位机采用的是组态王这款监控软件,单片机采用的是STM32,系统的总框架分为4层:

服务器(组态王)——网关2——网关1——节点

通信过程中遇到的问题如下:

1. 将单片机与组态王连接完成后,组态王上没显示

(1)首先检查电路有没有连接正确(已经确定连接无误)

(2)利用串口查看网关1跟网关2打印出来的数据(对照代码中的内容,确定运行到每一步应有什么标志,可以通过打印不同的数据来监测运行到哪一步)

2. 网关2打印的数据总是显示网关2已经给网关1下发查询命令了,但是却没有收到网关1给它回复的数据,而且网关1也没有数据打印


分析可以知道网关2已经给网关1下发查询命令了,但是可能它的命令没有下发成功卡在485那块,导致网关1没有接收到命令所以没有打印数据,或者是网关2已经成功发送出去,只是网关1不接收而已,又或者是网关1已经接收到了但没有解包执行。

出现这种现象,原因有以下几种:

(1)程序跑死了
(2)485有问题
(3)硬件问题

因为这程序在之前一直跑得没问题,所以暂时先排除代码问题,先检查485那块的线路

检查结果:线路没连错,但是485线那块的RX,TX,GND这3根线裸露在空气中,而且有几根是相互接触了,用绝缘胶布包好之后,再一次通讯,这时网关1和2都有数据了,但是组态王还是没有显示


(网关2)


由我这个网关2打印的数据对照通信协议可知,网关2已经把节点上报的所有数据都上传给组态王了,而且打印出来的数据都是正确的,因为由系统的框架可知,节点的数据是通过485线传给相应的网关1的,网关1再将接收到的数据传给网关2,网关2再将所有的数据打包上报给上位机组态王,每个网关1打印的数据都跟它底下连着的节点状态一样,所以网关1和网关2都没问题。

3. 但是网关2已经把网关1上传的所有节点信息都上报给组态王的,但是组态王依然没有显示。

因为网关2跟组态王连接是通过一根USB转RS232线,会不会是这根线有问题?

换一根,果然,组态王有显示且显示各实验室的状态都正确。

后来由于我们要弄一套试验版,所以我们又得焊一套新的电源管理板子,一个网关2板子,一个网关1板子和五个节点板子。

4. 焊完之后,我们把各自的程序下进去,发现用不了,网关2和网关1都没数据

后来我们采用替换法,用旧的那套网关1和节点板子替换新的,目的是检测是否是新网关2出问题。

5. 替换之后发现网关2还是没有打印出数据,不用说组态王肯定也没有显示

我们先检测硬件问题,发现网关2的器件不小心焊错了,换回来之后,发现还是不行,后来我们自己写个485调试的程序(含有对串口2的调用),发现这个程序跑不了,我们定位是板子的主芯片STM32F103有问题,先排除是不是芯片引脚虚焊,然后发现是这个芯片坏了(不过一般情况下芯片很少会坏的),换个新的芯片后,程序能跑了。而且网关1和2都打印出正确的数据,组态王也显示正确。

噢,还有一个补充的是,之前那套旧的板子,曾出现过这么一个情况:时而有数据打印,时而没有。我们之前还以为是所处的环境干扰太大(有很多大型服务器在周围),其实是串口排针焊接不良导致的。(那时还没发现是USB转232线损坏,所以网关有数据,组态王没显示)

 所以综合目前所出现的所有情况可以得出:上位机与单片机通信的问题大多都是出现在硬件问题上。

一、是否电路都连接正确?

二、是否焊接不良? 这步可以利用万用表来一步步地检测

三、485通信的那三根485线RX,TX,GND是否有接触?

四、与上位机相连的那个USB转232线是否损坏?  数据传送的过程可以用示波器来检测,便于查看数据传送到哪一步卡住了

在整个调试的过程中,我们得出一个很好的习惯,就是写代码的时候,最好加上一些标志,比如程序运行到哪一步就会打印出哪些提示或者数据,然后制成一个通信协议,方便以后出问题可以对照通信协议来找出问题所在。还有就是懂得利用一些相关的仪器来检测问题。

来源:CSDN,作者:思念中华
原文:
https://blog.csdn.net/qq_38021919/article/details/79050085

围观 5

PC =  progammer counter //程序计数器 

ACC = accumulate //累加器 

PSW = progammer status word //程序状态字 

SP =  stack point //堆栈指针 

DPTR = data point register //数据指针 寄存器 

IP = interrupt priority //中断优先级

IE = interrupt enable // 中断使能

TMOD = timer mode  //定时器 方式  (定时器/计数器 控制寄存器)

ALE = alter (变更,可能是)

PSEN = progammer saving enable //程序存储器使能(选择外部程序存储器的意思)

EA = enable all(允许所有中断)完整应该是 enable all interrupt

PROG = progamme (程序)

SFR = special funtion register //特殊功能寄存器

TCON = timer control //定时器控制

PCON = power control //电源控制

MSB = most significant bit//最高有效位

LSB = last significant bit//最低有效位

CY = carry //进位(标志)

AC = assistant carry //辅助进位

OV = overflow //溢出

ORG = originally //起始来源

DB = define byte //字节定义

EQU = equal //等于

DW = define word //字定义

E = enable //使能

OE = output enable //输出使能

RD = read //读

WR = write //写 

中断部分:

INT0 = interrupt 0 //中断0

INT1 = interrupt 1//中断1

T0 = timer 0 //定时器0

T1 = timer 1 //定时器1

TF1 = timer1 flag //定时器1 标志 (其实是定时器1中断标志位)

IE1 = interrupt exterior 【ik'stiəriə】外部的//(外部中断请求,可能是)

IT1 = interrupt touch //(外部中断触发方式,可能是)

ES = enable serial //串行使能

ET = enable timer //定时器使能

EX = enable exterior //外部使能(中断)

PX = priority exterior //外部中断优先级

PT = priority timer //定时器优先级

PS = priority serial //串口优先级

来源:CSDN,作者:wangluojisuan,转载此文目的在于传递更多信息,版权归原作者所有。
原文链接:
https://blog.csdn.net/wangluojisuan/article/details/6931914

围观 7

一、单片机上拉电阻的选择

“”

大家可以看到复位电路中电阻R1=10k时RST是高电平 ,而当R1=50时RST为低电平,很明显R1=10k时是错误的,单片机一直处在复位状态时根本无法工作。出现这样的原因是由于RST引脚内含三极管,即便在截止状态时也会有少量截止电流,当R取的非常大时,微弱的截止电流通过就产生了高电平。

二、LED串联电阻的计算问题

通常红色贴片LED:电压1.6V-2.4V,电流2-20mA,在2-5mA亮度有所变化,5mA以上亮度基本无变化。

“”

三、端口出现不够用的情况

这时可以借助扩展芯片来实现,比如三八译码器74HC138来拓展。

“”

“”

四、滤波电容

滤波电容分为高频滤波电容和低频滤波电容。

1、高频滤波电容一般用104容(0.1uF),目的是短路高频分量,保护器件免受高频干扰。普通的IC(集成)器件的电源与地之间都要加,去除高频干扰(空气静电)。

2、低频滤波电容一般用电解电容(100uF),目的是去除低频纹波,存储一部分能量,稳定电源。大多接在电源接口处,大功率元器件旁边,如:USB借口,步进电机、1602背光显示。耐压值至少高于系统最高电压的2倍。

五、三极管的作用

1、开关作用:

“”

LEDS6为高电平时截止,为低电平时导通。

限流电阻的计算:集电极电流为I,则基极电流为I/100(这里涉及到放大作用,集电极电流是基极的100倍),PN结电压0.7V,R=(5-0.7)/(I/100)

2、放大作用:
集电极电流是基极电流的100倍

3、电平转换:

“”

当基极为高电平时,三极管导通,右侧的导线接地为低电平,当基极为低电平时,三极管截止,输出高电平。

六、数码管的相关问题

“”

数码管点亮形成的数字由a,b,c,d,e,f,e,dp(小数点)构成,字模及真值表如上图。

七、上拉电阻

上拉电阻选取原则:

1、从节约功耗及芯片灌电流能力考虑应当足够大;电阻大,电流小。

2、从确保足够的驱动电流考虑应当足够小;电阻小,电流大。

3、对于高速电路,过大的上拉电阻可能会导致边沿变平缓。

综合考虑:上拉电阻常用值在1K到10K之间选取,下拉同理。

上下拉电阻:

上拉就是将不确定的信号通过一个电阻嵌位在高电平,下拉同理。

1、电平转换,提高输出电平参数值。

2、OC门必须加上拉电阻才能使用。

3、加大普通IO引脚驱动能力。

4、悬空引脚上下拉抗干扰。

八、按键抖动及消除

按键也是机械装置,在按下或放开的一瞬间会产生抖动,如下图:

“”

“”

消除方法有两种:软件除抖和硬件除抖,其中硬件除抖是应用了电容对高频信号短路的原理。

软件除抖是检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。

文章来源:传感器技术
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有,如涉及侵权,请联系小编进行处理。

围观 6

对于芯片开发使用来说,时序图是较为核心也较为重要的一个知识点。在厂家给出的芯片数据手册中,时序图也是非常重要的参数细节。开发者拿到一款芯片时,首先需要做的就是阅读其数据手册,对上面的内容进行提取和掌握。因此能够顺利的阅读并了解到单片机时序图想要传达的意思是非常关键的,本文为大家介绍一种能够顺利读懂时序图的方法。

为了方便大家理解,这里以1602为例进行讲解,1602的引脚是很整齐的SIP单列直插封装,所以器件手册只给出了引脚的功能数据表:


开发者只需要关注以下几个管脚:

3脚:VL,液晶显示偏压信号,用于调整LCD1602的显示对比度,一般会外接电位器用以调整偏压信号,注意此脚电压为0时可以得到最强的对比度。

4脚:RS,数据/命令选择端,当此脚为高电平时,可以对1602进行数据字节的传输操作,而此脚为低电平时,则是进行命令字节的传输操作。命令字节,即是用来对LCD1602的一些工作方式作设置的字节;数据字节,即使用以在1602上显示的字节。值得一提的是,LCD1602的数据是8位的。

5脚:R/W,读写选择端。当此脚为高电平可对LCD1602进行读数据操作,反之进行写数据操作。笔者认为,此脚其实用处不大,直接接地永久置为低电平也不会影响其正常工作。但是尚未经过复杂系统验证,保留此意见。

6脚:E,使能信号,其实是LCD1602的数据控制时钟信号,利用该信号的上升沿实现对LCD1602的数据传输。

7~14脚:8位并行数据口,使得对LCD1602的数据读写大为方便。

LCD1602的操作时序


在此,可以先不读出它的数据的状态或者数据本身,所以只需要看两个写时序:

①当要写指令字,设置LCD1602的工作方式时:需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。

②当要写入数据字,在1602上实现显示时:需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。

实际上写指令和写数据,差别仅仅在于RS的电平不一样而已。以下是LCD1602的时序图:


只要慢慢学会看时序图,要知道操作一个器件的精华便蕴藏在其中,看懂看准了时序,再操控这个芯片就是非常容易的事了。这里使用1602作为例子主要是因为1602的时序是目前最简单的时序之一。

注意时间轴,如果没有标明(其实大部分也都是不标明的),那么从左往右的方向为时间正向轴,即时间在增长。图1框出并注明了看懂此图的一些常识:

(1)时序图最左边一般是某一根引脚的标识,表示此行图线体现该引脚的变化,上图分别标明了RS、R/W、E、DB0~DB7四类引脚的时序变化。

(2)有线交叉状的部分,表示电平在变化,如上所标注。

(3)应该比较容易理解,如上图右上角所示,两条平行线分别对应高低电平,也正好吻合(2)中电平变化的说法。

(4)上图下,密封的菱形部分,注意要密封,表示数据有效,ValidData这个词也显示了这点。

需要十分严重注意的是,时序图里各个引脚的电平变化,基于的时间轴是一致的,一定要严格按照时间轴的增长方向来精确地观察时序图,要让器件严格的遵守时序图的变化,在类似于18B20这样的单总线器件对此要求尤为严格。

时间标注

细心的朋友或许注意到了文中关于时间的标注,这也是个十分重要的信息,这些时间的标注表明了某些状态所要维持的最短或最长时间。因为器件的工作速度也是有限的,一般都跟不上主控芯片的速度,所以它们直接之间要有时序配合。

下面是时序参数表:


开发者要注意估计主控芯片的指令时间,可以在官方数据手册上查到MCU的一些级别参数。比如现在用AVRM16做为主控芯片,外部12MHz晶振,(1/12MHz)s是振荡周期,而不是时钟周期,因为时钟周期(状态周期)等于两个振荡周期,换句话说就是对振动频率进行“二分频”的振荡信号,所以(2/12MHz)s才是晶振为12MHz时的时钟周期。

以上给的时间参数全部是ns级别的,所以即便在程序里不加延时程序,也应该可以很好的配合LCD1602的时序要求了。怎么看这个表呢?很简单,在时序图里可以找到TR1,对应时序参数表,可以查到这个是E上升沿/下降沿时间,最大值为25ns,表示E引脚上的电平变化,必须在最大为25ns之内的时间完成。

以上介绍的这些内容,虽然是以LCD1602为例,但这仅仅是为了帮助大家进行理解,其中提到的参数是大部分单片机都会有的,因此大家可以通过本文中给予的解读方式来套用到其他单片机当中,大部分的单片机时序图都会遵循文中给出的规则,当大家渐渐掌握其中的内容后,就可以发现其实看懂单片机的时序图其实并不难。

本文章来源网络,转载此文目的在于传递更多信息,版权归原作者所有。

围观 12

在研制带器的电子产品时,如何提高抗干扰能力和电磁兼容性?

一、下面的系统要特别注意抗电磁干扰:

1、微控制器时钟频率特别高,总线周期特别快的系统。

2、系统含有大功率,大电流驱动电路,如产生火花的继电器,大电流开关等。

3、含微弱模拟信号电路以及高精度A/D变换电路的系统。

二、为系统的抗电磁干扰能力采取如下措施:

1、选用频率低的微控制器

选用外时钟频率低的微控制器可以有效降低噪声和提高系统的抗干扰能力。同样频率的方波和正弦波,方波中的高频成份比正弦波多得多。虽然方波的高频成份的波的幅度,比基波小,但频率越高越发射出成为噪声源,微控制器产生的最有影响的高频噪声大约是时钟频率的3倍。

2、减小信号传输中的畸变

微 控制器主要采用高速CMOS技术制造。信号输入端静态输入电流在1mA左右,输入电容10PF左右,输入阻抗相当高,高速CMOS电路的输出端都有相当的 带载能力,即相当大的输出值,将一个门的输出端通过一段很长线引到输入阻抗相当高的输入端,反射问题就很严重,它会引起信号畸变,系统噪声。当 Tpd>Tr时,就成了一个传输线问题,考虑信号反射,阻抗匹配等问题。

信号在印制板上的延迟时间与引线的特性阻抗有关,即与印制线路板材料的介电常数有关。可以粗略地认为,信号在印制板引线的传输速度,约为光速的1/3到1/2。微控制器构成的系统中常用逻辑电话元件的Tr(标准延迟时间)为3到18ns。

在印制线路板上,信号通过一个7W的电阻和一段25cm长的引线,线上延迟时间大致在4~20ns。也说,信号在印刷线路上的引线越短越好,最长不宜超过25cm。而且过孔数目也应尽量少,最好不多于2个。

当信号的上升时间快于信号延迟时间,就要快电子学。要考虑传输线的阻抗匹配,对于一块印刷线路板上的集成块的信号传输,要避免出现Td>Trd的,印刷线路板越大系统的速度就越不能太快。

用以下结论归纳印刷线路板设计的一个规则:

信号在印刷板上传输,其延迟时间不应大于所用器件的标称延迟时间。

3、减小信号线间的交叉干扰

A 点一个上升时间为Tr的阶跃信号通过引线AB传向B端。信号在AB线上的延迟时间是Td。在D点,A点信号的向前传输,到达B点后的信号反射和AB线的延 迟,Td时间以后会感应出一个宽度为Tr的页脉冲信号。在C点,AB上信号的传输与反射,会感应出一个宽度为信号在AB线上的延迟时间的两倍,即2Td的 正脉冲信号。这信号间的交叉干扰。干扰信号的强度与C点信号的di/at有关,与线间距离有关。当两信号线不是很长时,AB上看到的是两个脉冲的迭加。

CMOS 工艺制造的微控制由输入阻抗高,噪声高,噪声容限也很高,数字电路是迭加100~200mv噪声并不影响其工作。若图中AB线是一模拟信号,这种干扰就变 为不能容忍。如印刷线路板为四层板,其中有一层是大面积的地,或双面板,信号线的反面是大面积的地时,这种信号间的交叉干扰就会变小。原因是,大面积的地 减小了信号线的特性阻抗,信号在D端的反射大为减小。特性阻抗与信号线到地间的介质的介电常数的平方成反比,与介质厚度的自然对数成正比。若AB线为一模 拟信号,要避免数字电路信号线CD对AB的干扰,AB线下方要有大面积的地,AB线到CD线的距离要大于AB线与地距离的2~3倍。局部屏蔽地,在有引结 的一面引线左右两侧布以地线。

4、减小来自电源的噪声

电源在向系统提供能源的,也将其噪声加到所供电的电源上。电路中微控制器的复位线,中断线,以它控制线最受外界噪声的干扰。电网上的强干扰通过电源进入电路,即使电池供电的系统,电池本身也有高频噪声。模拟电路中的模拟信号更经受不住来自电源的干扰。

5、注意印刷线板与元器件的高频特性

在 高频下,印刷线路板上的引线,过孔,电阻、电容、接插件的分布电感与电容等不可忽略。电容的分布电感不可忽略,电感的分布电容不可忽略。电阻产生对高频信 号的反射,引线的分布电容会起作用,当长度大于噪声频率相应波长的1/20时,就产生天线效应,噪声通过引线向外发射。

印刷线路板的过孔大约引起0.6pf的电容。

一个集成电路本身的封装材料引入2~6pf电容。

一个线路板上的接插件,有520nH的分布电感。一个双列直扦的24引脚集成电路扦座,引入4~18nH的分布电感。

这些小的分布参数对于这行较低频率下的微控制器系统中是可以忽略不计的;而对于高速系统予以特别注意。

6、元件布置要合理分区

元件在印刷线路板上排列的要充分考虑抗电磁干扰问题,原则之一是各部件的引线要尽量短。在布局上,要把模拟信号部分,高速数字电路部分,噪声源部分(如继电器,大电流开关等)这三部分合理地分开,使间的信号耦合为最小。

7、好接地线

印刷电路板上,电源线和地线最重要。克服电磁干扰,最主要的手段接地。

对 于双面板,地线布置特别讲究,通过采用单点接地法,电源和地是从电源的两端接到印刷线路板上来的,电源一个接点,地一个接点。印刷线路板上,要有多个返回 地线,这些都会聚到回电源的那个接点上,所谓单点接地。所谓模拟地、数字地、大功率器件地开分,是指布线分开,而最后都汇集到接地点上来。与印刷线路板以 外的信号相连时,通常采用屏蔽电缆。对于高频和数字信号,屏蔽电缆两端都接地。低频模拟信号用的屏蔽电缆,一端接地为好。

对噪声和干扰非常敏感的电路或高频噪声特别严重的电路应该用金属罩屏蔽起来。

8、用好去耦电容

好 的高频去耦电容可以去除高到1GHZ的高频成份。陶瓷片电容或多层陶瓷电容的高频特性较好。设计印刷线路板时,每个集成电路的电源,地都要加一个去耦电 容。去耦电容有两个作用:一是本集成电路的蓄能电容,提供和吸收该集成电路开门关门瞬间的充放电能;另一旁路掉该器件的高频噪声。数字电路中典型的去耦电 容为0.1uf的去耦电容有5nH分布电感,它的并行共振频率大约在7MHz左右,也说对于10MHz以下的噪声有较好的去耦作用,对40MHz的噪声几 乎不起作用。

1uf,10uf电容,并行共振频率在20MHz,去除高频率噪声的效果要好。在电源进入印刷板的地方和一个1uf或10uf的去高频电容往往是有利的,即使是用电池供电的系统也这种电容。

每10片左右的集成电路要加一片充放电电容,或称为蓄放电容,电容大小可选10uf。最好不用电解电容,电解电容是两层溥膜卷起来的,这种卷起来的结构在高频时表现为电感,最好使用胆电容或聚碳酸酝电容。

去耦电容值的选取并不严格,可按C=1/f计算;即10MHz取0.1uf,对微控制器构成的系统,取0.1~0.01uf都可以。

三、降低噪声与电磁干扰的经验

能用低速芯片就不用高速的,高速芯片用在关键地方。

串一个电阻的办法,降低控制电路上下沿跳变速率。

尽量为继电器等提供某种形式的阻尼。

使用满足系统要求的最低频率时钟。

时钟产生器尽量靠近到用该时钟的器件。石英晶体振荡器外壳要接地。

用地线将时钟区圈起来,时钟线尽量短。

I/O驱动电路尽量靠近印刷板边,让其尽快离开印刷板。对进入印制板的信号要加滤波,从高噪声区来的信号也要加滤波,用串终端电阻的办法,减小信号反射。

MCD无用端要接高,或接地,或定义成输出端,集成电路上该接电源地的端都要接,不要悬空。

闲置不用的门电路输入端不要悬空,闲置不用的运放正输入端接地,负输入端接输出端。 (10) 印制板尽量使用45折线而不用90折线布线以减小高频信号对外的发射与耦合。

印制板按频率和电流开关特性分区,噪声元件与非噪声元件要距离再远。

单面板和双面板用单点接电源和单点接地、电源线、地线尽量粗,经济是能承受的话用多层板以减小电源,地的容生电感。

时钟、总线、片选信号要远离I/O线和接插件。

模拟电压输入线、参考电压端要尽量远离数字电路信号线,特别是时钟。

对A/D类器件,数字部分与模拟部分宁可统一下也不要交叉。

时钟线垂直于I/O线比平行I/O线干扰小,时钟元件引脚远离I/O电缆。

元件引脚尽量短,去耦电容引脚尽量短。

关键的线要尽量粗,并在两边加上保护地。高速线要短要直。

对噪声敏感的线不要与大电流,高速开关线平行。

石英晶体下面以及对噪声敏感的器件下面不要走线。

弱信号电路,低频电路周围不要形成电流环路。

信号都不要形成环路,如不可避免,让环路区尽量小。

每个集成电路一个去耦电容。每个电解电容边上都要加一个小的高频旁路电容。

用大容量的钽电容或聚酷电容而不用电解电容作电路充放电储能电容。使用管状电容时,外壳要接地。

来源:网络、电子工程专辑

围观 7

在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。

中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。

(1)中断源:中断请求信号的来源。(8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(这两个低电平有效,上面的那个横杠不知道怎么加上去))

(2)中断响应与返回:CPU采集到中断请求信号,怎样转向特定的中断服务子程序,并在执行完之后返回被中断程序继续执行。期间涉及到CPU响应中断的条件,现场保护,现场恢复。

(3)优先级控制:中断优先级的控制就形成了中断嵌套(8051允许有两级的中断嵌套,优先权顺序为INT0,T0,INT1,T1,串行口),同一个优先级的中断,还存在优先权的高低。优先级是可以编程的,而优先权是固定的。

80C51的原则是
①同优先级,先响应高优先权
②低优先级能被高优先级中断
③正在进行的中断不能被同一级的中断请求或低优先级的中断请求中断。

80C51的中断系统涉及到的中断控制有中断请求,中断允许,中断优先级控制

(1)3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1

(2)中断控制寄存器:定时和外中断控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中断允许寄存器IE,中断优先级寄存器IP

具体的是什么,包括哪些标志位,在这里不讲了,所有书上面都会讲。

在这里我们讲下注意的事项

(1)CPU响应中断后,TF0(T0中断标志位)和TF1由硬件自动清0。

(2)CPU响应中断后,在边沿触发方式下,IE0(外部中断INT0请求标志位)和IE1由硬件自动清零;在电平触发方式下,不能自动清楚IE0和IE1。所以在中断返回前必须撤出INT0和INT1引脚的低电平,否则就会出现一次中断被CPU多次响应。

(3)串口中断中,CPU响应中断后,TI(串行口发送中断请求标志位)和RI(接收中断请求标志位)必须由软件清零。

(4)单片机复位后,TCON,SCON给位清零。

C51语言允许用户自己写中断服务子程序(中断函数)

首先来了解程序的格式:

void 函数名() interrupt m [using n]

{}

关键字 interrupt m [using n] 表示这是一个中断函数

m为中断源的编号,有五个中断源,取值为0,1,2,3,4,中断编号会告诉编译器中断程序的入口地址,执行该程序时,这个地址会传个程序计数器PC,于是CPU开始从这里一条一条的执行程序指令。

n为单片机工作寄存器组(又称通用寄存器组)编号,共四组,取值为0,1,2,3

中断号 中断源
0 外部中断0
1 定时器0
2 外部中断1
3 定时器1中断
4 串行口中断

这5个中断源的中断入口地址为:(在上一篇文章中讲到的ROM前43个存储单元就是他们,这40个地址用来存放中断处理程序的地址单元,每一个类中断的存储单元只有8B,显然不是中断处理的程序,而是存放着中断处理程序的真正地址)

INT0:0003H 0

T0: 000BH 1

INT1:0013H 2

T1: 001BH 3

串口: 0023H 4

中断向量(中断入口地址)= 中断号x8 +3

前面m意思很清楚,不同的m值表示这个函数是针对不同的中断源,比如m为1是表示它是定时器0的中断函数,

如void time0() interrupt 1{}

那么后面的using n 又是什么意思呢?在正在执行一个特定任务时,有更紧急的事情需要CPU来处理,涉及到中断优先权。高优先权中断低优先权正在处理的程序,所以最好给每个优先程序分配不同的寄存器组。

CPU正在处理某个事件,突然另外一个事件需要处理,于是进入中断后,而你不想将现在执行的程序的各寄存器状态入栈,那么可以把这个中断程序放入另一个寄存器组,如切换到1组,然后退出中断时,再切回到0组(原来的程序在0组)。

为了更好的了解这里意思,你可以看看工作寄存器组的作用是什么。

下面的注意事项转自网络上其他朋友的文章(整理下,重复的去掉了,写的非常好):

(1)中断函数不能进行参数传递

(2)中断函数没有返回值

(3)在任何情况下都不能直接调用中断函数

(4)中断函数使用浮点运算要保存浮点寄存器的状态。

(5)如果在中断函数中调用了其它函数,则被调用函数所使用的寄存器必须与中断函数相同,被调函数最好设置为可重入的。

(6)C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容,具体如下:在程序开始处对ACC、B、DPH、DPL和PSW入栈,结束时出栈。中断函数未加using n修饰符的,开始时还要将R0~R1入栈,结束时出栈。如中断函数加using n修饰符,则在开始将PSW入栈后还要修改PSW中的工作寄存器组选择位。

(7)C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。

(8)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。防止其它程序调用。

(9)在设计中断时,要注意的是哪些功能应该放在中断程序中,哪些功能应该放在主程序中。

一般来说中断服务程序应该做最少量的工作,这样做有很多好处。首先系统对中断的反应面更宽了,有些系统如果丢失中断或对中断反应太慢将产生十分严重的后果,这时有充足的时间等待中断是十分重要的。其次它可使中断服务程序的结构简单,不容易出错。中断程序中放入的东西越多,他们之间越容易起冲突。简化中断服务程序意味着软件中将有更多的代码段,但可把这些都放入主程序中。

中断服务程序的设计对系统的成败有至关重要的作用,要仔细考虑各中断之间的关系和每个中断执行的时间,特别要注意那些对同一个数据进行操作的ISR。

本文转自网络,版权归原作者所有。

围观 19

单片机是单片微型计算机的简称。它是在一块芯片上,以CPU为核心,同时集成了常用的计算机外部设备的计算机系统,称之为MCU(Micro Controller Unit)。

单片机是为特定应用场景定制的计算机系统,此特性就决定了,单片机的种类与型号是成千上万的。刚接触单片机开发,可能被这个庞大的吓到了,如何掌握特定的单片机使用方法,并开发出高质量的单片机控制系统,就成了让人头疼的问题。

这里我们可以先从单片机的结构着手分析。

单片机上的核心器件是CPU(Central Processing Unit),在CPU周围是各式各样的总线,总线的一端,连接的是常用的计算机外部设备,比如:I/O设备、USART设备、A/D设备、RAM、Flash ROM、SPI总线控制设备... ...等等。


先不去解释总线的总类与它们的工作原理,也不去解释设备的工作原理,做个比方:CPU好比大脑,设备就好比身体器官,总线好比神经。人在做动作的时候,大脑通过神经传导控制信息给身体器官,器官再把动作过程信息通过神经反馈信号给大脑。如果我们理解了这个动作原理,那么,单片机的工作原理也就不难理解了。


单片机上的设备,提供给外界访问接口叫做寄存器组,寄存器分为三类:控制寄存器、状态寄存器、数据寄存器。控制寄存器,可以用来设定设备的工作方式;状态寄存器,可以用来查询设备的工作状态;数据寄存器,用来完成外界与设备的数据交互。一般情况来讲,CPU通过总线访问某设备的控制寄存器,通过向该寄存器写入控制数据,完成设备控制方式设定。然后,再通过状态寄存器不断查询设备的工作状态,根据工作状态来确定如何与设备进行数据交互,数据交互工作就是通过数据寄存器来完成的。


由此可见,掌握单片机编程,实际上就是掌握如何使用片上设备。如何掌握片上设备的使用方法呢?按照下面的六步操作,就简单多了。

第一、详细了解片上设备的功能与作用;

第二、掌握与该设备相关的概念、技术术语、技术参数等内容;

第三、通过器件手册,了解与该设备相关的寄存器组;

第四、确定设备的使用方法;

第五、绘制设备使用控制流程图;

第六、编写程序;

来源:玩转单片机

围观 10

单片机新人学习方法及学习步骤

demi的头像

学习单片机的动机不外乎有四种:一是为兴趣爱好而学,二是为专业而学;三是为饭碗而学;四是在工作中被逼而学。不管是哪种动机,因主修专业的不同以及电子基础的深浅不同,对于不同的人可能采用不同的学习方法,根据笔者的亲身学习经验和教授徒弟学习的感受,提出笔者的学习方法和步骤。

蜂鸣器是很常见的设备,分为无源和有源两种。根据项目需求选择不同类型的蜂鸣器。最近的项目里有用到有源蜂鸣器对有源蜂鸣器。还是老一套,把电路板画完,接着编程。

在项目中原理图如下:


如果不能保证I/O的输出性能可以根据情况增加上拉或者下拉电阻。

切入正题:在程序里面这个蜂鸣器的驱动就是个高低电平驱动。高电平三极管导通、蜂鸣器发声,低电平三极管关断、蜂鸣器不发声。这的确很简单,程序上最开始我是这样写的:


当然,如果单片机没有很好的I/O跳变函数也可以这样修改:


这里稍作解释:

1)

函数功能:蜂鸣器发声驱动

传入参数:蜂鸣器发声的次数

2)

传入的次数cnt需要再函数内翻倍。这是因为传入的参数是想让蜂鸣器连续的发cnt声。但是蜂鸣器除了发声还有不发声的时候。也就是说蜂鸣器每响一次都需要关闭一次,如果没有关闭操作肯定就不会出现响几声而是连续的响一声,这个也很容易推理。

3)

在while循环完之后需要加一个蜂鸣器关闭操作。

这里假如传进的参数是2,目的是让蜂鸣器响两声。根据程序的执行步骤:

cnt2变成4。

第1次while(4) 蜂鸣器开 cnt自减到3

第2次while(3) 蜂鸣器关 cnt自减到2

第3次while(2) 蜂鸣器开 cnt自减到1

第4次while(1) 蜂鸣器关 cnt自减到0

第5次while(0) 跳出while

可以看出其实在while之后蜂鸣器状态已经是关闭的了,但是保险起见,确保函数调用完之后蜂鸣器是关闭的状态。比如第一个函数I/O跳变的就更需要保障了,因为代码上只能看出跳变,看不到跳变之后的状态。

至此,一个简单的蜂鸣器电路和驱动程序就都温习完了,接下来上干货:

在写程序的时候很多时候讲究程序的效率,比如这个蜂鸣器驱动,驱动过程中会降低效率,厉害的人很快能看出来,就是这个Delay延时的问题。但是上面也说了,不延时也是不行的。所以趋于效率我尝试着换了一种方法驱动蜂鸣器。

代码如下:


实现起来也很简单,简单说下原理:

1)首先是提供蜂鸣器驱动的I/O配置,

2)其次是定时器的配置

3)最后是定时器中断函数实现

我选用的定时器是项目单片机中最简单的一个定时器,配制成1ms中断,能够提供溢出中断。其实这个定时器我常用做计系统运行时间Systick_ms。但是该项目对这个系统时间没有用到,那就用这个定时器做文章把。

实现方法:

1、同样函数在调用蜂鸣器驱动的时候接口是一样的,传入的参数还是蜂鸣器的响声次数。

2、函数体变了,这里改成了两个变量的赋值,第一个BELL_CNT同普通方法中的cnt2,这里不再赘述。第二个是FLAG_BELL是用来保存蜂鸣器是否需要驱动的状态变量。所以既然是调用驱动函数,那肯定这个变量要为真。

3、定时器中断函数里面加上了一个静态变量NOW,他的作用就是和Systic_ms产生一个50ms的时间片,干嘛用?肯定是给蜂鸣器开关之间的延时用咯。模拟软件延时嘛。然后再来分析下这段代码:

1)首先这个NOW和Systic_ms是无条件需要赋值保证50ms时间片的。对应的代码为NOW=Systick_ms+50;

2)判断蜂鸣器驱动状态变量是不是真,如果不为真就关闭蜂鸣器,这个也是无条件的。

3)如果状态变量为真:蜂鸣器先跳变Bell_Tog();当然如果没有这个跳变函数也可以用上述的判断cnt的方法,就不多写了都是一样的。同时次数自减BELL_CNT--;同时判断是不是减到0了,减到0了说明响完了啊,那就把状态变量赋值为假。再次进来不管蜂鸣器是开着的还是关着的都会执行关闭操作,这个跟上面说的保险一样。

4)最后,这两个变量用的是全局变量,这里是以结构体的形式呈现的,因为很多情况这两个函数不在一个C里面。如果硬要写在一个C可以忽略本条。

转自:畅学单片机

围观 18

页面

订阅 RSS - 单片机