单片机

随机数在单片机的应用中也是很多的,当然产生随机数的方法有很多,当中有一个就是利用单片机定时器,取出未知的定时器THX和TLX的值,再加以运算得到一个规定范围内的随机数值。这做法也是可行的。或者预先写好一个随机数表,然后进行取数据。也是可以的。

KEIL里面产生随机数的函数确实是rand(),但头文件是stdlib.h,不是time.h。C语言提供了一些库函数来实现随机数的产生。

C语言中有三个通用的随机数发生器,分别为 rand函数、random函数、randomize 函数,但是rand函数产生的并不是真意正义上的随机数,是一个伪随机数,是根据一个数,称之为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数。

但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int a)。在调用rand函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。一般用for语句来设置种子的个数。

单片机产生随机数的两种方法:

方法一:定时器直接随机取值

每按一次按键生成一个随机数,这个随机数实际是把定时器的值给取出来了,并不能算绝对的随机、方法二才是真正意义上的随机。
  
方法二:用定时器加rand()随机函数来实现

单片机上电之后通过按键去启动取随机数,若是单片机上电就立即取随机数的话,那每次上电随机的结果都是一样的。然后是0 到9不重复的随机数,程序中用了循环来判断是否和前面取的随机数相同,相同则进入,下次取随机数,不同则存入数组。

来源:EDN电子技术设计

围观 646

单片机应用中,常常会遇到这种情况~~在用单片机制作电子钟或要求根据时钟启控的控制系统时,会突然发现当初校准了的电子时钟的时间竟然变快或是变慢了。于是,尝试用各种方法来调整它的走时精度,但是最终的效果还是不尽人意,只好每过一段时间手动调整一次。那么,是否可使时钟走时更精确些呢?

现探讨如下:

一、误差原因分析

1. 单片机电子时钟的计时脉冲基准,是由外部晶振的频率经过12分频后提供的,采用内部的定时,计数器来实现计时功能。所以,外接晶振频率的精确度直接影响电子钟计时的准确性。

2. 单片机电子时钟利用内部定时,计数器溢出产生中断(12MHz晶振一般为50ms)再乘以相应的倍率,来实现秒、分、时的转换。大家都知道,从定时,计数器产生中断请求到响应中断,需要3_8个机器周期。定时中断子程序中的数据人栈和重装定时,计数器的初值还需要占用数个机器周期。此外。从中断人口转到中断子程序也要占用一定的机器周期。例如:

从上述程序可以看出,从中断人口到定时/计数器初值的低8位装入需要占用2+2+2=6个机器周期。所以,在编程时一般会把这6个机器周期加入定时/计数器的初值中。但是,从定时,计数器溢出中断请求到执行中断需要几个机器周期(3~8个机器周期)。就很难确定准确值,正是这一原因导致了电子时钟计时的不准。

二、解决方法

1、采用高精度晶振方案

虽然采用高精度的晶振可以稍微提高电子钟计时的精确度,但是晶振并不是导致电子钟计时不准的主要因素,而且高精度的晶振价格较高,所以不必采用此方案。

2、动态同步修正方案

从程序人手,采用动态同步修正方法给定时,计数器赋初值。动态同步修正方法如下:由于定时,计数器溢出后,又会从O开始自动加数,故在给定时/计数器再次赋值前,先将定时,计数器低位(TLO)中的值和初始值相加,然后送人定时,计数器中,此时定时,计数器中的值即为动态同步修正后的准确值。

具体程序如下:

采用此种方法后,相信制作的电子时钟的精度已有提高了。

3、自动调整方案

采用同步修正方案后,电子时钟的精度虽然提高了很多,但是由于晶振频率的偏差和一些其他未知因素的影响(同一块电路板、同样的程序换了一片单片机后,走时误差不一样,不知是何原因),时间长了仍然会有积累误差。为此,可采用自动调整方案。实际上是一种容错技术。其自动调整原理为:实测出误差Is所需的时间,然后每隔这样一段时间后就对秒进行加“1”或减“1”调整。例如:电子钟每过50小时就慢1秒,其自动调整程序如下:

以下是一个完整实例:

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

围观 123

介绍UART

最早的串行通讯设备可以追溯到电报机,它使用长度可变的脉冲信号进行数据传输。要说早期的芯片级UART,不得不提一下DEC,该公司的PDP系列计算机用上了第一个UART。当时的UART的线路占据了整个电路板,体积巨大!可以联想一下早期计算机的样子,如下图。


如今PC机上的串口早已被USB取代,对RS-232(也称标准串口)有需求的用户通常使用USB转串口线,这里常见的有CH340串口驱动程序。在UART通信中,两个UART直接通信。

发送端的UART将来自控制设备(如CPU)的并行数据转换为串行数据,以串行方式将其发送到接收端的UART,然后由接收端的UART将串行数据转换为并行数据以用于接收设备的正常处理。这里只需要两条线RX/TX即可在两个UART之间传输数据,如下图所示。


UART传输的数据被封装成数据包。每个数据包包含1个起始位,5~9个数据位(取决于UART的具体设置),一个可选的奇偶校验位以及1个或2个停止位,如下图所示。


起始位

UART数据传输线通常在不传输数据时保持在高电平。为了开始数据传输,发送端UART在一个时钟周期内将传输线从高电平拉低到低电平。当接收端UART检测到高电压到低电压转换时,它开始以波特率的频率读取数据位中的每一位数据。

数据

数据位包含正在传输的实际数据。如果使用奇偶校验位,则可以是5位,最多8位。如果不使用奇偶校验位,则数据帧的长度可以为9位。在大多数情况下,数据首先以低有效位发送。

校验位

在串口通信中一种简单的检错方式。有四种检错方式:
偶校验
奇校验
高校验
低校验

对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。

停止位

发送端UART将数据传输线从低电压驱动到高电压至少持续两位数据的时间宽度来表示整个数据包的传输已经结束。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容错性越好,但是数据传输率同时也越慢。

波特率

波特率是串口数据的传输速度,即Bit/s,常见的波特率比如:9600,19200,38400,57600,115200等。假设目前UART的配置为,1个起始位,8个数据位,0个校验位,1个停止位,那么9600的波特率,可以计算出每一位数据的时间宽度为:


那么传输一个字节(也就是10 bit 数据)需要的时间为 1.04 毫秒。

UART传输过程

①发送端UART从数据总线转换并行数据。

②发送端UART将起始位,奇偶校验位和停止位添加到数据包中,示意图如下。


③整个数据包从发送端UART串行发送到接收端UART,接收端UART按照预先配置好的波特率对数据线进行采样,示意图如下。


④接收端UART解析接收的数据,丢弃数据包中的起始位,奇偶校验位和停止位。

⑤接收UART将串行数据转换回并行数据,并将其传输到接收端的数据总线。

本文转自: STM32嵌入式开发(微信号:c-stm32),作者:acket,转载此文目的在于传递更多信息,版权归原作者所有。

围观 63

对于搞单片机的特别用8051系列工程师来说,谈到单片机的RTOS,很多时候会问一句:“为什么要用RTOS?单片机就这一点资源,使用RTOS能保证效率吗?”

对于这个问题,我会反问:“你用单片机的目的是什么?是为了用单片机的C编程,单片机的汇编编程甚至于用单片机的二进制指令编程?”上个世纪80年代,工程师用二进制指令给Z80编程,现在还有谁在用?现在还有人死抱着汇编不放,但越来越多的人工程师使用C编程(我起初也是使用汇编的),为什么?因为我们的目的是在有限的时间甚至是不充足的时间内把项目保质保量的完成!使用什么工具和方法是次要的(如果你的项目以成本放在第一位,则另当别论,这时,也是要考虑开发时间的)。时间就是金钱啊,一个产品在单片机上增加些许成本是可以接受的。况且,使用8051系列单片机时,单片机资源也常有富余,CPU一般情况也只是空转,这就为它使用RTOS创造了条件。

那么,使用RTOS的好处呢?我举一个例子吧。假设我们编一个串行通讯程序,通讯协议如下:

数据包长度为NBYTE,起始字节为STARTBYTE1,STARTBYTE2,最后一个字节为检验和,中间字节不可能出现连续出现STARTBYTE1,STARTBYTE2。

第一种方法,在中断中处理协议:

unsigned char Buf[NBYTE-2];bit GetRight=0;
void comm(void) interrupt 4//"串行口中断"{
static unsigned char Sum,Flag=0,i;
unsigned char temp;
if(RI==1)
{
RI=0;
temp=SBUF;
switch(Flag)
{
case 0:
if(temp==STARTBYTE1)
{
Flag=1;
}
break;
case 1:
if(temp==STARTBYTE2)
{
Sum=STARTBYTE1+STARTBYTE2;
i=0;
Flag=2;
break;
}
if(temp==STARTBYTE1) break;
Flag=0;
break;
case 2:
if(temp==STARTBYTE1)
{
Flag=3;
break;
}
Sum+=temp;
if((i>=(NBYTE-3))&&Sum==0)
{
GetRight=1;
Flag=0;
break;
}
Buf[i++]=temp;
break;
case 3:
if(temp==STARTBYTE2)
{
Sum=STARTBYTE1+STARTBYTE2;
Flag=2;
i=0;
break;
}
Sum+=STARTBYTE1;
if((i>=(NBYTE-3))&&Sum==0)
{
GetRight=1;
Flag=0;
break;
}
Buf[i++]=STARTBYTE1;
if(temp==STARTBYTE1)
{
break;
}
Sum+=temp;
if((i>=(NBYTE-3))&&Sum==0)
{
GetRight=1;
Flag=0;
break;
}
Buf[i++]=temp;
Flag=2;
break;
}
}}

第二种方法,使用队列中断函数:

void comm(void) interrupt 4//"串行口中断"{
if(RI==1)
{
RI=0;
SBUF 入队;
}}

主程序不断调用的函数:

unsigned char Buf[NBYTE-2];
unsigned char ReadSerial(unsigned char *cp){
unsigned char i;
unsigned char temp,Sum;
temp=队列中数据个数;
if(temp<(NBYTE)) return 0;
出队 temp;
if(temp!=STARTBYTE1) return 0;
temp=队列首字节;
if(temp!=STARTBYTE2) return 0;
出队 temp;
sum=STARTBYTE1+STARTBYTE2;
for(i=0;i
{
temp=队列首字节;
if(temp==STARTBYTE1)
{
temp=队列次首字节;
if(temp==STARTBYTE2) return 0;
}
出队 temp;
*cp++=temp;
Sum+=temp;
}
temp=队列首字节;
Sum+=temp;
if(Sum!=0) return 0;
出队 temp;
return 1;}

第三种方法,使用RTOS中断函数:

void comm(void) interrupt 4//"串行口中断"{
OS_INT_ENTER();
if(RI==1)
{
RI=0;
OSIntSendSignal(RECIVE_TASK_ID);
}
OSIntExit();}
ID为RECIVE_TASK_ID的任务
void Recuve(void){
unsigned char temp,temp1,Sum,i;
OSWait(K_SIG,0);
temp=SBUF;
while(1)
{
while(1)
{
OSWait(K_SIG,0);
temp1=SBUF;
if((temp==STARTBYTE1)&&(temp1==STARTBYTE2)) break;
temp=temp1;
}
Sum=STARTBYTE1+STARTBYTE2;
OSWait(K_SIG,0);
temp=SBUF;
for(i=0;i
{
OSWait(K_SIG,0);
temp1=SBUF;
if((temp==STARTBYTE1)&&(temp1==STARTBYTE2))
{
OSWait(K_SIG,0);
temp=SBUF;
i=-1;
Sum=STARTBYTE1+STARTBYTE2;
continue;
}
Buf[i]=temp;
Sum+=temp;
temp=temp1;
}
Sum+=temp1;
if(Sum==0) OSSendSignal(命令解释任务 ID);
}}

以下为这几种方法的比较:

可读性和编程容易性方面,第三钟方法最好(如果允许使用goto语句,程序更加简单易读),第二种次之(因为要编队列程序),第一种最差。如果协议更加复杂,这方面更加明显。程序简单易读,自然出错机会小了。

RAM占用方面,第三种方法较少,第二种最多(因为队列占用大量空间),第一种最少。

中断执行时间方面,第三种方法最长,第二种最短,第一种较长。

从功能方面,第三种方法最强,它还可以进行超时处理(虽然例子程序没有),其它方法均不行。

如果数据来的太快,命令处理程序来不及处理,三种方法处理方式不太一样,第一种和第三种方法类似:丢弃以前数据,第二种则是丢弃后到的数据。而且,第二种方法必须等命令处理程序完成后才处理下一个数据包,而第一种和第三种方只需命令处理程序将数据收取后就可处理下一个数据包。也就是说,第一种和第三种与命令处理程序并行处理,第二种方法为串行处理。

现在,一般情况下,开发的效率第一,执行的效率(包括执行时间和资源占用)第二。在这种情况下,降低些许效率换取开发的效率的较大提高,何乐而不为?何况,单个模块的执行的效率高不等于整个程序执行效率高。例如,如果程序需要等待一段时间,一般用程序延时或定时器延时。无论何种方法,CPU不再处理其它工作,效率很低。而用RTOS,等待的时候CPU可以处理其它工作,效率得到提高。

以下摘自《uC/OS-II--源码公开的实时嵌入式操作系统》

“实时内核也称为实时操作系统或RTOS。使用它使得实时应用程序的设计和扩展变得容易。不需要大的改动就可以增加新的功能。通过应用程序分割为若干独立的任务,RTOS使得应用程序的设计过程大为简化。使用可剥夺性的内核时,所有时间要求苛刻的事件都得到了尽可能快捷、有效的处理。通过有效的服务;如信号量、邮箱、队列、延时、超时等;RTOS使得资源得到更好的利用。

“如果应用项目对额外的需求可以承受,应该考虑使用实时内核。这些额外的需求是:内核的价格,额外ROM/RAM开销,2至4百分点的CPU额外负担。

“还有没提到的一个因素是使用实时内核增加的价格成本。在一些应用中,价格就是一切,以至于对使用RTOS连想都不敢想。”

总而言之,适用的就是最好的,不要拒绝RTOS,在它适用的情况下,它工作得很好

本文转自:单片机与嵌入式

围观 25

单片机是控制电子产品的大脑

现如今,我们生活中的许多电器都使用了单片机。例如:手机、电视机、冰箱、洗衣机、以及按下开关,LED就闪烁的儿童玩具。那么,单片机在这些电器中究竟做了些什么呢?

单片机是这些电器动作的关键,是指挥硬件运行的。例如:接收按钮或按键的输入信号,按照事先编好的程序,指挥马达和LCD的外围功能电路动作。

那么,单片机是如何构成的呢?如图1所示。

单片机是由CPU、内存、外围功能等部分组成的。如果将单片机比作人,那么CPU是负责思考的,内存是负责记忆的,外围功能相当于视觉的感官系统及控制手脚动作的神经系统。

图1:单片机的构成要素

尽管我们说CPU相当于人的大脑,但是它却不能像人的大脑一样,能有意识的、自发的思考。CPU只能依次读取并执行事先存储在内存中的指令组合(程序)。当然CPU执行的指令并不是“走路”、“讲话”等高难度命令,而是一些非常简单的指令,象从内存的某个地方“读取数据”或把某个数据“写入”内存的某个地方,或做加法、乘法和逻辑运算等等。然而这些简单指令的组合,却能实现许多复杂的功能。

会思考的CPU

让我们从CPU的构成来了解它的作用吧,如图2所示。

图2:CPU的作用

◇程序计数器
CPU读取指令时需要知道要执行的指令保存在内存的什么位置,这个位置信息称为地址(相当于家庭住址)。程序计数器(PC)就是存储地址的寄存器。通常,PC是按1递增设计的,也就是说,当CPU执行了0000地址中的指令后,PC会自动加1,变成0001地址。每执行一条指令PC都会自动加1,指向下一条指令的地址。可以说,PC决定了程序执行的顺序。

◇指令解码电路
指令解码电路是解读从内存中读取的指令的含义。运算电路是根据解码结果操作的。确切地讲,指令解码电路就是我们在“数字电路入门(2)”中学过的解码电路,只不过电路结构稍微复杂些,所以,指令解码电路的工作原理就是从被符号化(被加密)的指令中,还原指令。

◇运算电路
运算电路也称为ALU(Arithmetic and Logic Unit),是完成运算的电路。能进行加法、乘法等算术运算、也能进行AND、OR 、BIT-SHIFT等逻辑运算。运算是在指令解码电路的控制下进行的。通常运算电路的构成都比较复杂。

◇CPU内部寄存器
CPU内部寄存器是存储临时信息的场所。有存储运算值和运算结果的通用寄存器,也有一些特殊寄存器,比如存储运算标志的标志寄存器等。也就是说,运算电路进行运算时,并不是在内存中直接运算的,而是将内存中的数据复制到通用寄存器,在通用寄存器中进行运算的。

CPU的工作原理

让我们通过一个具体运算3+4,来说明CPU的操作过程吧。

假设保存在内存中的程序和数据如下。


◇步骤1:当程序被执行时,CPU就读取当前PC指向的地址0000中的指令(该操作称为指令读取)。经过解码电路解读后,这条指令的意思是“读取0100地址中的内容,然后,保存到寄存器1”。于是CPU就执行指令,从0100地址中读取数据,存入寄存器1。

寄存器1:0→3(由0变为3)
由于执行了1条指令,因此,PC的值变为0001

◇步骤2:由于PC的值为0001,因此CPU就读取0001地址中的指令,经解码电路解码后,CPU执行该指令。然后PC再加1。

寄存器2:0→4(由0变为4)
PC:0001→0000

◇步骤3:由于PC的值为0002,因此CPU从0002地址中读取指令,送给指令解码电路。解码结果是:将寄存器1和寄存器2相加,然后将结果存于寄存器1。

寄存器1:3→7
PC:2→3

于是3+4的结果7被存于寄存器1,加法运算结束。CPU就是这样,依次处理每一条简单的指令。

能记忆的内存

内存是单片机的记忆装置,主要记忆程序和数据,大体上分为ROM和RAM两大类。

◇ROM
ROM(Read Only Memory)是只读内存的简称。保存在ROM中的数据不能删除,也不会因断电而丢失。ROM主要用于保存用户程序和在程序执行中保持不变的常数。

大多数瑞萨(Renesas)的单片机都用闪存作为ROM。这是因为闪存不仅可以象ROM一样,即使关机也不会丢失数据,而且还允许修改数据。

◇RAM
RAM(Random Access Memory)是可随机读/写内存的简称。可以随时读写数据,但关机后,保存在RAM中的数据也随之消失。主要用于存储程序中的变量。

在单芯片单片机中(*1),常常用SRAM作为内部RAM。SRAM允许高速访问,但是,内部结构太复杂,很难实现高密度集成,不适合用作大容量内存。

除SRAM外,DRAM也是常见的RAM。DRAM的结构比较容易实现高密度集成,因此,比SRAM的容量大。但是,将高速逻辑电路和DRAM安装于同一个晶片上较为困难,因此,一般在单芯片单片机中很少使用,基本上都是用作外围电路。

(*1)单芯片单片机是指:将CPU,ROM,RAM,振荡电路,定时器和串行I/F等集成于一个LSI的微处理器。单芯片单片机的基础上再配置一些系统的主要外围电路,而形成的大规模集成电路称为系统LSI。

“为何要使用单片机……”

为什么很多电器设备都要使用单片机呢?

让我们用一个点亮LED的电路为例,来说明。如图3所示,不使用单片机的电路是一个由LED,开关和电阻构成的简单电路。

图3:不安装单片机的LED电路

使用单片机的电路如图4所示。

图4:安装单片机的LED电路图

很显然,使用单片机的电路要复杂得多,而且设计电路还要花费精力与财力。好象使用单片机并没有什么优点。但是,现在下结论还为时尚早。

如果我们让这个电路做一些比较复杂的操作,会怎么样呢。例如:如果希望LED在按下开关后,经过一段时间再点亮或熄灭,那么,对于安装有单片机的电路来说,只需更改单片机中的程序就可以了,并不需更改原电路。另一方面,对于没有单片机的电路来说,就必须在元电路中加入定时器IC,或者用标准逻辑IC和FPGA构成逻辑电路,才能实现这个功能。

也就是说,在更改和添加新功能时,带有单片机的电路显然更加容易实现。这正是电器设备使用单片机的原因。单片机可真是个方便的东西哦!

来源:EDN电子技术设计
原文链接:
https://mp.weixin.qq.com/s/U56Zj1ObMCnb6AZyFf238w
声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有,如涉及侵权,请联系小编邮箱 demi@eetrend.com 进行处理。

围观 19

全新AC-DC控制器采用已向Würth Elektronik eiSos授权的Inde-Flux™变压器技术,简化设计,减小尺寸并降低成本

在现代离线AC-DC电源解决方案中,可编程性和自适应控制提供了智能家居设备所需的灵活性和智能性,以便更好地与电源系统连接。在这些系统中,次级侧单片机(MCU)通常无法在不使用独立偏置电源的情况下启动系统。Microchip Technology Inc.(美国微芯科技公司)推出一款全新参考设计,利用MCP1012高压辅助AC-DC控制器解决了这一问题,可在许多应用中取消独立偏置电源。MCP1012离线辅助器件使系统能将功率和占空比的控制转移到次级侧单片机上。通过简化设计、减小尺寸和成本,系统与负载之间的控制可以实现更加精确和有目的地耦合。

参考设计采用专利隔离技术用于隔离反馈。这项专利隔离技术称为Inde-Flux变压器技术,已向Würth Elektronik eiSos公司授权。Inde-Flux变压器(部件编号750318659)是Würth Elektronik eiSos利用该专利制造的第一款变压器,将作为Microchip 15W MCP1012离线参考设计的组件出售。这款变压器将信号功率和信号通信结合到一个器件中,无需光反馈或独立的信号变压器。全新参考设计还可以选择采用更传统的方法,使用平面脉冲变压器,与更传统的光耦合器和信号变压器一起工作。通过使用该变压器和Microchip新推出的MCP1012 AC-DC控制器以及SAM D20系列32位单片机组合,可实现次级侧控制。

MPC1012初级侧辅助控制器为次级侧单片机提供了系统启动、门控和保护离线反激转换器的功能。该器件具有一系列功能,如直接测量和主动稳压或稳流,通过直接闭环实现高环路带宽,以及简化负载参考系统的通信。

15W MCP102离线参考设计为15W离线电源设计提供了主要工作元素,并配备了必要固件,以消除初级侧辅助电源。这可以降低系统的复杂性,包括消除许多应用中对光耦的需求,如家电和智能音箱。在Würth Elektronik eiSos的支持下,Inde-Flux变压器技术可根据需要扩展到不同电压和功率水平的标准和定制变压器设计。

Microchip模拟、电源和接口业务部高级副总裁Rich Simoncic表示:“将采用Inde-Flux技术的Würth Elektronik eiSos变压器与我们的MCP1012 AC-DC控制器和SAM D20系列32位单片机相结合,为离线电源管理创造了一个独特的解决方案。这些器件能够更简单、更可靠地实现主元件和辅助元件之间的复杂双向通信,这些元件用于许多利用离线电源的隔离应用中。当解决方案用于具有次级侧单片机的系统时,客户可节省高达60%的偏置电源面积,并将偏置电源物料清单成本降低3美元以上。”

开发工具

15W MCP1012 离线参考设计包括用户指南,并附带原理图和物料清单、设计文件、固件和一个演示装置。Microchip还为MCP1012 AC-DC控制器提供了基础款1W评估板DT100118。

供货与定价

15W MCP1012离线参考设计,部件编号为EV37F82A,现已上市,每件售价225美元。DT100118 1W参考设计现已上市,每件售价115美元。MCP1012-V/EKA现已上市,5000件起售的单价是0.40美元起。

如需了解更多信息,请联系Microchip销售代表、全球授权分销商或访问Microchip网站。欲购买本新闻稿提及的产品,请访问 Microchip直销网站或联系Microchip授权分销商。

Microchip Technology Inc. 简介

Microchip Technology Inc.是致力于智能、互联和安全的嵌入式控制解决方案的领先供应商。 其易于使用的开发工具和丰富的产品组合让客户能够创建最佳设计,从而在降低风险的同时减少系统总成本,缩短上市时间。Microchip的解决方案为工业、汽车、消费、航天和国防、通信以及计算市场中12万多家客户提供服务。Microchip总部位于美国亚利桑那州Chandler市,提供出色的技术支持、可靠的产品交付和卓越的质量。详情请访问公司网站www.microchip.com

围观 17

三极管在数字电路里的开关特性,最常见的应用有 2 个:一个是控制应用,一个是驱动应用。

所谓的控制就是如图 3-7 里边介绍的,我们可以通过单片机控制三极管的基极来间接控制后边的小灯的亮灭,用法大家基本熟悉了。还有一个控制就是进行不同电压之间的转换控制,比如我们的单片机是 5V 系统,它现在要跟一个 12V 的系统对接,如果 IO 直接接 12V电压就会烧坏单片机,所以我们加一个三极管,三极管的工作电压高于单片机的 IO 口电压,用 5V 的 IO 口来控制 12V 的电路,如图1 所示。

图1 三极管实现电压转换

图1 中,当 IO 口输出高电平 5V 时,三极管导通,OUT 输出低电平 0V,当 IO 口输出低电平时,三极管截止,OUT 则由于上拉电阻 R2 的作用而输出 12V 的高电平,这样就实现了低电压控制高电压的工作原理。

所谓的驱动,主要是指电流输出能力。我们再来看如图 2 中两个电路之间的对比。

图2 LED 小灯控制方式对比

图 2 中上边的 LED 灯,和我们第二课讲过的 LED 灯是一样的,当 IO 口是高电平时,小灯熄灭,当 IO 口是低电平时,小灯点亮。那么下边的电路呢,按照这种推理,IO 口是高电平的时候,应该有电流流过并且点亮小灯,但实际上却并非这么简单。

单片机主要是个控制器件,具备四两拨千斤的特点。就如同杠杆必须有一个支点一样,想要撑起整个地球必须有力量承受的支点。单片机的 IO 口可以输出一个高电平,但是他的输出电流却很有限,普通 IO 口输出高电平的时候,大概只有几十到几百 uA 的电流,达不到1mA,也就点不亮这个 LED 小灯或者是亮度很低,这个时候如果我们想用高电平点亮 LED,就可以用上三极管来处理了,我们板上的这种三极管型号,可以通过 500mA 的电流,有的三极管通过的电流还更大一些,如图 3 所示。

图3 三极管驱动 LED 小灯

图 3 中,当 IO 口是高电平,三极管导通,因为三极管的电流放大作用,c 极电流就可以达到 mA 以上了,就可以成功点亮 LED 小灯。

虽然我们用了 IO 口的低电平可以直接点亮 LED,但是单片机的 IO 口作为低电平,输入电流就可以很大吗?这个我想大家都能猜出来,当然不可以。单片机的 IO 口电流承受能力,不同型号不完全一样,就 STC89C52 来说,官方手册的 81 页有对电气特性的介绍,整个单片机的工作电流,不要超过 50mA,单个 IO 口总电流不要超过 6mA。即使一些增强型 51 的IO 口承受电流大一点,可以到 25mA,但是还要受到总电流 50mA 的限制。那我们来看电路图的 8 个 LED 小灯这部分电路,如图 4 所示。

图4 LED 电路图(一)

这里我们要学会看电路图的一个知识点,电路图右侧所有的 LED 下侧的线最终都连到一根黑色的粗线上去了,大家注意,这个地方不是实际的完全连到一起,而是一种总线的画法,画了这种线以后,表示这是个总线结构。而所有的名字一样的节点是一一对应的连接到一起,其他名字不一样的,是不连在一起的。比如左侧的 DB0 和右侧的最右边的 LED2 小灯下边的DB0 是连在一起的,而和 DB1 等其他线不是连在一起的。

那么我们把图 4 中现在需要讲解的这部分单独摘出来看,如图 5 所示。

图5 LED 电路图(二)

现在我们通过 3-12 的电路图来计算一下,5V 的电压减去 LED 本身的压降,减掉三极管e 和 c 之间的压降,限流电阻用的是 330 欧,那么每条支路的电流大概是 8mA,那么 8 路 LED如果全部同时点亮的话电流总和就是 64mA。这样如果直接接到单片机的 IO 口,那单片机肯定是承受不了的,即使短时间可以承受,长时间工作就会不稳定,甚至导致单片机烧毁。

有的同学会提出来可以加大限流电阻的方式来降低这个电流。比如改到 1K,那么电流不到 3mA,8 路总的电流就是 20mA 左右。首先,降低电流会导致 LED 小灯亮度变暗,小灯的亮度可能关系还不大,但因为我们同样的电路接了数码管,后边我们要讲数码管还要动态显示,如果数码管亮度不够的话,那视觉效果就会很差,所以降低电流的方法并不可取。其次,对于单片机来说,他主要是起到控制作用,电流输入和输出的能力相对较弱,P0 的 8 个口总电流也有一定限制,所以如果接一两个 LED 小灯观察,可以勉强直接用单片机的 IO 口来接,但是接多个小灯,从实际工程的角度去考虑,就不推荐直接接 IO 口了。那么我们如果要用单片机控制多个 LED 小灯该怎么办呢?

除了三极管之外,其实还有一些驱动 IC,这些驱动 IC 可以作为单片机的缓冲器,仅仅是电流驱动缓冲,不起到任何逻辑控制的效果,比如我们板子上用的 74HC245 这个芯片,这个芯片在逻辑上起不到什么别的作用,就是当做电流缓冲器的,我们通过查看其数据手册,74HC245 稳定工作在 70mA 电流是没有问题的,比单片机的 8 个 IO 口大多了,所以我们可以把他接在小灯和 IO 口之间做缓冲,如图 6 所示。

图6 74HC245 功能图

从图6 我们来分析,其中 VCC 和 GND 就不用多说了,细心的同学会发现这里有个0.1uF 的去耦电容哦。

74HC245 是个双向缓冲器,1 引脚 DIR 是方向引脚,当这个引脚接高电平的时候,右侧所有的 B 编号的电压都等于左侧 A 编号对应的电压。比如 A1 是高电平,那么 B1 就是高电平,A2 是低电平,B2 就是低电平等等。如果 DIR 引脚接低电平,得到的效果是左侧 A 编号的电压都会等于右侧 B 编号对应的电压。因为我们这个地方控制端是左侧接的是 P0 口,我们要求 B 等于 A 的状态,所以 1 脚我们直接接的 5V 电源,即高电平。图 6 中还有一排电阻 R10 到 R17 是上拉电阻,这个电阻的用法我们在后边介绍。

还有最后一个使能引脚 19 脚 OE,叫做输出使能,这个引脚上边有一横,表明是低电平有效,当接了低电平后,74HC245 就会按照刚才上边说的起到双向缓冲器的作用,如果 OE接了高电平,那么无论 DIR 怎么接,A 和 B 的引脚是没有关系的,也就是 74HC245 功能不能实现出来。

从下面的图 7 可以看出来,单片机的 P0 口和 74HC245 的 A 端是直接接起来的。这个地方,有个别同学有个疑问,就是我们明明在电源 VCC 那地方加了一个三极管驱动了,为何还要再加 245 驱动芯片呢。这里大家要理解一个道理,电路上从正极经过器件到地,首先必须有电流才能正常工作,电路中任何一个位置断开,都不会有电流,器件也就不会参与工作了。其次,和水流一个道理,从电源正极到负极的电流水管的粗细都要满足要求,任何一个位置的管子过细,都会出现瓶颈效应,电流在整个通路中细管处会受到限制而降低,所以在电路通路的每个位置上,都要保证通道足够畅通,这个 74HC245 的作用就是消除单片机IO 这一环节的瓶颈。

图7 单片机与 74HC245 的连接

免责声明:本文系网络转载,版权归原作者所有。如有不妥请联系删除!

围观 48

单片机的状态机框架!

demi的头像

在单片机裸机的编程方法中,状态机的方法是比较好的,经典的比如按键的检测判断等。

其实有很多地方可以使用这种思想。比如传感器的数据采集,因为单片机不可能一直等待着运行,那样的效率是很低的,通常都是结合fsm + timer的方式来提高CPU的使用率。

随着单片机系统越来越广泛地应用于消费类电子、医疗、工业自动化、智能化仪器仪表、航空航天等各领域,单片机系统面临着电磁干扰(EMI)日益严重的威胁。电磁兼容性(EMC)包含系统的发射和敏感度两方面的问题。

如果一个单片机系统符合下面三个条件,则该系统是电磁兼容的:

① 对其它系统不产生干扰;
② 对其它系统的发射不敏感;
③ 对系统本身不产生干扰。

假若干扰不能完全消除,但也要使干扰减少到最小。干扰的产生不是直接的(通过导体、公共阻抗耦合等),就是间接的(通过串扰或辐射耦合)。电磁干扰的产生是通过导体和通过辐射,很多电磁发射源,如光照、继电器、DC电机和日光灯都可引起干扰;AC电源线、互连电缆、金属电缆和子系统的内部电路也都可能产生辐射或接收到不希望的信号。在高速单片机系统中,时钟电路通常是宽带噪声的最大产生源,这些电路可产生高达300 MHz的谐波失真,在系统中应该把它们去掉。另外,在单片机系统中,最容易受影响的是复位线、中断线和控制线。

1、干扰的耦合方式

(1) 传导性EMI
一种最明显而往往被忽略的能引起电路中噪声的路径是经过导体。一条穿过噪声环境的导线可捡拾噪声并把噪声送到其它电路引起干扰。设计人员必须避免导线捡拾噪声和在噪声引起干扰前,用去耦办法除去噪声。最普通的例子是噪声通过电源线进入电路。若电源本身或连接到电源的其它电路是干扰源,则在电源线进入电路之前必须对其去耦。

(2) 公共阻抗耦合
当来自两个不同电路的电流流经一个公共阻抗时就会产生共阻抗耦合。阻抗上的压降由两个电路决定,来自两个电路的地电流流经共地阻抗。电路1的地电位被地电流2调制,噪声信号或DC补偿经共地阻抗从电路2耦合到电路1。

(3) 辐射耦合
经辐射的耦合通称串扰。串扰发生在电流流经导体时产生电磁场,而电磁场在邻近的导体中感应瞬态电流。

(4) 辐射发射
辐射发射有两种基本类型:差分模式(DM)和共模(CM)。共模辐射或单极天线辐射是由无意的压降引起的,它使电路中所有地连接抬高到系统地电位之上。就电场大小而言,CM辐射是比DM辐射更为严重的问题。为使CM辐射最小,必须用切合实际的设计使共模电流降到零。

2、影响EMC的因数

① 电压。电源电压越高,意味着电压振幅越大,发射就更多,而低电源电压影响敏感度。
② 频率。高频产生更多的发射,周期性信号产生更多的发射。在高频单片机系统中,当器件开关时产生电流尖峰信号;在模拟系统中,当负载电流变化时产生电流尖峰信号。
③ 接地。在所有EMC问题中,主要问题是不适当的接地引起的。有三种信号接地方法:单点、多点和混合。在频率低于1 MHz时,可采用单点接地方法,但不适于高频;在高频应用中,最好采用多点接地。混合接地是低频用单点接地,而高频用多点接地的方法。地线布局是关键,高频数字电路和低电平模拟电路的地回路绝对不能混合。
④ PCB设计。适当的印刷电路板(PCB)布线对防止EMI是至关重要的。
⑤ 电源去耦。当器件开关时,在电源线上会产生瞬态电流,必须衰减和滤掉这些瞬态电流。来自高di/dt源的瞬态电流导致地和线迹“发射”电压,高di/dt 产生大范围高频电流,激励部件和线缆辐射。流经导线的电流变化和电感会导致压降,减小电感或电流随时间的变化可使该压降最小。

3、印刷电路板(PCB)的电磁兼容性设计

PCB是单片机系统中电路元件和器件的支撑件,它提供电路元件和器件之间的电气连接。随着电子技术的飞速发展,PCB的密度越来越高。PCB设计的好坏对单片机系统的电磁兼容性影响很大,实践证明,即使电路原理图设计正确,印刷电路板设计不当,也会对单片机系统的可靠性产生不利影响。例如,如果印刷板两条细平行线靠得很近,则会形成信号波形的延迟,在传输线的终端形成反射噪声。因此,在设计印刷电路板的时候,应注意采用正确的方法,遵守PCB设计的一般原则,并应符合抗干扰设计的要求。

3.1 PCB设计的一般原则

要使电子电路获得最佳性能,元器件的布局及导线的布设是很重要的。为了设计质量好、成本低的PCB,应遵循以下一般性原则。

(1) 特殊元器件布局

首先,要考虑PCB尺寸的大小:PCB尺寸过大时,印刷线条长,阻抗增加,抗噪声能力下降,成本也增加;过小,则散热不好,且邻近线条易受干扰。在确定PCB尺寸后,再确定特殊元器件的位置。最后,根据电路的功能单元,对电路的全部元器件进行布局。

在确定特殊元器件的位置时要遵守以下原则:
① 尽可能缩短高频元器件之间的连线,设法减少它们的分布参数和相互间的电磁干扰。易受干扰的元器件不能相互挨得太近,输入和输出元件应尽量远离。
② 某些元器件或导线之间可能有较高的电位差,应加大它们之间的距离,以免放电引出意外短路。带高电压的元器件应尽量布置在调试时手不易触及的地方。
③ 重量超过15 g的元器件,应当用支架加以固定,然后焊接。那些又大又重、发热量多的元器件,不宜装在印刷板上,而应装在整机的机箱底板上,且应考虑散热问题。热敏元件应远离发热元件。
④ 对于电位器、可调电感线圈、可变电容器、微动开关等可调元件的布局,应考虑整机的结构要求。若是机内调节,应放在印刷板上方便调节的地方;若是机外调节,其位置要与调节旋钮在机箱面板上的位置相适应。
⑤ 留出印刷板定位孔及固定支架所占用的位置。

(2) 一般元器件布局

根据电路的功能单元,对电路的全部元器件进行布局时,要符合以下原则:
① 按照电路的流程安排各个功能电路单元的位置,使布局便于信号流通,并使信号尽可能保持一致的方向。
② 以每个功能电路的核心元件为中心,围绕它来进行布局。元器件应均匀、整齐、紧凑地排列在PCB上,尽量减少和缩短各元器件之间的引线和连接。
③ 在高频下工作的电路,要考虑元器件之间的分布参数。一般电路应尽可能使元器件平行排列,这样,不但美观,而且装焊容易,易于批量生产。
④ 位于电路板边缘的元器件,离电路板边缘一般不小于2 mm。电路板的最佳形状为矩形。长宽比为3:2或4:3。电路板面尺寸大于200 mm&TImes;150 mm时,应考虑电路板所受的机械强度。

(3) 布线

布线的原则如下:
① 输入输出端用的导线应尽量避免相邻平行,最好加线间地线,以免发生反馈耦合。
② 印刷板导线的最小宽度主要由导线与绝缘基板间的粘附强度和流过它们的电流值决定。当铜箔厚度为0.5 mm、宽度为1~15 mm时,通过2 A的电流,温升不会高于3℃。因此,导线宽度为1.5 mm可满足要求。对于集成电路,尤其是数字电路,通常选0.02~0.3 mm导线宽度。当然,只要允许,还是尽可能用宽线,尤其是电源线和地线。导线的最小间距主要由最坏情况下的线间绝缘电阻和击穿电压决定。对于集成电路,尤其是数字电路,只要工艺允许,可使间距小于0.1~0.2 mm。
③ 印刷导线拐弯处一般取圆弧形,而直角或夹角在高频电路中会影响电气性能。此外,尽量避免使用大面积铜箔,否则,长时间受热时,易发生铜箔膨胀和脱落现象。必须用大面积铜箔时,最好用栅格状,这样有利于排除铜箔与基板间粘合剂受热产生的挥发性气体。

(4) 焊盘

焊盘中心孔要比器件引线直径稍大一些。焊盘太大易形成虚焊。焊盘外径D一般不小于(d+1.2) mm,其中d为引线孔径。对高密度的数字电路,焊盘最小直径可取(d+1.0) mm。

3.2 PCB及电路抗干扰措施

印刷电路板的抗干扰设计与具体电路有着密切的关系,这里仅就PCB抗干扰设计的几项常用措施作一些说明。

(1) 电源线设计

根据印刷线路板电流的大小,尽量加粗电源线宽度,减少环路电阻;同时,使电源线、地线的走向和数据传递的方向一致,这样有助于增强抗噪声能力。

(2) 地线设计

在单片机系统设计中,接地是控制干扰的重要方法。如能将接地和屏蔽正确结合起来使用,可解决大部分干扰问题。单片机系统中地线结构大致有系统地、机壳地(屏蔽地)、数字地(逻辑地)和模拟地等。在地线设计中应注意以下几点:
① 正确选择单点接地与多点接地。在低频电路中,信号的工作频率小于1 MHz,它的布线和器件间的电感影响较小,而接地电路形成的环流对干扰影响较大,因而应采用一点接地的方式。当信号工作频率大于10 MHz时,地线阻抗变得很大,此时应尽量降低地线阻抗,应采用就近多点接地。当工作频率在1~10MHz时,如果采用一点接地,其地线长度不应超过波长的 1/20,否则应采用多点接地法。
② 数字地与模拟地分开。电路板上既有高速逻辑电路,又有线性电路,应使它们尽量分开,而两者的地线不要相混,分别与电源端地线相连。低频电路的地应尽量采用单点并联接地,实际布线有困难时可部分串联后再并联接地;高频电路宜采用多点串联接地,地线应短而粗。高频元件周围尽量
用栅格状大面积地箔,要尽量加大线性电路的接地面积。
③ 接地线应尽量加粗。若接地线用很细的线条,则接地电位会随电流的变化而变化,致使电子产品的定时信号电平不稳,抗噪声性能降低。因此应将接地线尽量加粗,使它能通过三倍于印刷电路板的允许电流。如有可能,接地线的宽度应大于3 mm。
④ 接地线构成闭环路。设计只由数字电路组成的印刷电路板的地线系统时,将接地线做成闭路可以明显地提高抗噪声能力。其原因在于:印刷电路板上有很多集成电路元件,尤其遇有耗电多的元件时,因受接地线粗细的限制,会在地线上产生较大的电位差,引起抗噪能力下降;若将接地线构成环路,则会缩小电位差值,提高电子设备的抗噪声能力。

(3) 退耦电容配置

PCB设计的常规做法之一,是在印刷板的各个关键部位配置适当的退耦电容。退耦电容的一般配置原则是:
① 电源输入端跨接10~100μF的电解电容器。如有可能,接100μF以上的更好。
② 原则上每个集成电路芯片都应布置一个0.01 pF的瓷片电容。如遇印刷板空隙不够,可每4~8个芯片布置一个1~10 pF的钽电容。
③ 对于抗噪能力弱、关断时电源变化大的器件,如RAM、ROM存储器件,应在芯片的电源线和地线之间直接接入退耦电容。
④ 电容引线不能太长,尤其是高频旁路电容不能有引线。

此外,还应注意以下两点:
① 在印刷板中有接触器、继电器、按钮等元件时,操作它们时均会产生较大火花放电,必须采用RC电路来吸收放电电流。一般R取1~2 kΩ,C取2.2~47μF。
② CMOS的输入阻抗很高,且易受感应,因此在使用时,对不用端要接地或接正电源。

(4) 振荡器

几乎所有的单片机都有一个耦合于外部晶体或陶瓷谐振器的振荡器电路。在PCB上,要求外接电容、晶体或陶瓷谐振器的引线越短越好。RC振荡器对干扰信号有潜在的敏感性,它能产生很短的时钟周期,因而最好选晶体或陶瓷谐振器。另外,石英晶体的外壳要接地。

(5) 防雷击措施

室外使用的单片机系统或从室外架空引入室内的电源线、信号线,要考虑系统的防雷击问题。常用的防雷击器件有:气体放电管、TVS(Transient Voltage Suppression)等。气体放电管是当电源电压大于某一数值时,通常为数十V或数百V,气体击穿放电,将电源线上强冲击脉冲导入大地。TVS可以看成两个并联且方向相反的齐纳二极管,当两端电压高于某一值时导通。其特点是可以瞬态通过数百乃至上千A的电流。

结语

为了提高单片机系统的电磁兼容性,不仅要合理设计PCB板,而且要在电路结构上及软件中采取相应的措施。实践表明,在单片机系统的设计、制造、安装和运行的各个阶段,都需要考虑其电磁兼容性,只有这样,才能保证系统长期稳定、可靠、安全地运行。

来源:网络

围观 32

页面

订阅 RSS - 单片机