单片机

很多人都认为,单机片和CPU不是属于两种不同的东西吗?他们怎么可以拿来比较,其实有专业人士就知道单机片和CPU 的关系可以说是十分的密切。本文来分享一下,他们到底隐藏着什么秘密。

什么是单片机,相信很多人都还不知道。也不知道单片机的作用是什么。单片机简称为单片微控制器(Microcontroler),它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上,相当于一个微型的计算机,因为它最早被用在工业控制领域。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对提及要求严格的控制设备当中。Intel的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。

大家都知道我们的电脑主要是由中央处理单元CPU(进行运算、控制)、随机存储器RAM(数据存储)、存储器ROM(程序存储)、输入/输出设备I/O(串行口、并行输出口等)。安装在一个被称之为主板的印刷线路板上,就是我们个人的计算机了。

把单片机看成一个整体分成四块就很容易认识了。 把这些东西(CPU,硬盘,内存,主板等等)用集成块做好后,如下图所视:

就成了我们要学习的“单片机”了。而在单机片的内部,CPU,硬盘,内存,主板等等却又是另外的名字。

1)CPU(Central Processing Unit)。它是单片机的核心部件,包括运算器和控制器。运算器既是算术逻辑单元ALU(ArithmeTIc logic Unit),其功能是进行算术运算和逻辑运算。控制器一般由指令寄存器、指令译码器、时序电路和控制电路组成。起作用是完成取指令、将指令译码形成各种微操作并执行指令,同时控制计算机的各个部件有条不紊地工作。

2)计算机中的内存,在单片机里叫数据存储器,也叫随机存储器。用RAM(Random Access Memery)表示。其作用是用于存放运算的中间结果,数据暂存和缓冲,标志位等。特点是:掉电后会丢失数据。

3)计算机中的硬盘,在单片机中,叫程序存储器,也叫只读存储器。用ROM(Read only memery)表示。其作用和硬盘差不多,用来存放用户程序。特点是:掉电后不会丢失数据。

4)输入/输出设备I/O“主板”,在单片机里,叫做I/O(输入输出设备)当然也包含了串行口,并行口,定时器,记时器等等。

来源:网络转载

围观 92

单片机就是个小计算机,大计算机少不了的数据存储系统,单片机一样有,而且往往和CPU集成在一起,更加显得小巧灵活。

直到90年代初,国内容易得到的单片机就是8031:不带存储器的芯片,要想工作,还必须外加RAM和ROM,单片机成了3片机......

现在不同了,大的小的又是51,又是AVR又是STC,还有什么430,PIC等等,都各说各的好,可是谁也不敢说“我不要存储器”。

单片机的数据存储手段

程序存储器ROM

程序存储器里面存放的是单片机的灵魂:工作程序。

小的可能只有1KB,最多只能装1024条8位数据,因为实际指令还有许多2字节,3字节指令,所以它还装不下1024条指令。大的也有128KB的。这些8位数据,要么在工厂里做模子光刻进去,要么一次性的烧写进去。

业余或开发,最多也就是用编程器这么一个特殊工具,把调试成功的机器码装载进去,或者像AVR单片机那样自己花几块钱做一条下载线,把电脑里这些东西灌进去(或许是AVR最吸引人之处)。

它一旦进驻电脑的程序存储器中,除了借助上述装置便不能自由改写,在单片机运行时,只是从其中读出指令或固定的数据,所以给程序存储器一个“只读存储器”的别名,简写为ROM,包括用编程器写紫外线擦除内容的EPROM、用电擦除的EEPROM和现在新兴的FLASH ROM。

一次性写入的ROM,仅用于电路和程序固定的批量产品中,实际工作起来,都是一样的。

为了定位ROM中的数据,每个8位存储单元都有一个固定的“地址”,通常用16进制数表示。例如,对于一个所谓4K的ROM,地址从0000H到0FFFH(即从0000,0001...4095),单片机运行时从哪个地址取数据,完全由程序本身决定,并不要我们干预。

记住,给单片机一通电,它经过一个短暂的复位过程,立即转向ROM的最低地址0000H,在这里面放置的往往是一条“跳转”指令,它从这里一步跳到另一个地址:程序的真正起始地址,例如51机的0080H。

ROM是程序存储器,除了指令外,还包括运行程序必须的某些固定数据,例如:数据表。假如,我们要求在单片机的接口上输出00H到FFH(255)按正弦半波变化的数值,每秒10000次。如果硬要它按照公式一个个计算,对于它来说未免力不从心。可是我们可以把预先计算好的数值存入ROM中,到时候直接取出不是好多了?

又如一个重要的应用:大家一定见过不少单片机的东西上面都有数码显示,那些个数字其实就是用单片机的口线控制数码管的字段电极电位。这些字形也是存放在ROM中的字模表,各个字模和0-9的数字(机器内当然是0000-0101二进制数)对应起来。常见的共阳极7段数码管,必须在阳极加正电,7个阴极都是地电位,才能显示数字"8",数字8对应的显示字码值是二进制数“10000000“(那个1对应的是小数点,高电位不让它显示)。

数据存储器RAM

这是个可以随时存取数据的一块存储器,也就是可以读(取)也可以写(存)的存储器,简称RAM。

现在的单片机里面使用的RAM,属于静态RAM或SRAM,这个和电脑用的内存条有所不同。只要你把数据写入SRAM后,不断电或者不清除掉,这个数据就一直保存在那里。电脑用的是动态RAM,要不断给它加刷新脉冲才能保存数据。

因为单片机处理的信息量比电脑小很多,所以它带的RAM也比较少:从完全不带、带128、256、...1K、2K,到4K,比ROM少多了。

因为实际上RAM只是作为数据临时存放的地方,除非进行图像处理需要存放大量的数据外。一般对于执行较简单任务的单片机,有这么多也够用,如果实在不够用也只能采取外加SRAM如6116、6264等等来扩展。

为了对RAM单元存取8位二进制数,当然也得和ROM一样用“地址”来标示它的具体位置。假如某单片机有1K(1024)RAM,它的地址也是从0000到1024,或16进制数的0000H到03FFH。可见,和ROM的地址是一样的。

会不会混淆不清?

不会,因为读ROM是由单片机的程序指针或转移指令或查表指令进行,而这些指令是不会进入RAM区的;读写RAM是另外的数据传送指令,也不会进入ROM区。这点也是和电脑不同之处,后者程序和数据都在内存条里面,地址不同,如果窜位了就会造成不可预见后果。单片机的这种存储器结构也称为哈佛结构。

RAM在单片机里的用途

RAM在单片机里的用途,主要是存放临时数据。

例如用单片机测温,每秒测1次,显示1分钟的平均值(1分钟更新一次):

我们先通过传感器、放大电路、A/D转换,把温度这个模拟量转变为成比例的二进制数,然后每秒钟1次把数字量通过输入口顺序存入到单片机的RAM中,然后对他们进行两两求和再平均的计算,最后的数值显示出来,然后把这60个存储单元统统写0清除旧数据,下次又是如此循环进行。

结语

另外在单片机里面还有若干寄存器,数量不多但是作用很大,除了暂存数据,还可以交换、加工、传递等等,以及随时记录单片机当前处于什么状态,输入输出口也是作为特殊功能的寄存器存在,具体各有不同,就不是随便说说可以搞清楚的,要看有关书籍了。

围观 9

新一代AVR MCU系列搭载独立于内核的外设、具备先进模拟和片上通信功能

随着物联网(IoT)为工业和家庭应用提供更强的连接性,以及车联网提升了驾驶室和操控功能,业界需要更高性能的单片机来实现更好的实时控制以及增强的人机接口应用。Microchip Technology Inc.(美国微芯科技公司)今日宣布推出下一代AVR® DA系列单片机(MCU),是其首款带有外设触摸控制器(PTC)的功能安全型AVR MCU系列。

Microchip 8位单片机事业部助理营销副总裁Greg Robinson表示:“新推出的AVR DA单片机系列继承了Microchip高性能和高代码效率器件的优势,通过搭载先进模拟和独立于内核的外设,以及比现有器件更多的电容式触摸通道,满足了多个行业的新需求。新的单片机系列产品广泛应用于智能家居安全、楼宇自动化、传感器系统等应用,以及汽车和工业自动化等领域,助力开发人员设计出更加强大、精确和响应灵敏的各类应用。”

Microchip的功能安全认证适用于具有最新安全特性的器件,这些器件同时还带有安全手册、故障模式、影响与诊断分析(FMEDA)报告,在某些情况下,还具备诊断软件,从而减少终端应用安全认证的时间和成本。AVR DA MCU系列包括多个集成的安全功能,以确保稳健的运行,诸如上电复位、欠压检测器和电压水平监控器,可确保充足的电源电压。循环冗余校验(CRC)扫描确保闪存中的应用程序代码有效。通过确保代码的完整性,可避免应用程序的意外和潜在的不安全行为。

Microchip的新型AVR DA系列MCU可在全电源电压范围内实现24 MHz的CPU速度、存储密度高达128 KB的闪存、16 KB SRAM和512 字节EEPROM,具备12位差分ADC、10位DAC、模拟比较器和过零检测器。PTC支持电容式触摸接口设计,支持按钮、滑动条、滚轮、触摸板、较小型触摸屏及广泛应用于消费和工业产品和车辆的手势控制。AVR DA系列支持多达46个自电容和529个互电容触摸通道,并采用最新一代增强型驱动屏蔽PTC和升压模式技术,提供增强的抗噪性、耐水性、触摸灵敏度和响应时间。

此外,AVR DA 系列MCU为嵌入式实时控制系统带来了额外的价值。集成事件系统支持外设间无需CPU即可进行通信。事件无延迟,信息不会丢失,为进行可靠和安全的设计提供了增强的实时性能和可预测性。通过减少CPU需要激活的时间,应用程序的总功耗得以降低。

可配置的自定义逻辑外设支持内部逻辑功能设置,无需外部元件,减少电路板空间和材料成本。凭借12位差分ADC等先进模拟特性,AVR DA系列MCU可在嘈杂环境中测量小幅度信号,非常适合于哈希环境中的传感器节点应用。

AVR DA系列MCU的高存储密度和SRAM与闪存的比率使AVR DA系列产品对无线和有线连接的传感器节点以及其他协议栈密集型应用都具有吸引力。

开发工具

Microchip AVR DA系列提供多种软硬件支持选项。软件支持包括Microchip MPLAB® X、MPLAB Xpress和Atmel Studio,代码配置工具包括MCC和START,编译器包括GCC、XC8和IAR嵌入式工作台(IAR Embedded Workbench)。XC8编译器的功能安全认证版本可通过Microchip功能安全程序获得。硬件支持包含在调试器/编程器中,包括MPLAB PICkit™ 4、MPLAB SNAP、Atmel ICE和AVR128DA48 Curiosity Nano评估工具包。

供货与定价

AVR DA系列单片机现已实现量产,10,000枚起售,单价为0.87美元。如需了解更多信息,请联系Microchip销售代表、全球授权分销商或访问Microchip网站。如需购买上述产品,请访问“Microchip直销网站”或联系Microchip授权分销商。

资源

可通过Flickr或联系编辑获取高分辨率图片(可免费发布):
应用图:
https://www.flickr.com/photos/microchiptechnology/49584374872
模块图标:https://www.flickr.com/photos/microchiptechnology/49584047206

Microchip Technology Inc. 简介

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

围观 9

单片机应用系统中,常有用单片机的I/O口来实现自关机(彻底关机)的功能。一般用单片机的一个I/O口控制一个电子开关来实现,因单片机关电后,失去电源,所以在关机时,实现关机的IO口的电平必须用低电平。

但在这里有一个矛盾,就是在电子开关关闭电源时,因有电源滤波电容的存在,单片机系统的电压不是立即变为0,而是慢慢变低,当电压低到一定电压时,单片机 将进入复位状态、或程序跑飞状态、或不确定状态,此时单片机控制关电的I/O口也可能变回高电平,将使电子开关重新开通。

解决方法:

一般单片机最低工作电压要比正常工作的电压低一些,我们就用这个差别来设计关机电路,就是让电子开关的开通电压必须大于单片机的最低工作压,这样在单片机正常工作时,此控制电压较高,能维持电子开关的正常导通,而当单片机在关电过程中因低压而产生的I/O口的高电平,因电压较低,不足以维持电子开关的导通, 从而实现彻底的关电。


在关机状态时:

S1按下,Q2导通,单片机工作后,POWER输出高电平,Q1导通,维持Q2的导通实现开机。

在开机状态时:

1、软件关机:MCU的POWER引脚输出低电平,Q1截止,Q2关断,关机。(一般用于延时关机,象数字万用表即是)

2、S1按下,低电平通过D3使MCU的输入脚ON-OFF电平为低,MCU检测到后,通过软件关机(如1所述)

D3用于隔离,不然关机状态时MCU的ON-OFF脚为低电平,Q2将导通。

POWER 是单片机输出开关电源的,低电平是0,高电平等于单片机的供电电压(近似)

ON-OFF是单片机的输入脚,用于单片机检测S1的状态,如果不用S1关机ON-OFF脚可以不用。

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

围观 58

1、采用短变量

一个提高代码效率的最基本的方式就是减小变量的长度。使用 C 编程时,我们都习惯于对循环控制变量使用 int 类型,这对 8 位的单片机来说是一种极大的浪费,你应该仔细考虑你所声明的变量值可能的范围,然后选择合适的变量类型,很明显,经常使用的变量应该是unsigned char,只占用一个字节。

2、使用无符号类型

为什么要使用无符号类型呢?原因是8051不支持符号运算,程序中也不要使用含有带符号变量的外部代码,除了根据变量长度来选择变量类型外,你还要考虑是否变量是否会用于负数的场合。如果你的程序中可以不需要负数那么把变量都定义成无符号类型的。

3、避免使用浮点指针

在 8 位操作系统上使用 32 位浮点数是得不偿失的。你可以这样做,但会浪费大量的时间,所以当你要在系统中使用浮点数的时候,你要问问自己这是否一定需要,可以通过提高数值数量级和使用整型运算来消除浮点指针,处理ints和longs比处理doubles和floats要方便得多,你的代码执行起来会更快,也不用连接处理浮点指针的模块。如果你一定要,采用浮点指针的话,你应该采用西门子 80517 和达拉斯半导体公司的 80320 这些已经对数,处理进行过优化的单片机。如果你不得不在你的代码中加入浮点指针,那么你的代码长度会增加程序执行速度也会比较慢。如果浮点指针运算能被中断的话,你必须确保要么中断中不会使用浮点指针运算,要么在中断程序前使用 fpsave 指令把中断指针推入堆栈,在中断程序执行后使用 fprestore 指令把指针恢复,还有一种方法是,当你要使用像 sin()这样的浮点运算程序时,禁止使用中断,在运算程序执行完之后再使能它。

4、使用位变量

对于某些标志位应使用位变量而不是 unsigned char,这将节省你的内存,你不用多浪费7位存储区,而且位变量在RAM中访问他们只需要一个处理周期。

5、用局部变量代替全局变量

把变量定义成局部变量比全局变量更有效率,编译器为局部变量在内部存储区中分配存储空间,而为全局变量在外部存储区中分配存储空间,这会降低你的访问速度,另一个避免使用全局变量的原因是你必须在你系统的处理过程中调节使用全局变量,因为在中断系统和多任务系统中,不止一个过程会使用全局变量。

6、为变量分配内部存储区

局部变量和全局变量可被定义在你想要的存储区中,根据先前的讨论,当你把经常使用的变量放在内部 RAM 中时,可使你的程序的速度得到提高,除此之外,你还缩短了你的代码,因为外部存储区寻址的指令相对要麻烦一些考虑到存储速度,按下面的顺序使用存储器DATA IDATA PDATA XDATA,当然你要记得留出足够的堆栈空间。

7、使用特定指针

当你在程序中使用指针时,你应指定指针的类型确定它们指向哪个区域如 XDATA 或CODE 区,这样你的代码会更加紧凑,因为编译器不必去确定指针所指向的存储区,因为你已经进行了说明。

8、使用调令

对于一些简单的操作,如变量循环位移,编译器提供了一些调令供用户使用,许多调令直接对应着汇编指令,而另外一些比较复杂并兼容 ANSI 所有这些调令都是再入函数,你可在任何地方安全的调用他们和单字节循环位移指令 RL A 和 RR A 相对应的调令是_crol_ 循环左移 和_cror_(循环右移)。如果你想对 int 或 long 类型的变量进行循环位移,调令将更加复杂而且执行的时间会更长 对于 int 类型调令为_irol_,_iror_ ,对于 long 类型调令为_lrol_,_lror_。在 C 中也提供了像汇编中 JBC 指令那样的调令_testbit_ ,如果参数位置位他将返回1,否则将返回 0 这条调令在检查标志位时十分有用,而且使 C 的代码更具有可读性调令将直接转换成 JBC 指令。

#include <instrins.h>
void serial_intr(void) interrupt 4 {
if (!_testbit_(TI)) { // 是否是发送中断
P0=1; // 翻转 P0.0
_nop_(); // 等待一个指令周期
P0=0;
...
}
if (!_testbit_(RI)) {
test=_cror_(SBUF, 1); // 将SBUF中的数据循环
// 右移一位
...
}
}

9、使用宏替代函数

对于小段代码,像使能某些电路或从锁存器中读取数据,你可通过使用宏来替代函数使得程序有更好的可读性你可把代码定义在宏中,这样看上去更像函数。编译器在碰到宏时,按照事先定义的代码去替代宏,宏的名字应能够描述宏的操作,当需要改变宏时,你只要修该宏定义处。

#define led_on() {\
led_state=LED_ON; \
XBYTE[LED_CNTRL] = 0x01;}
#define led_off() {\
led_state=LED_OFF; \
XBYTE[LED_CNTRL] = 0x00;}
#define checkvalue(val) \
( (val < MINVAL || val > MAXVAL) ? 0 : 1 )

宏能够使得访问多层结构和数组更加容易,可以用宏来替代程序中经常使用的复杂语句以减少你打字的工作量且有更好的可读性和可维护性。

10、存储器模式

C51提供了 3 种存储器模式来存储变量、过程参数和分配再入函数堆栈。你应该尽量使用小存储器模式,很少应用系统需要使用其它两种模式,像有大的再入函数堆栈系统那样。一般来说如果系统所需要的内存数小于内部RAM 数时,都应以小存储模式进行编译。在这种模式下 DATA 段是所有内部变量和全局变量的默认存储段,所有参数传递都发生在DATA 段中,如果有函数被声明为再入函数,编译器会在内部 RAM 中为他们分配空间,这种模式的优势就是数据的存取速度很快,但只有120个字节的存储空间供你使用,总共有128个字节,但至少有8个字节被寄存器组使用,你还要为程序调用开辟足够的堆栈。如果你的系统有 256 字节或更少的外部 RAM 你可以使用压缩存储模式。这样一来,如果不加说明,变量将被分配在 PDATA 段中,这种模式将扩充你能够使用的 RAM 数量,对XDATA 段以外的数据存储仍然是很快的,变量的参数传递将在内部 RAM 中进行,这样存储速度会比较快,对 PDATA 段的数据的寻址是通过 R0 和R1进行间接寻址,比使用 DPTR 要快一些在大存储模式中,所有变量的默认存储区是 XDATA 段 Keil C 尽量使用内部寄存器组进行参数传递,在寄存器组中可以传递参数的数量和和压缩存储模式一样,再入函数的模拟栈将在 XDATA中 对 XDATA 段数据的访问是最慢的,所以要仔细考虑变量应存储的位置使数据的存储速度得到优化。

11、混合存储模式

Keil 允许使用混合的存储模式,这点在大存储模式中是非常有用的。在大存储器模式下,有些过程对数据传递的速度要求很高。我就把过程定义在小存储模式寄存器中,这使得编译器为该过程的局部变量在内部 RAM中分配存储空间,并保证所有参数都通过内部 RAM进行传递。尽管采用混合模式后编译的代码长度不会有很大的改变,但这种努力是值得的就像能在大模式下把过程声明为小模式一样,你像能在小模式下把过程声明为压缩模或大模式,这一般使用在需要大量存储空间的过程上,这样过程中的局部变量将被存储在外部存储区中,你也可以通过过程中的变量声明,把变量分配在 XDATA 段中。

12、运行库

运行库中提供了很多短小精悍的函数,你可以很方便的使用他们,你自己很难写出更好的代码了。值得注意的是库中有些函数不是再入函数,如果在执行这些函数的时候被中断,而在中断程序中又调用了该函数,将得到意想不到的结果。而且这种错误很难找出来,最好禁止使用这些函数的中断。

来源:http://www.cnblogs.com/51-mcu/articles/4135544.html
转载此文目的在于传递更多信息,版权归原作者所有。

围观 23

这里利用一个实际发生的例子,针对初级工程师经常犯的一个小错误,或者经常要走的一个弯路,做了针对性的纠正。希望可以帮到大家,文笔不好,文章中有叙述不清的地方大家多多指教。

这篇文章我不是想说编程的规范性的东西,如果你想让自己的程序文件最起码直观的看起来美观、可读性强,推荐找华为的“C语言编程规范”。我只想说一说当我们的单片机遇到多个模块的数据需要处理,类似于“多任务”时我们应该怎么办?

背景是这样的,9月份开始安排一个工程师开始做电动汽车交流充电桩,机械设计部分由公司机械结构部门负责。充电桩的电子部分总体上分为X个部分(用到的资源),电阻触摸屏(RS232),M1卡读写(RS232),电能计量表(RS485),语音提示(SPI),电力开关(继电器IO),通讯接口(RS485、CAN)。

工程师做的过程非常勤奋,期间也是困难重重,改了很多个版本,第二年6月总算把充电桩立起来了。

咱们来验收一下吧,结果发现读卡的时候不能处理触摸屏,播放语音的时候不能处理读卡,语音播放不能打断或者跳跃,反正就是所有事件必须一个一个按部就班的来,一旦操作错误就需要多次执行、等待、甚至重新来过。

一个工作3年多的工程师怎么会把产品做成这样呢?看看程序吧!

一看不要紧,吓一跳!整个的程序是没有逻辑的,一条线就往下写……

While(1)
{
//上电进入主程序 或 触发触摸屏
//播放提示语音
Delay();//等待播放完毕
//读取M1卡信息
Delay();//等待读卡数据返回
//播放提示语音
Delay();//等待播放完毕
//M1卡数据交互,判定下一步操作及提示
Delay();//等待数据处理完毕
……
……
}

这里说这个工程师基本上对于自己设计的产品没有任何的整体概念,或者说对自己开发的程序用到设计上会有怎样的实际效果根本就不清楚。

他犯了几个我们在程序开发过程中最忌讳的几个问题:

1、 delay(死等)这类函数只在应该实验室验证某个功能过程中用到,在实际的产品开发时无论是主循环while中,还是其调用的函数中,亦或是中断服务程序中绝对不可以用到。

2、 产品设计的各个子模块之间的逻辑关系太强,例如:必须等待播音完毕才能读卡进入下一步操作等。

我们讲,产品设计中只有各个事件处理模块间的逻辑关系弱化,才能更加灵活地进行处理。例如:两个事件A和B,如果程序开发时将A做成B事件的必要条件,B事件的触发就必须等待A事件的发生。反之,如果A事件作为B事件处理的一个特殊情况,那么程序开发起来就变得灵活很多。

3、 没有考虑到单片机本身是一个单核单任务的架构,每一个事件都会独占CPU内核,当多个任务模块同时存在时我们应该对各个事件进行区分,我们应当分情况、分事件实时性要求等区分对待。

那么针对于这样的问题,或者是遇到类似的项目我们应该如何处理呢?

几条建议:

1、将硬件系统区分为独立单元单独做成底层驱动函数和应用函数,并且函数正常应该有参数和返回值,其中返回值是必要的。如何衡量这类函数呢?这类函数可移植性强,只要一个.h文件和一个.c文件就可以随意放到任何工程中。例如:语音播放、M1读卡、485处理等等。

2、将1中的所有函数进行时间评估,评估点有两个。一个是函数的执行时间t,第二个是函数的周期性发生的时间T,一个最基本的条件是t < T,理想情况应该是t << T。

3、建立一个集中逻辑处理函数,在这个函数中对1中的各个函数进行调度。这个函数发挥的作用相当于嵌入式系统中的系统调度。这种调度是整个硬件逻辑中所有事件处理的调度,它的目的是完成一个处理过程,但是绝不依赖于任意事件的必要处理过程。这样就将问题2中提到的事件间的逻辑关系弱化了,处理起来变得十分灵活,使得各个关系不在相互必要。

4、为了保证前面内容的正常实施还需要针对各类事件的周期,建立一个必要的时间管理函数,时间函数的基础一般情况下由一个内部定时器的中断来完成,中断的周期一般我们考虑5-10ms。按照实际需求将N个定时器中断定义为一个事件处理的周期TT,这个周期应该保证处理完最恶劣情况可能发生的所有t,且保证TT < T。

5、 这其中也有例外,一些实时性要求高的事件应当用中断完成。其中中断处理函数的处理事件应尽量短,时间要求参见2。

声明:本文系网络转载,版权归原作者所有。如涉版权问题,请联系删除。

围观 30

电源技术的发展方向之一是并联运行分布电源系统,以便通过N+1 冗余获得故障容错及冗余功率,并且建立模块式分布电源系统,以增大总负载电流。采用双端驱动集成芯片TL494 输出PWM 脉冲控制主开关的导通来控制电压输出,以ATmega128 单片机为核心,实现大电流时自动由单电源供电投切到双电源并联均流供电,增强了开关电源的带负载能力和提高电源的供电效率。模块化是开关电源发展的总体趋势,可以采用模块化电源组成分布式电源系统,可以设计成N+1冗余电源系统,并实现并联方式的容量扩展,使整个电源体积重量下降,模块中半导体器件的电流应力小,提高了系统的可靠性。本研究的开关电源在带小负载时为单电源供电,带大负载时(电流超过1.7A)自动投切为双电源并联供电,采用外特性下垂方法实现各电源均流,增强了开关电源的带负载能力和提高电源的供电效率。

1 系统设计

1.1 DC-DC 变换器电路拓扑结构

本设计选择了升压斩波电路, 其电路原理图如图1所示。选择升压轨波电路作为DC -DC 变换的主拓扑结构。

图1 升压斩波电路原理

1.2 系统性能指标

本设计采用双端驱动集成芯片TL494 输出PWM 脉冲控制主开关的导通来控制电压输出,以ATmega128 单片机为核心,实现大电流时自动由单电源供电投切到双电源并联均流供电,增强了开关电源的带负载能力和提高电源的供电效率。系统硬件主要由单片机最小系统,PWM 控制芯片TL494, 开关电源升压主电路,电流检测回路,D/A 转换电路组成。系统输出直流电压18~45V 可调,可通过键盘设定调整,最大输出电流达到4A,能对输出电压和输出电流进行测量和显示,具有调节速度快、电压调整率低、负载调整率低、效率高,输出纹波小等优点。


1.3 系统实现结构框图

综合方案比较, 最终选择以ATmega128 为主控芯片,经D/A 转换后提供参考电压,与输出反馈电压进行比较,使TL494产生相应PWM 方波, 采用图腾柱驱动对Boost 升压电路进行控制,实现输出电压可调。利用INA169 进行电流采样、光耦和IRF9540 组成自动投切电路。系统设计总框图如图2.

图2 系统设计结构框图

2 理论分析与计算

2.1 储能元件电感的选择

计算出正确的电感值对选用合适的电感和输出电容以获得最小的输出电压纹波而言非常重要。本设计采用的电感是铁硅铝双线绕电感,它的磁芯损耗远低于铁粉芯及高磁通,具有低磁致伸缩(低噪音)的特点,是低成本的储能材料,在高温下性能稳定。

2.2 开关管的选择

本课题设计系统选用MOSFET 的型号是IRF540,使用沟渠工艺封装的N 通道增强型场效应功率晶体管,常用于DC 到DC转换器、开关电源、电视及电脑显示器电源等领域中,具有低导通内阻、快速开关、低热敏电阻等显着优点,其漏源电压V_DSS 最大可达100V, 导通电流I_D 最大可达23A, 其导通电阻R_DS(on)<77mΩ,允许最大管耗PCM 可达50W,满足电路要求。

2.3 续流二极管的选择

开关电源输出整流二极管通常采用肖特基二极管或者快速恢复二极管。因为它正向压降低,又几乎没有反向恢复时间,所以在本设计中选用的整流二极管是SS35,是低功耗肖特基二极管,其反向电压达到50V,正向压降只有0.6V 左右,具有高浪涌电流能力。

2.4 PWM 脉宽调制电路

PWM 控制器电路其核心采用专用集成芯片TL494,通过适当的外接电路,不但可以产生PWM 信号输出,而且还有多种保护功能。TL494 含有振荡器、误差放大器、PWM 比较器及输出级电路等部分。本设计外接电路如图3 所示。

图3 TL494 外接电路

TL494 引脚1、2 脚是误差放大器1 的同相和反相输入端,1接输出电压反馈端IN1,引脚2 接D/A 端口,反馈信号与预设信号经误差放大器进行比较放大,控制脉冲宽度,由8 脚输出,再经图腾柱电路,控制开关管IRF540 导通。为保护TL494 的输出三极管,经R30 和R31 分压,在4 脚加接近0.3V 的间歇调整电压,整机电源取16V 单电源。

2.5 MOSFET 驱动电路

系统中开关管选用N 沟道MOSFET 型号为IRF540N,其开启电压为2~4V.但为了保证它的充分导通,一般要提供10V左右的栅极电压。为此,本设计采用一个简单可靠、成本低廉的图腾柱电路作为MOSFET 的驱动电路(如图4 所示)。PWM 信号经过第一个三极管9014 放大,再经后级NPN 型三极管9014和PNP 型三极管9015 组成的互补电路保持后可给MOS 管的栅极G 极提供11V 左右电压。该电路在开关管的导通和关断期间有较好的性能:能快速可靠开通, 且不存在上升沿的高频振荡;在关断瞬间,驱动电路能提供一个低阻抗的通路供MOSFET栅源极间电容电压的快速泄放。该电路输入和输出刚好反向。即当PWM 为低电平时,栅极得到高电压,MOS 管充分导通;当PWM 为高电平时,栅极电压几乎为0,MOS管关断。

图4 图腾柱驱动电路

2.6 电源投切开关电路

电路如图5 所示,Q5 型号为IRF9540, 是P 沟道MOSFET,U2 为光耦,型号为P521.当光耦不工作时,Q5 的源极电位比栅极电位高,Q5 导通,电源导通;当光耦工作时,源极的电位拉到了栅极,Q5 截止,电源截止。光耦不仅起到开关的作用,而且其光电隔离的特性能够很好地保护单片机的IO 端口。

3 软件设计及其功能

ATmega128单片机能够根据键盘的输入值而输送不同的D/A 值给TL494 控制芯片,以实现键盘控制电源系统输出电压的大小;对输出电流进行A/D 采集,并且能够根据电流的大小判断是否投切为双电源供电和显示相应的工作状态;在液晶5110上显示输出电压和输出电流。具体软件流程图如图6 所示。

4 实验数据测试及分析

4.1 效率及负载调整率测试(单电源供电)

当Uin=16V 时, 改变负载, 测量输出电流Io,输出电压Uo,输入电流Iin,输入电压Uin.计算其效率η,负载调整率SI.

数据可以计算出负载调整率为:SI =(20.00-19.27)/20.00*100%=2.65%, 电源具有比较强的带负载能力,最大电流接近2A,具有比较高的转换效率,平均效率达到84.34%.

4.2 双电源供电效率测试(负载10Ω)

由表2 的数据可以看出,并联供电时电源的转换效率得到了明显的提高,功率也达到了92W,大大地提高了电源的供电能力。

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

围观 63

在MSP430单片机的手册中,对于端口复位后的状态,是这样描述的:复位后,所有端口处于输入状态。

就这个问题,我们来简单说一下单片机上电复位后端口的状态问题。


首先,单片机上电后端口的状态应尽量避免处于输出状态(无论是输出低还是输出高)

为什么要这样说呢?因为单片机外围电路的动作就是靠单片机端口输出低电平或者高电平来控制的。假如单片机端口一上电就处于输出高或者低电平的状态,那么很容易出现误动作。例如,有一个端口是控制继电器的,在正常状态下,单片机端口输出低电平使得继电器吸合,输出高电平断开继电器。平时我们要求继电器处于断开状态,那就要让单片机的这个端口处于输出高电平的状态,但是如果这个单片机的端口在上电复位后是处于输出低电平的状态,这时候就会出现问题了,即使我们在程序中一开始就把这个端口置为输出高电平,但是在复位期间,这个端口的状态我们是无法控制的,于是就会出现一个瞬间的低电平,虽然这个低电平持续的时间很短,有时候不足以使继电器吸合,当继电器仍会有轻微的吸合动作。这显然是我们不希望看到的。


有些单片机复位后端口默认为输入口的原因

前面我们说了,单片机上电后,如果端口默认为输出口,那么不管是输出低电平还是高电平,都可能会引起误动作,甚至会产生致命后果。

而假如端口上电后默认为输入口呢?我们知道,单片机的输出控制操作一般都是根据输入信号来实现的。这样的话,就会好很多,我们可以根据输入情况做处理,尤其是对于瞬间的输入,我们可以通过软件抗干扰技术来进行过滤,这样我们就能自己掌握主动,让误操作不会发生。


单片机复位后端口处于高阻态的原因

单片机复位后端口处于高阻态的原因无外乎降低功耗和安全性的原因。但是在程序中,对于单片机复位后的状态,也要有合理的分配,例如不能让端口一直处于高阻态,这样容易引起电流变化(我们在设计中发现,如果端口处于高阻态,会导致静态电流不稳定),当然端口状态的设置要与硬件电路配合,对于那些不用的端口,建议设置为输出。(MSP430数据手册中说:不用的端口,建议设置为输出,置于输出高电平还是低电平,区别不大,因为这些端口没有连接任何外部器件。)

电路中也一样,要根据实际情况设置上拉或者下拉电阻等等。

来源:网络

围观 87

从单片机上知道,在上电的那一刻,MCU的程序指针PC会被初始化为上电复位时的地址,从哪个地址处读取将要执行的指令,由此程序在MCU上开始执行(当然在调用程序的 main之前,还有一系列其他的的初始化要做,如堆栈的初始化,不过这些我们很少回去修改)。PC在上电时,和MCU差不多,不过读取的是BIOS,有它完成了很多初始化操作,最后,调用系统的初始化函数,将控制权交给了操作系统,于是我们看到了Windows,Linux系统启动了。

如果将操作系统看作是在处理器上跑的一个很大的裸机程序(就是直接在硬件上跑的程序,因为操作系统就是直接跑在CPU上的,这样看待是可以的,不过这个裸机程序功能很多,很强大),那么操作系统的启动很像MCU程序的启动。前者有一个很大的初始化程序完成很复杂的初始化,后者有一段不长的汇编代码完成一些简单的初始化。这一点看,它们在流程上是很相似的。

如果是系统上的程序启动呢?它们是由系统来决定的。Linux上在shell下输入./p后,首先检查是否是一个内建的shell命令;如果不是,则shell假设他是一个可执行文件(Linux上一般是elf格式),然后调用一些相关的函数,将在硬盘上的p文件的内容拷贝到内存(DDR RAM)中,并建立一个它的运行环境(当然这里边还有内存映射,虚拟内存,连接与加载,等一些其他东西),准备执行。

由以上可知,单片机上的程序和平时在系统上运行的程序,在启动时差异是很大的(如果将程序调用main以前的动作,都抽象为初始化的话,程序的启动可以简化为:建立运行环境+调用main函数,这样程序的执行差异是不大的)。因为单片机上跑的程序(裸机程序),是和操作系统一样跑在硬件上的,它们属于一个层次的。过去之所以没有区分出单片机上的程序和PC机上的程序的一些差异,就是没有弄明白这一点。

由此,以前的一些疑惑也就解开了。为什么在单片机上的程序不怎么使用malloc,而PC上经常使用?因为单片机上没有已经写好的内存管理算法的代码,而在PC上操作系统里运行的程序,libc已经把这些都做了,只需要调用就可以了。如果在单片机上想用动态内存,也可以,但是这些代码要自己去实现,并定义一个相应的malloc,有时候一些公司会给提供一些库函数可能会实现malloc,但是因为单片机上RAM内存十分有限,如果不知道它的运行方式,估计会很危险。同样,因为在PC的系统上运行的程序与逻机程序的不同,裸机程序不会有动态链接,有的只是静态链接。

关于程序在执行时,从哪里读取指令,哪里读取数据,也曾因为没有弄清楚系统上的程序和裸机程序之间的区别,而疑惑了很久。虽然在《微型计算机原理》课上知道程序运行时,从内存中读取指令和数据进行执行和回写。但是单片机上只有几K的RAM,而flash一般有几十K甚至1M,这个时候指令和数据都在内存中吗(这里指的内存仅指RAM,因为PC上我们常说的内存就是DDR RAM memory,先入为主以至于认为单片机上也是这样,还没有明白其实RAM和Flash都是内存)?这不可能,因为课上老师只说内存,但是PC上内存一般就是DDR RAM,不会是硬盘,硬盘是保存数据的地方;由此类比时,自己把自己弄晕菜了,单片机的RAM对应于DDR RAM,那Flash是不是就对应于硬盘了呢?在CSAPP上明白了,PC上之所以都在DDR RAM上,是速度的因素。

硬盘的速度太慢,即使是即将到来的SSD比起DDRRAM,还是差着几个数量级,所以拷贝到DDRRAM中。这时,一个程序的代码和数据是连续存放的,其中代码段是只读区域,数据段是可读写区域(这是由操作系统的内存管理机制决定的)。运行时,再将它们拷贝到速度更快的SRAM中,以得到更快的执行速度。而对于,单片机而言工作频率也就几M,几十M,从Flash中与从RAM中读的差异可能并不明显,不会成为程序执行的瓶颈(而对于PC而言,Flash的速度太慢,DDRRAM的速度也是很慢,即使是SRAM也是慢了不少,于是再提高工作频率也提高不了程序的执行速度,所以现在CPU工作频率最快是在2003左右。一个瓶颈出现了。

为了提高CPU的使用率,换个角度想一下,既然不能减少一段程序的执行时间,就在同样的时间执行更多的程序,一个核执行一段程序,两个核就可以执行两段程序,于是多核CPU成为了现在的主流)。所以裸机程序指令就在Flash(Flash memory)中存放,而数据就放在了RAM中(flash的写入次数有限制,同时它的速度和RAM还是差很多)。更广泛说,在单片机上RAM存放data段,bss段,堆栈段;ROM(EPROM,EEPROM,Flash等非易失性存储设备)存放代码,只读数据段。本质上说,这和PC上程序都在RAM中存放是一样的,PC 上是操作系统规定了可读与可写,而单片机上是依靠不同的存储设备区分了可读与可写(当然现在的Flash是可读写的,如果Flash没有写入次数限制,速度又可以和RAM相差不多,单片机上是不是只要Flash就可以了呢(直接相当于PC上的DDRRAM)?这样成本也会比一个RAM,一个Flash低,更节省成本,对于生产商更划算)。

对于单片机的程序执行时指令和数据的存放与读取,理解如下:

对单片机编程后,程序的代码段,data段,bss段,rodata段等都存放在Flash中。当单片机上电后,初始化汇编代码将data段,bss段,复制到RAM中,并建立好堆栈,开始调用程序的main函数。以后,便有了程序存储器,和数据存储器之分,运行时从Flash(即指令存储器,代码存储器)中读取指令 ,从RAM中读取与写入数据。RAM存在的意义就在于速度更快。

无论是单片机也好,PC也罢,存在的存储器金字塔都是一致的,速度的因素,成本的限制导致了一级级更快的存储器的更快速度与更高的成本。应该说,对于它们的理解,就是存储器金字塔的理解。

本文转自网络,版权归原作者,如果您觉得不好,请联系我们删除!

围观 141

为了尽早熟练掌握单片机程序开发,我们在学习单片机的时候,是比较有必要选择一款适合的成品单片机开发板的,毕竟通过自己搭建所有电路的难度比较大的。下面我们来简单介绍下成品单片机电路图识别与选购的相关知识。

成品开发板我们可以很容易的可以买到。通常都有配套的学习资料,尤其是配套可以直接下载到板子中使用的程序示例,能大大提高我们的学习效率。

1、电路图的识别

一般成品开发板都有电路图,初学者在看电路图的时候可能会有不少疑惑。下面是某开发板的部分电路图。


我们可以看到,为了画的简洁好懂,单片机开发板电路图常常会画成图中这样,分成一个个的模块,而不是全部画在一张图中。图中根据功能进行划分每个模块,并且大部分的模块都会有VCC和GND标号。

在任何一个电路图中,所有相同的标号(例如GND)在实际电路中是连接在一起的。我们可以看到单片机最小系统中的18、19号管脚没有接晶振,但是标注了X1、X2;而在单片机晶振模块中,也有标号X1、X2,意思是他们在实际电路中连接在一起。

2、电源相关知识

GND原意为接地,表示的含义是电压0V参考点。通常我们把大地的电压视为0V,在一些电路中,GND也确实和大地直接连在一起,例如一些家用电器的外壳。但是在我们的单片机电路中,实际上没有必要将其直接接地,但是还是把它的标号写为GND。

学过中学物理就应该知道,电压是一个相对的概念,如果我们把1.5V电池的正极当做0V电压,那么它的负极电压就是-1.5V。这里的GND就是0V电压点,其他点的电压都是相对于这个0V来说的。图中单片机的VCC管脚接到了VCC标号上,在这个图中,VCC就是5V电压,通常电路图中会有说明。如果我们用5V电源给电路供电,就可以把电源负极接到GND,正极接在VCC上。

一个电路中并不一定只有一种电压,有的电路中不同的器件分别需要多种电压,单片机类电路中最常见的是5V和3.3V。例如下图,GND仍然为0V,而 VCC标号表示5V电压,VDD表示的是3.3V电压。5V电压通过AMS1117稳压芯片转换出了3.3V电压(这是比较常用的一种稳压芯片,这类知识需要长期积累,不了解的可以去网上搜索,对于芯片,可以找芯片手册看)。多种电压常用芯片进行转换,这样整个电路就只需要提供一个电源。也有的情况下,不同的电路部分则会使用独立的供电系统(例如继电器电路就可以用低电压控制高电压,而控制端和被控制端电路完全隔离)。


3、一些器件符号

电路图中,除了大家所了解的电阻、电容、电感、二极管三极管等器件,以及前面说的VCC、GND符号和各种标号外,还有一些特别的器件。例如图中的J2、 J3这种方块状的东西,其实就是普通的插接件,比如前面说的排针排座之类,因为不是什么标准化的器件,所以通常电路符号画起来也比较随意。

还有像PCF8591这种符号,其实和前面的51一样,是集成电路,一般电路图中会标注芯片型号,然后用数字标注管脚序号。


4、芯片手册

看开发板电路图时,我们就发现上面有很多集成电路芯片。集成电路前面也提到了很多次。前文我就说到AMS1117是一种常用的稳压芯片,但是怎么知道这种芯片的使用方法呢?

最准确有效的做法就是查看芯片厂商给出的官方资料,相当于说明书,对于芯片来说就是芯片手册。会获取和查看芯片手册是电子制作的基本技能之一,我们应该学会如何利用官方资料学习。所有的芯片官方都会给出对应的DataSheet(数据手册,芯片手册),有些还会有ApplicationNote(应用笔记)。

由于很多芯片都是国外生产的,又考虑到通用性,原版手册往往是英文的。有些大公司也会推出一些中文资料,但还是以英文为主。

对于一些常见的芯片,我们很容易找到别人翻译好的中文手册,以及各种介绍资料,一般这些资料最初也是别人根据官方芯片手册进行尝试总结出来的。而对于一些不常见的芯片;或者要研究一些比较深入的东西;或是用一些最新的芯片,这时就只有官方资料可以用了。

官方资料一般排版规范,经过了很多次的核对修正,还会及时的勘误,比如TI公司的ErrataSheet会专门指出官方各种手册资料中的纰漏和错误(不过国内的一些公司做的并不好)。官方资料不仅容易找到,质量高,也最权威准确。而非官方的资料可能是各种不同水平的人编写的,很多排版不当,质量参差不齐,有的还有错误。

不要惧怕英文。在技术性的手册中,除了一些专有名词外,都会避免使用复杂的句式、语法,和难以理解的词汇。看不懂的专有名词,我们完全可以通过查词典来克服。久而久之,就会习惯,英文水平长进了,也不再惧怕英文了。这里引用一位同学的话:“大公司的官方文档写的相当好,通俗易懂,而中文翻译水平层次不一,必要的术语也不知道什么意思。而且中文翻译的文档制作的真心太差。我想你们也不甘心学十年英语就为了一个六级吧?”

总体来说,过分依赖中文资料很难学好一些东西。当然对于初学者,没必要要求太苛刻。对于初学时的常用芯片,中文资料也是很全的。上网搜索“AMS1117 pdf”“AMS1117 芯片手册”或“AMS1117 datasheet”就能很快找到AMS1117的芯片手册。我们也可以在一些专门的芯片手册网站查找,还可以在官方网站查找。

5、开发板的选择

学习单片机怎样的开发板最合适呢?我们不需要选那些很贵很全的开发板,但是也不能购买那种最简单的最小系统板。最好是购买那些有常用模块的开发板,例如液晶屏、矩阵键盘、AD/DA、数码管、蜂鸣器等。另外开发板的资料一定要全,尤其是应该有配套的程序代码,资料是学习单片机所必要的。如果以后你去买一些电子器件,除了那些简单的元件和常用的网上很容易找到资料的器件,你也应该找卖家索要配套的资料方便学习,卖家应该给你提供配套资料。

有的人可能会觉得开发板太贵,实际上,如果你肯好好学习,学到了知识,为自己投资这些钱是很划算的一件事。

来源:电子发烧友

围观 58

页面

订阅 RSS - 单片机