单片机

单片机(Microcontroller, MCU)是一种集成了计算机功能的微型计算机,通常由一个微处理器(CPU)、存储器(ROM、RAM)、输入/输出接口、定时器/计数器等功能模块集成在同一芯片上。单片机是一种常用于嵌入式系统中的控制器,它被广泛应用于家电、汽车、工业自动化、医疗设备、消费电子、物联网(IoT)设备等多个领域。

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

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

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电缆。

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

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

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

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

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

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

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

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

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

围观 336

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

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

(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。

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

围观 501

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

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

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

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


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


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


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

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

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

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

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

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

第六、编写程序;

来源:玩转单片机

围观 375

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

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可以忽略本条。

转自:畅学单片机

围观 374

为什么单片机需要时钟系统,时钟信号在单片机中扮演怎样的角色?

demi的头像

1. 单片机内部需要储存器、累加器,这些都需要逻辑门电路。比如锁存器就是一个D触发器,而触发器的置1、清0、置数的功能都需要跳变沿。D触发器就是上升沿后存入数据,而这个上升沿就得外部提供脉冲,这就是脉冲信号 ,而这个脉冲信号就是我们稳定的时钟信号。

2. 单片机运行需要时钟支持—–就像计算机的CPU一样,如果没有时钟电路来产生时钟驱动单片机,那单片机就不能执行程序。单片机可以看成是在时钟驱动下的时序逻辑电路。

以MCS–51单片机为例:MCS–51单片机为12个机器周期执行一条指令,也就是说单片机运行一条指令必须要用12个时钟周期。没有这个时钟,单片机就跑不起来,也就没办法定时和进行和时间有关的操作。

时钟电路是微型计算机的心脏。CPU就是通过复杂的时序电路完成不同的指令功能的。MCS—51的时钟信号可以由两种信号产生:一种是内部方式,利用芯片内部的振荡电路,产生时钟信号;另一种为外部方式,时钟信号由外部引入。

3. 电路中的晶振即石英晶体震荡器。由于晶振具有非常好的频率稳定性和抗外界干扰的能力,所以,晶振是用来产生时钟信号的,通过时钟信号来控制电路工作。

我们学习单片机的目的就是为了进行嵌入式系统的开发,学好单片机首先要有一个整体认识,下面将简要介绍一下单片机应用系统的开发流程,如图1所示。


(1)明确任务

分析和了解项目的总体要求,并综合考虑系统使用环境、可靠性要求、可维护性及产品的成本等因素,制定出可行的性能指标。

(2)划分软、硬件功能

单片机系统由软件和硬件两部分组成。在应用系统中,有些功能既可由硬件来实现,也可以用软件来完成。硬件的使用可以提高系统的实时性和可靠性;使用软件实现,可以降低系统成本,简化硬件结构。因此在总体考虑时,必须综合分析以上因素,合理地制定硬件和软件任务的比例。

(3)确定希望使用的单片机及其他关键部件

根据硬件设计任务,选择能够满足系统需求并且性价比高的单片机及其他关键器件,如A/D、D/A转换器、传感器、放大器等,这些器件需要满足系统精度、速度以及可靠性等方面的要求。

(4)硬件设计

根据总体设计要求,以及选定的单片机及关键器件,利用Protel等软件设计出应用系统的电路原理图。

(5)软件设计

在系统整体设计和硬件设计的基础上,确定软件系统的程序结构并划分功能模块,然后进行各模块程序设计。

单片机程序设计语言可分为三类:

➢ 机器语言 :又称为二进制目标代码,是CPU硬件唯一能够直接识别的语言(在设计CPU时就已经确定其代码的含义)。人们要计算机所执行的所有操作,最终都必须转换成为相应的机器语言由CPU识别、控制执行。CPU系列不同,其机器语言代码的含义也不尽相同。

➢ 汇编语言 :由于机器语言必须转换为二进制代码描述,不便于记忆、使用和直接编写程序,为此产生了与机器语言相对应的汇编语言。用汇编语言编写的程序执行速度快,占用存储单元少,效率高。

➢ 高级语言 :高级语言具有很好的可读性,使程序的编写和操作都十分方便,目前广泛使用的高级语言是C51。

汇编语言和高级语言都必须被翻译成机器语言之后才能被CPU识别。

(6)仿真调试

软件和硬件设计结束后,需要进行进行进入两者的整合调试阶段。为避免浪费资源,在生成实际电路板之前,可以利用Keil C51和Proteus软件进行系统仿真,出现问题可以及时修改。

(7)系统调试

完成系统仿真后,利用Protel等绘图软件,根据电路原理图绘制PCB(Printed Circuit Board)印刷电路板图,然后将PCB图交给相关厂商生产电路板。拿到电路板后,为便于更换器件和修改电路,可首先在电路板上焊接所需芯片插座,并利用编程器将程序写入单片机。

接下来将单片机及其他芯片插到相应的芯片插座中,接通电源及其他输入、输出设备,进行系统联调,直至调试成功。

(8)测试修改、用户试用

经测试检验符合要求后,将系统交给用户试用,对于出现的实际问题进行修改完善,系统开发完成。

单片机学习方法探讨

单片机学习的过程应该是一个循序渐进、不断学习、不断积累的过程,大致分为三个阶段。

第一阶段:掌握开发单片机的必备基础知识。

首先是熟练掌握单片机的基本原理,虽然现在单片机厂商众多,但各家单片机的基本结构和原理都比较相近,例如内核结构、内存分配、中断处理、定时计数、串行通信、端口复用等一些最基本的概念和原理。除此之外,我们还需要学习模拟电子、数字电子、C语言程序开发以及原理图和PCB(Printed Circuit Board,印刷电路板)设计等知识。只有扎实的掌握了这些知识,在进行系统开发的时候,才能顺利地进行原理设计、PCB布板、程序编写、系统联调等工作。

第二阶段:在掌握好一款单片机原理和应用的基础上,开始学习其他各家单片机,了解其独有的功能和特点。

例如实际工作中若客户要求低成本,那我们可以选用和泰、义隆、华邦等这类台湾芯片;如果客户要求工业级的性能,那么最好从PIC、NEC、飞思卡尔、NXP等这些欧美和日式单片机中选择;若要进行功耗的开发,选用MSP430系列应该有一定优势;在进行测量仪器设计的时候,C8051和AduC842这类数模混合芯片又显得比较实用。

另外,平时要注意技术积累。在项目开发过程中将一些常用的接口程序和控制算法整理成模块或者函数,日后若在其他的项目开发中有同样或者接近的需求时,原程序可以直接或者进行少量改动后使用,这样一来会节约大量开发成本。

第三阶段:在实际的项目开发过程中,不断深入研究单片机应用技术,不断积累应用行业的专业知识。

有了扎实的单片机应用相关的基础知识,并且熟悉掌握了几款不同类型单片机的开发方法后,对于各种实际的应用项目,往往还需要理解和掌握外围电路相关的原理和分析方法,并结合实际的应用背景,综合考虑各种因素,才能设计出性能最优、结构最合理的单片机应用系统。

来源:玩转单片机

围观 554

倒立摆作为一种典型的控制系统实验装置,具有非线性、自然不稳定等特性,常用来作为检验某种控制理论或方法是否合理的典型方案。一阶倒立摆系统能用多种理论和方法来实现其稳定控制,如PID、自适应、状态反馈、模糊控制及人工神经元网络等多种理论和方法都能在倒立摆系统控制上得到实现。

1、系统构成及工作原理

图1为一阶旋转倒立摆结构示意图。直流电机作为唯一的动力装置,与旋臂保持刚性连接,带动旋臂在水平面内旋转,旋臂的一端通过转轴(本系统选用电位器角度传感器)与摆杆连接,摆杆可做垂直于旋臂的圆周运动。在自然状态下,摆杆为竖直下垂状态。倒立摆控制的目的是通过控制直流电动机的运动状态,使摆杆保持倒立状态。


图1倒立摆结构示意图

系统工作原理如下:摆杆摆动时,角度传感器检测摆杆的角度,根据角度传感器的输出特性,其输出电压经A/D转换器转换成电压数字量,该数字量与期望的值进行比较产生偏差,通过单片机对该偏差进行处理,即PID控制运算,根据运算结果产生控制信号控制电机和旋臂的转动,使摆杆的角度与期望的角度更接近。

倒立摆控制系统结构框图如图2所示,单片机(51单片机)为控制器,直流电机为执行器,倒立摆为被控对象,倒立摆角度为被控量,角度传感器和模数转换器构成反馈回路。


图2倒立摆控制系统结构框图

2 倒立摆控制系统的硬件设计

2.1单片机最小系统

该系统中选用了STC90C51单片机,该型单片机

具有以下特点:①八位MCU核,与传统8051兼容;②大容量存储空间,包括64kB程序空间,1280B

SRAM等;③具有4个八位并行I/O口,3个定时/计数器,2个外部中断源和1个全双工UART传输口;④5V供电时,最高支持80MHz振荡频率,具备高速浮点运算能力,适合倒立摆系统等较为复杂的控制系统使用。51单片机最小系统如图3所示。


图3 51单片机最小系统

2.2摆杆角度检测

检测摆杆角度所用到的角度传感器种类非常多,常用的有电位器式角度传感器、光电编码器、陀螺仪模块等。由于电位器式角度传感器原理简单,检测精度取决于所用A/D转换器的精度,成本相对较低,因此,综合多方面要求,本系统选用电位器式角度传感器。

传感器返回的电压信号无法被单片机直接识别,所以需要通过A/D转换,将模拟电压信号转换为二进制数的形式,然后单片机才能计算出偏差,进而产生相应的输出。A/D转换器常用的有8位和12位输出,在本系统中选用8位A/D转换器即可满足控制要求,其型号选用ADC0809,相应电路原理图见图4。


图4 A/D转换电路

A/D转换器的时钟脉冲为单片机ALE引脚输出的脉冲经74LS74芯片分频之后得到,A/D转换器的8位数字信号通过单片机的P0口进行采集与处理。

2.3驱动电路

本系统选用的直流电机额定电压为24V,额定功率为30W,单片机的I/O口不足以提供如此大的驱动能力,故需采用驱动电路。常用的直流电机驱动芯片为L298N,可驱动两路直流电机,最大驱动电压为46V,最大电流2A~3A,满足设计要求。直流电机驱动电路如图5所示。


图5 直流电机驱动电路

图5中,L298N的ENA为使能端,可作为单片机PWM(脉宽调制)控制端,控制直流电机转速;IN1和IN2为信号输入端,OUT1和OUT2为输出端,输出

状态与输入状态对应,控制直流电机转向。输出端的二极管为续流二极管,起保护电动机线圈的作用。

3倒立摆控制系统的软件设计

3.1控制算法

本系统采用PID控制算法,PID算法适用于负荷变化大、容量滞后较大、控制品质要求高的控制系统。PID算法有3个可设定参数,即比例放大系数KP、积分时间常数TI、微分时间常数TD。比例调节的作用是使调节过程趋于稳定,但会产生稳态误差;积分作用可消除被调量的稳态误差,但由于积分饱和等原因可能会使系统振荡甚至使系统不稳定;微分作用能有效地减小动态偏差[4]。其传递函数为:

其中:u(k)为第k个采样时刻的输出;e(k)为第k个采样时刻的偏差值;T为采样周期;KP为比例放大系数;TI为积分时间常数;TD为微分时间常数。

在实时性要求较高的倒立摆系统中,积分作用常常使系统对偏差的调节变慢,使动态相应变慢。因此要尽量弱化或者消除积分作用,使用PD调节规律即可。在该系统中,输入变量为给定值与实际检测到角度的差值,输出变量控制所产生的PWM波形的占空比。由于旋臂、摆杆以及电动机的各项参数很难准确把握,且干扰较多,难以建立精确的数学模型,因此采用试验法整定参数的数值,即根据系统表现出的状态,调节各参数的数值,直至系统达到稳定。

3.2程序流程图

倒立摆系统主程序流程图见图6。其中,U为PID运算的输出值,为输出PWM波形的占空比,由于所选单片机不具备专用PWM输出引脚,需要利用定时器T0模拟其波形输出,定时器T0中断子程序流程图见图7。在本系统中,采样周期选择为10ms,由定时器T1控制,定时器T1中断子程序流程图见图8。



4系统测试

本系统测试所用到的倒立摆模型为自制简易模型,测试过程如下:外力将摆杆拉起至接近倒立状态(与倒立状态相差20°左右);给系统上电,同时撤去外力,观察到摆杆迅速呈倒立状态,经过几次调整,即可长时间保持倒立状态。系统达到稳定状态的效果如图在摆杆保持倒立状态时,施加一扰动,即轻碰摆杆或旋臂,系统经过短时间的调整之后,仍可以自动调节至稳定状态,说明该系统具备较强的鲁棒性。

5结论

本系统采用单片机作为一阶旋转倒立摆系统的控制器,执行了数据采集、数据处理(PID运算)、控制直流电机运行状态等操作,成功使该系统稳定,其经济性和实用性得到了很好的展现。同时也体现了经典PID控制理论在一阶倒立摆系统中使用时良好的控制效果。

出处:21ic

围观 486

单片机内存的合理使用对于一名嵌入式软件工程师来说是至关重要的,这深深关系到项目代码的稳定性。对于c语言程序的bug,最为致命、最难发觉的也是内存的使用不当造成的,这种奇葩现象。之前对这一块有过了解,可惜没有真正的领会其中的要害和内涵。大抵是平时写写代码玩的时候单片机资源足够多,也从来不会去理会内存够不够的问题。最近受领导一番话点醒了我,也逐渐明白了它的重要性。

背景大概是这样的:某个项目写到一个数据处理函数,这里需要进行大量数据处理和拼接长字符串,需要大量的中间变量作为转存(超过1k长度的大数组),我左思右想到底是用全局变量?还是局部变量?抑或是利用malloc申请一段内存来使用,年少无知的我想来想去果断使用了定义在函数内的局部变量,理由是局部变量所占用的内存在该函数运行完之后即会自动释放,这样只会在短时间内占用cpu的ram,至于不使用malloc的理由是怕堆生长太大覆盖了栈区的内存。然而....领导看了这段代码惊呼卧槽,他告诉我如果在函数内使用大数组的局部变量有可能会造成全局变量区的内存被这货覆盖,我接着问难不成我使用全局?这样不会占用太多的RAM嘛?他说宁可牺牲掉RAM的部分资源作为固定的内存,也不要这种随时可能爆炸的定时炸弹(大数组局部变量),因为它可能在某个时间节点内突然申请一块巨大的内存,到时候内存覆盖刷掉了全局变量的地址就真的GG了。我仔细一想局部变量大数组还真的是一枚定时炸弹,心里默默地记下他的一番话,开始重新去审视和理解关于单片机内存相关的知识。

说了一大段废话....

以下是我对该内容的一个整理:


单片机内存被分为flash和sram(ram),在查看任何一款单片机的时候都会有它们的介绍,可以看看最近使用的合泰单片机HT32F2253的介绍

我们看到它的flash是128KB、SRAM是16KB。(其实它的内存还算挺大的........)

以下是我按照自己的理解画的的一个内存结构图:

初始化前:


初始化后:


嗯...可以看到,初始化时RW-data从flash拷贝到RAM,所以在程序跑起来了Rw-data是在RAM里面的。

其中:Code为程序代码部分
RO-data 表示 程序定义的常量const temp;
RW-data 表示 已初始化的全局变量
ZI-data 表示 未初始化的全局变量

(以上这一段是copy的,原地址在:http://anlx27.iteye.com/blog/1575848

而栈区(stack)、堆区(heap)、全局区(静态区)(static)、文字常量区和程序代码区和上面所介绍的code、RO-data等的关系。

1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 这些值是可读写的,那么stack应该被包含在RW-data(读写数据存储区),也就是单片机的sram中。

2、堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。可以理解,这些也是被包含在单片机的sram中的。

3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。这些数据也是可读可写的,和stack、heap一样,被包含在sram中。

4、文字常量区:常量字符串就是放在这里的。这些数据是只读的,分配在RO-data(只读数据存储区),则被包含在flash中。

5、程序代码区:存放函数体的二进制代码,可以想象也是被包含在flash,因为对于MCU来说,当其重新上电,代码还会继续运行,并不会消失,所以存储在flash中。

(然而上这一段还是copy的,原地址在:http://www.51hei.com/mcu/4293.html

下面是网上找的例子:

int a = 0; // RW-data 全局初始化区
char *p1; // ZI-data 全局未初始化区
const int b = 0; // RO-data 只读变量区
main(void)
{
int b; // RW-data 栈区
char s[] = "abc"; // RW-data 栈区
char *p2; // RW-data 栈区
char *p3 = "123456"; // "123456/0" 在Ro-data 常量区,p3在RW-data 栈区
static int c =0; // 全局(静态)初始化区 rw-data -> static区

p1 = (char *)malloc(10);
p2 = (char *)malloc(20); // 分配得来的10和20字节的区域就在Rw-data 堆区

strcpy(p1, "123456"); // "123456/0" 放在常量区,编译器可能会将它
// 与p3所指向的"123456"优化成一个地方
}
所以,重点来了,在实际编程中,应当实时关注.map的内容来判断单片机内存的使用情况。

在keil中,右击工程就会出现opne map flie的选项,打开它,浏览到最后一段


可以看到该工程占用单片机ram12.43kb,flash13.91kb。

来源:CSDN ,作者:sinat_dtj
原文:https://blog.csdn.net/sinat_30146065/article/details/82221179
版权声明:本文为博主原创文章,转载请附上博文链接!

围观 427

页面

订阅 RSS - 单片机