单片机

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

这篇文章我不是想说编程的规范性的东西,如果你想让自己的程序文件最起码直观的看起来美观、可读性强,推荐找华为的“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,大大地提高了电源的供电能力。

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

围观 65

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

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


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

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


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

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

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


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

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

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

来源:网络

围观 92

从单片机上知道,在上电的那一刻,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也罢,存在的存储器金字塔都是一致的,速度的因素,成本的限制导致了一级级更快的存储器的更快速度与更高的成本。应该说,对于它们的理解,就是存储器金字塔的理解。

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

围观 142

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

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

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

简述常用单片机之间的通信方式

1. 采用硬件UART进行异步串行通信。这是一种占用口线少,有效、可靠的通信方式;但遗憾的是许多小型单片机没有硬件UART,有些也只有1个UART,如果系统还要与上位机通信的话,硬件资源是不够的。这种方法一般用于单片机有硬件UART且不需与外界进行串行通信或采用双UART单片机的场合。

2. 采用片内SPI接口或I2C总线模块串行通信形式。SPI/I2C接口具有硬件简单、软件编程容易等特点,但目前大多数单片机不具备硬件SPI/I2C模块。

3. 利用软件模拟SPI/I2C模式通信,这种方式很难模拟从机模式,通信双方对每一位要做出响应,通信速率与软件资源的开销会形成一个很大的矛盾,处理不好会导致系统整体性能急剧下降。这种方法只能用于通信量极少的场合。

4. 口对口并行通信,利用单片机的口线直接相连,加上1~2条握手信号线。这种方式的特点是通信速度快,1次可以传输4位或8位,甚至更多,但需要占用大量的口线,而且数据传递是准同步的。在一个单片机向另一个单片机传送1个字节以后,必须等到另一个单片机的接收响应信号后才能传送下一个数据。一般用于一些硬件口线比较富裕的场合。

5. 利用双口RAM作为缓冲器通信。这种方式的最大特点就是通信速度快,两边都可以直接用读写存储器的指令直接操作;但这种方式需要大量的口线,而且双口RAM的价格很高,一般只用于一些对速度有特殊要求的场合。

从上面几种方案来看,各种方法对硬件都有很大的要求与限制,特别是难以在功能简单的单片机上实现,因此寻求一种简单、有效的,能在各种单片机之间通信的方法具有重要的意义。③、④方案中,双方单片机要传递的每一位或每一个字节做出响应,通信数据量较大时会耗费大量的软件资源,这在一些实时性要求高的地方是不允许的。

针对这一问题,假设在单片机之间增加1个数据缓冲器,大批数据先写入缓冲区,然后再让对方去取,各个单片机对数据缓冲器都是主控模式,这样必然会大大提高通信效率。谈到数据缓冲,我们马上会想到并行RAM,但是并行RAM需要占用大量的口线(数据线+地址线+读写线+片选线+握手线),一般在16条以上。这是一个让人望而生畏的数字,而且会大大增加PCB面积并给布线带来一定的困难,极少有人采用这种方式。串行接口的RAM在市场上很少见,不但难以买到而且价格很高。移位寄存器也可以做数据缓冲器,但目前容量最大的也只128位,因为是“先进先出”结构,所以不管传递数据多少,接收方必须移完整个寄存器,灵活性差而且大容量的移位寄存器也是少见难买的。一种被称为“铁电存储器”芯片的出现,给我们带来了解决方法。

利用铁电存储器作为数据缓冲器的通信方式

铁电存储器是美国Ramtran公司推出的一种非易失性存储器件,简称FRAM。与普通EEPROM、Flash-ROM相比,它具有不需写入时间、读写次数无限,没有分布结构可以连续写放的优点,因此具有RAM与EEPROM的双得特性,而且价格相对较低。

现在大多数的单片机系统配备串行EEPROM(如24CXX、93CXX等)用来存储参数。如果用1片FRAM代替原有EEPROM,使它既能存储参数,又能作串行数据通信的缓冲器。2个(或多个)单片机与1片FRAM接成多主-从的I2C总线方式,增加几条握手线,即可得到简单高效的通信硬件电路。在软件方面,只要解决好I2C多主-从的控制冲突与通信协议问题,即可实现简单、高效、可靠的通信了。

实例(双单片机结构,多功能低功耗系统)

(1)硬件

W78LE52与EMC78P458组成一个电池供电、可远程通信的工业流量计。78P458采用32.768kHz晶振,工作电流低,不间断工作,实时采集传感器的脉冲及温度、压力等一些模拟量;W78LE52采11.0592MHz晶振,由于它的工作电流较大,采用间断工作,负责流量的非线性校正、参数输入、液晶显示、与上位机通信等功能,它的UART用于远程通信。2个单片机共用1片I2C接口的FRAM(FM24CL16)组成二主一从的I2C总线控制方式,W78LE52的P3.5、P3.2分别与78P458的P51、P50连接作握手信号线A与B。我们把握手线A(简称A线)定义为总线控制、指示线,主要用于获取总线控制权与判别总线是否“忙”;握手线B(简称B线)定义为通知线,主要用于通知对方取走数据。

(2)I2C总线仲裁

由于我们采用的是二主一从的I2C总线方式,因此防止2个主机同时去操作从机(防冲突)是一个非常重要的问题。带有硬件I2C模块的器件一般是这样的,器件内部有1个总线仲裁器与总线超时定时器:当总线超时定时器超时后指示总线空闲,这时单片机可以发出获取总线命令,总线仲裁器通过一系列操作后确认获取总线成功或失败;超时定时器清零,以后的每一个SCL状态变化对总线所有主机的超时定时器进行清零,以防止它溢出,指示总线正处于“忙”状态,直到一个主机对总线控制结束不再产生SCL脉冲;超时定时器溢出,总线重新回到“空闲”状态。但是目前大多数单片机没有配备硬件I2C模块,而且当2个主机的工作频率相差较大时,超时定时器定时值只能设为较大的值,这样也会影响总线的使用效率。

下面介绍一种用软件模拟I2C总线仲裁的方式(I2C读写操作程序的软件模拟十分多见,这里不再多述):用1条握手线A,当A线高电平时,指示总线空闲;当其中一个主机要获取总线控制权时,先查询总线是否空闲,“忙”则退出,空闲则向A线发送一个测试序列(如:1000101011001011),在每次发送位“1”后读取的A线状态。如果读取状态为“0”,马上退出,说明有其它器件已经抢先获取总线;如果一个序列读取的A线状态都正确,则说明已成功获得总线控制权,这时要拉低A线以指示总线“忙”,直到读写高A线,使总线回到“空闲”状态。不同的主机采用不同的测试序列,或产生随机测试序列,测试序列长度可以选得长一些,这样可以增加仲裁的可靠性。

(3)通信协议

一个可靠通信体系,除了好的硬件电路外,通信协议也至关重要。在单片机系统RAM资源与执行速度都非常有限的情况下,一个简捷有效的协议是非常重要的。下面具体介绍一种比较适用于单片机通信的协议,数据以包的形式传送。数据包结构:

①包头——指示数据包的开始,有利于包完整性检测,有时可省略;

②地址——数据包要传送的目标地址,若只有双机通信或硬件区分地址可以省略;

③包长度——指示整个数据包的长度;

④命令——指示本数据包的作用;

⑤参数——需要传送的数据与参数;

⑥校验——验证数据包的正确性,可以是和校验、异或校验、CRC校验等或者是它们的组合;

⑦包尾——指示数据包的结尾,有利于包完整性检测,有时可省略。

(4)通信流程

首先,要在FRAM里划分好各个区域,各个单片机的参数区、数据接收区等。然后,单片机可以向另一个单片机发送数据包,发送完毕之后通过向握手线B发送1个脉冲通知对方取走数据;接收方读取数据并进行处理后,向FRAM内发送方的数据接收区写入回传数据或通信失败标志,再向握手线B发送1个脉冲回应发送方。

如果需要单片机2发送的话,只需交换一下操作过程即可。

总结

通过实践可知,以上方法是可行的。与其它方法相比具有发下优点:

①简单。占用单片机口线少(SCL、SDA、握手线A、握手线B)。

②通用。软件模拟I2C主机方式,可以在任何种类的单片机之间通信。

③高效。由于采用数据缓冲,可以在不同时钟频率、不同速度的单片机之间通信;读写数据时,可以I2C总线的最高速度进行,可以实现1次传送大量数据;在一个单片机向FRAM传送数据时,另一个单片机无须一一作出响应或等待,可以进行其它程序操作,提高软件工作效率。

④灵活。通信硬件接口对于各个单片机是对等的,通过软件配置,每个单片机既可以根据需要主动发送通信,也可以只响应其它单片机的呼叫。

⑤容易扩展。通过增加地址识别线,修改通信协议,即可做到多机通信。

以下是需要注意的地方:

①为了提高通信效率,握手线B最好使用中断端口,负脉冲宽度一定要满足速度较低单片机中断信号要求。如果没有中断的话应增加1条口线,用改变端口状态的方法通知对方,等待对方查询,而不是负脉冲。

②向对方发送负脉冲时,应屏蔽自己的中断。

③由于参数与通信缓冲区同时设在同一片FRAM内,要避免对参数部分的误操作。一个较好的解决办法是把参数存放在地址的后半部分(A2=1),在进行通信操作时,把FRAM的WP引脚拉高(地址在后半部分的单元写保护),这样可以有效地防止测验时对参数区误操作。

④由于I2C总线在一个时间段内只有1个主机和1个从机,所以当1个单片机正在写通信数据时,另一个单片机是不能对FRAM进行操作的。如果需要实时、频繁地读取FRAM中参数的话,请预先将参数读入RAM单元使用或另外增加专门存放参数的芯片。

免责声明:本文转自网络,版权归原作者所有,如涉及作品版权问题,请及时与我们联系,谢谢!

围观 104

首先来说,220V交流电的负载是多大,是感性负载负载还是阻性负载,正常输出功率是多大等这些都要考虑进去。

1、对于阻性负载

比如普通的灯泡,一般是30到40W左右,如果用220V交流电来控制通断,简单点的就用一个双向可控硅直接控制,BT137电流达到7A,耐压值600V,驱动灯泡足够了


也可以加一个光耦


2、对于感性负载

比如电动机,因为它的内部有线圈,100W的电动机在启动的时候可能达到1000W,因此这类电器电路就要加多一个阻容吸收电路,必要时候同时加一个压敏电阻,可以使10471,根据实际间距选择合适的压敏电阻,因为瞬导通时候电压很高,这样就有起到过压保护,以防一通电或者关断时候产生感应电动势产生的电压把可控硅击穿,有时候还会串联一个电感。


使用可控硅三极管MOS管的单片机控制220V交流电通断电路图解

使用单片机控制220V交流电的通断,方法非常多。使用继电器是最方便的,但是继电器通断会有声音,很不好,而且继电器有次数限制,容易坏。题主也说明不用继电器,下面提供几种方法吧,供大家参考。

(1)使用双向可控硅,注意是交流电,使用双向可控硅而不是单向可控硅。


这种情况比较简单,但是电路可靠性不高,220V和单片机电源必须共地,电路故障很容易高压烧毁低压端的单片机。


低压控制高压,最好做隔离,上图为使用光耦隔离的控制方式,也可以使用其它物理隔离芯片。

(2)使用三极管、MOS管的控制方式


上图是使用MOS管作开关的电路原理图,因为是交流电,使用两个N沟道的MOS管背靠背连接,该图只是一部分示意图,真正的电路还有很多关键技术,比如采样交流电的极性、判断零点,实现过零开通、断开,以减少对设备的损耗。以及过流、短路保护,区分容性负载上电瞬间的波形与过流、短路波形的区别,防止误保护。使用三极管的原理也是类似的,由于篇幅的原因,就不为大家详细说明了,真正要详细分析几千字估计都不够。

来源:畅学单片机

围观 362

单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令

取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。

分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。

计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。

一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条取出执行。但单片机中的程序一般事先我们都已通过写入器固化在片内或片外程序存储器中。因而一开机即可执行指令。

下面我们将举个实例来说明指令的执行过程:

开机时,程序计算器PC变为0000H。然后单片机在时序电路作用下自动进入执行程序过程。执行过程实际上就是取出指令(取出存储器中事先存放的指令阶段)和执行指令(分析和执行指令)的循环过程。

例如执行指令:MOV A,#0E0H,其机器码为“74H E0H”,该指令的功能是把操作数E0H送入累加器,0000H单元中已存放74H,0001H单元中已存放E0H。当单片机开始运行时,首先是进入取指阶段,其次序是:

① 程序计数器的内容(这时是0000H)送到地址寄存器;

② 程序计数器的内容自动加1(变为0001H);

③ 地址寄存器的内容(0000H)通过内部地址总线送到存储器,以存储器中地址译码电跟,使地址为0000H的单元被选中;

④ CPU使读控制线有效;

⑤ 在读命令控制下被选中存储器单元的内容(此时应为74H)送到内部数据总线上,因为是取指阶段,所以该内容通过数据总线被送到指令寄存器。

至此,取指阶段完成,进入译码分析和执行指令阶段。

由于本次进入指令寄存器中的内容是74H(操作码),以译码器译码后单片机就会知道该指令是要将一个数送到A累加器,而该数是在这个代码的下一个存储单元。所以,执行该指令还必须把数据(E0H)从存储器中取出送到CPU,即还要在存储器中取第二个字节。其过程与取指阶段很相似,只是此时PC已为0001H。指令译码器结合时序部件,产生74H操作码的微操作系列,使数字E0H从0001H单元取出。因为指令是要求把取得的数送到A累加器,所以取出的数字经内部数据总线进入A累加器,而不是进入指令寄存器。至此,一条指令的执行完毕。单片机中PC=0002H,PC在CPU每次向存储器取指或取数时自动加1,单片机又进入下一取指阶段。这一过程一直重复下去,直至收到暂停指令或循环等待指令暂停。CPU就是这样一条一条地执行指令,完成所有规定的功能。

来源:网络转载

围观 77

页面

订阅 RSS - 单片机