单片机

倒立摆作为一种典型的控制系统实验装置,具有非线性、自然不稳定等特性,常用来作为检验某种控制理论或方法是否合理的典型方案。一阶倒立摆系统能用多种理论和方法来实现其稳定控制,如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

围观 470

单片机内存的合理使用对于一名嵌入式软件工程师来说是至关重要的,这深深关系到项目代码的稳定性。对于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
版权声明:本文为博主原创文章,转载请附上博文链接!

围观 416

本文将分析比较几种单片机之间的方式、难点,并提出一种解决方案。

1、几种常用单片机之间的通信方式

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

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

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

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

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

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

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

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

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

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

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

(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发送的话,只需交换一下操作过程即可。

4、总结

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

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

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

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

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

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

以下是需要注意的地方:

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

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

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

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

来源:网络、玩转单片机

围观 353

今天,首先学习单片机的基本构成和工作原理,以及外围功能电路,然后,挑战一个实际单片机的运行。

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

现如今,我们生活中的许多电器都使用了单片机。例如:手机、电视机、冰箱、洗衣机、以及按下开关,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构成逻辑电路,才能实现这个功能。

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

来源:网络

围观 347

在我们刚一开始接触到51单片机的时候对P0口必须加上上拉电阻,否则P0就是高阻态。

对这个问题可能感到疑惑,为什么是高阻态?加上拉电阻?今天针对这一概念进行简单讲解。

高阻态

高阻态这是一个数字电路里常见的术语,指的是电路的一种输出状态,既不是高电平也不是低电平。

如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样,如果用万用表测的话有可能是高电平也有可能是低电平,随它后面接的东西定。

高阻态的实质

电路分析时高阻态可做开路理解,你可以把它看作输出(输入)电阻非常大。

它的极限可以认为悬空,也就是说理论上高阻态不是悬空,它是对地或对电源电阻极大的状态。而实际应用上与引脚的悬空几乎是一样的。

高阻态的意义

当门电路的输出上拉管导通而下拉管截止时,输出为高电平,反之就是低电平。

如果当上拉管和下拉管都截止时,输出端就相当于浮空(没有电流流动),其电平随外部电平高低而定,即该门电路放弃对输出端电路的控制 。

典型应用

在总线连接的结构上。总线上挂有多个设备,设备于总线以高阻的形式连接。这样在设备不占用总线时自动释放总线,以方便其他设备获得总线的使用权。 

大部分单片机I/O使用时都可以设置为高阻输入。高阻输入可以认为输入电阻是无穷大的,认为I/O对前级影响极小,而且不产生电流(不衰减),而且在一定程度上也增加了芯片的抗电压冲击能力。

高阻态常用表示方法:高阻态常用字母 Z 表示。

在一个系统中或在一个整体中,我们往往定义了一些参考点,就像我们常常说的海平面,在单片中也是如此,我们无论说是高电平还是低电平都是相对来说的。明确了这一点对这一问题可能容易理解。

单片机中的高阻态

在51单片机,没有连接上拉电阻的P0口相比有上拉电阻的P1口在I/O口引脚和电源之间相连是通过一对推挽状态的FET来实现的,51具体结构如下图。

组成推挽结构,从理论上讲是可以通过调配管子的参数轻松实现输出大电流,提高带载能力,两个管子根据通断状态有四种不同的组合,上下管导通相当于把电源短路了,这种情况下在实际电路中绝对不能出现。

从逻辑电路上来讲,上管开-下管关开时IO与VCC直接相连,IO输出低电平0,这种结构下如果没有外接上拉电阻,输出0就是开漏状态(低阻态),因为I/O引脚是通过一个管子接地的,并不是使用导线直接连接,而一般的MOS在导通状态也会有mΩ极的导通电阻。

到这里就很清楚了,无论是低阻态还是高阻态都是相对来说的,把下管子置于截止状态就可以把GND和I/O口隔离达到开路的状态,这时候推挽一对管子是截止状态,忽略读取逻辑的话I/O口引脚相当于与单片机内部电路开路,考虑到实际MOS截止时会有少许漏电流,就称作“高阻态”。

由于管子PN节带来的结电容的影响,有的资料也会称作“浮空”,通过I/O口给电容充电需要一定的时间,那么IO引脚处的对地的真实电压和水面浮标随波飘动类似了,电压的大小不仅与外界输入有关还和时间有关,在高频情况下这种现象是不能忽略的。

总之一句话高阻态是一个相对概念。在使用的时候我们只要按照要求去做,让我们加上拉我们就加上,都是有一定道理的。

来源:电子产品世界

围观 746

单片机就是个小计算机,跳蚤虽小不但五脏惧全,有时还跳得很高呢!自然,大计算机少不得的数据存储系统,小不点的单片机一样有,而且往往和CPU集成在一起,更加显得小巧灵活。直到90年代初,国内容易得到的单片机就是8031:不带存储器的芯片,要想工作,还必需外加RAM和ROM,单片机成了3片机,...现在不同了,大的小的又是51,又是AVR又是STC,还有什么430,PIC等等,都各说各的好,可是谁业也不敢说"我不要存储器"!好,废话少说...

单片机内,有这么几种数据存储手段:

1. 程序存储器:里面存放的是单片机的灵魂:工作程序.小的可能只有1KB(最多只能装1024条8位数据,因为实际指令还有许多2字节,3字节指令,所以它还装不下1024条指令)大的也有128KB的.这些8位数据要么在工厂里做摸子光刻进去,要么一次性的烧写进去,要么...业余或开发最多的用编程器这么个特殊工具把调试成功的机器码装载进去,或者像AVR单片机那样自己花几块钱做一条下载线,把电脑里这些东西灌进去(或许是AVR最吸引人之处),它一旦进驻电脑的程序存储器中,除了借助上述装置便不能自由改写,在单片机运行时,只是从其中读出指令或固定的数据,所以给程序存储器一个"只读存储器"的别名,简写为ROM,包括用编程器写紫外线擦除内容的EPROM.用电擦除的EEPROM和现在新兴的FLASH ROM;一次性写入的ROM仅用于电路和程序固定的批量产品中,实际工作起来,都是一样的.

为了定位ROM中的数据,每个8位(bit:二进制位)存储单元都有一个固定的"地址",通常用16进数表示:例如对于一个所谓4K的ROM,地址从0000H到0FFFH,(即是从0000,0001...4095),单片机运行时从哪个地址取数据,完全由程序本身决定,并不要我们干预.记住,给单片机一通电,它经过一个短暂的复位过程,立即转向ROM的最低地址0000H,在这里面放置的往往是一条"跳转"指令,它从这里一步跳到另一个地址:程序的真正起始地址,例如51机的0080H.原因?以后再说...

难道ROM中就只有指令不能来点别的?看好罗,ROM是程序存储器,除了指令外,还包括运行程序必须的某些固定数据,例如:数据表.假如,我们要求在单片机的某口上输出00H到FFH(255)按正弦半波变化的数值,每秒10000次,那如果硬要它按照公式一个个计算,对于它来说未免力不从心,可是我们可以把预先计算好的数值存入ROM中,到时候直接取出不是好多了?...又如一个重要的应用:大家一定见过不少单片机的东西上面都有数码显示,那些个数字其实就是用单片机的口线控制数码管的字段电极电位,这些字形也是存放在ROM中的字模表,各个字模和0-9的数字(机器内当然是0000-0101二进数)对应起来,例如常见的共阳极7段数码管,必须在阳极加正电,7个阴极都是地电位,才能显示数字"8",数字8对应的显示字码值是二进数“10000000“(那个1对应的是小数点,高电位不让它显示)。这简直是非用不可了。。。ROM先说到这里

2. 数据存储器:这是个可以随时存取数据的一块存储器,也就是可以读(取)也可以写(存)的存储器,简称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在单片机里的用途,主要是存放临时数据,例如用单片机测温,每秒测1次,显示1分钟的平均值(1分钟更新一次);我们先通过传感器,放大电路,A/D转换,把温度这个模拟量转变为成比例的二进数,然后每秒钟1次把数字量通过输入口顺序存入到单片机的RAM中,然后对他们进行两两求和再平均的计算(题外话:要单片机进行“除法“运算比较麻烦,例外的是除以2,4,8。。。却非常简单!----运用“右移”指令1,2,3次便可)最后的数值显示出来,然后把这60个存储单元统统写0清除旧数据,下次又如此这般地循环进行。。。

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

来源:网络

围观 671

单片机要这么学?八条谨记!

demi的头像

怎么学单片机?也常看到有人说学了好几个月可就是没有什么进展。当然,受限于每个人受到的教育水平不同和个人理解能力的差异,学习起来会有快慢之分,但我感觉最重的就是学习方法。一个好的学习方法,能让你事半功倍,这里说说我学习单片机的方法。

1、万事开头难、要勇敢迈出第一步。

开始的时候,不要老是给自己找借口,说KEIL不会建项目啦、没有实验板啦之类的。遇到困难要一件件攻克,不会建项目,就先学它,这方面网上教程很多,随便找找看一下,做几次就懂了。

然后可以参考别的人程序,抄过来也无所谓,写一个最简单的,让它运行起来,先培养一下自己的感觉,知道写程序是怎么一回事,无论写大程序还是小程序,要做的工序不会差多少,总得建个项目,再配置一下项目,然后建个程序,加入项目中,再写代码、编译、生成HEX,刷进单片机中、运行。

必须熟悉这一套工序。个人认为,一块学习板还是必要的,写好程序在上面运行一下看结果,学习效果会好很多,仿真器就看个人需要了。单片机是注重理论和实践的,光看书不动手,是学不会的。

2、知识点用到才学,不用的暂时丢一边。

学习ARM嵌入式的时候,发现自己对以前学过的数模器件的知识遗忘了不少,按照我的进度本来应该继续学习ARM微处理器控制的课程,但想着后来势必还会遇到相同的问题所以就准备中断一下,杀回来把汇编和一些电路知识再总结一下,查漏补缺。如果有写的不合理的地方,还请多多指教。

言归正传,先来一幅图片来引入今天要讲述的三个知识点:

锁存器(由一个D触发器构成)

D:数据输入端;

CP/CLK:时序信号输入端;

Q:输出端;

~Q:反向输出端;

工作原理:

当D端输入数据信号,CP/CLK端没有时序信号时,Q和~Q端将不会有信号输出;

当D端输入数据信号,CP/CLK端有时序信号时,Q和~Q端有信号输出;

当D端和CP/CLK端同时有信号输入后突然撤掉CP/CLK信号时,D的值将会被保存到(“锁”)在器件内,此时Q和~Q端并没有信号输出,等下一个时序再次输入到CP/CLK端,Q和~Q将会正常输出D端传送的信号;

三态缓冲器(三态门)

三态:输出端的高电平,低电平,高阻态;

这里小哥偷个懒,百度一哥们儿给的解释,图文并茂想必更加清晰;

这里给各位初学者提个醒:连个三态缓冲器的输出端并不是说输出到了锁存器的D端借口上,而是输出到了单片机内部总线上,至于怎么传的那是后话;

输出驱动器

看图可知管脚的输出是靠两个MOS组成的推挽式结构,而且两个MOS管一次只能导通一个;

多路开关

首先,P0管口是复用管口,由于多路开关的存在是的P0口既可以用作普通I/O口,也可以用作外部拓展时传输数据和地址信号的总线功能;

P0口做低八位地址总线和数据总线,P2做高八位地址总线;

这里解释一下:不同的单片机结构不同,比如8031系列单片机内部没有程序储存器ROM,这就是的必须外置ROM,这是就必须牺牲管脚去外接ROM;

来源:网络

围观 419

任何一款单片机,其实学习步骤都是一样的,不管是8位的入门芯片,还是32位的高速芯片。以下这些步骤是必须的,你得一步步来!

1、数字I/O的使用

使用按键输入信号,发光二极管显示输出电平,就可以学习引脚的数字I/O功能,在按下某个按钮后,某发光二极管发亮,这就是数字电路中组合逻辑的功能,虽然很简单,但是可以学习一般的单片机编程思想,同时还学会了寄存器的操作方式。例如,必须设置很多寄存器对引脚进行初始化处理,才能使引脚具备有数字输入和输出输出功能。

每使用单片机的一个功能,就要对控制该功能的寄存器进行设置,这就是单片机编程的特点,千万不要怕麻烦,所有的单片机都是这样。要注意的是两个功能使用同一组I/O口,比如LCD和LED数据端口在好多例程里都是共用一组端口,如果两者结合,会有冲突,达不到预期的效果,或者在现在LCD的同时LED也在乱跳,这是目前大开发板采用的方式,建议不同的模块使用不同的IO口。

2、定时器的使用

学会定时器的使用,就可以写出更高效的程序,别人的程序跑完一遍需要100ms,加入定时器后,你的程序跑完一遍可能只要10ms,在工业、家用电气设备的控制中也有很多应用。真正会写程序的人必然是用定时器的高手。例如,可以用单片机实现一个具有一个按钮的楼道灯开关,该开关在按钮按下一次后,灯亮3分钟后自动灭,当按钮连续按下两次后,灯常亮不灭,当按钮按下时间超过2s,则灯灭。

数字集成电路可以实现时序电路,可编程逻辑器件(PLD)可以实现时序电路,可编程控制器(PLC)也可以实现时序电路,但是只有单片机实现起来最简单,成本最低。定时器的使用是非常重要的,逻辑加时间控制是单片机使用的基础。

3、中断

单片机的特点是一段程序反复执行,程序中的每个指令的执行都需要一定的执行时间,如果程序没有执行到某指令,则该指令的动作就不会发生,这样就会耽误很多快速发生的事情,例如,按钮按下时的下降沿。要使单片机在程序正常运行过程中,对快速动作做出反应,就必须使用单片机的中断功能,该功能就是在快速动作发生后,单片机中断正常运行的程序,处理快速发生的动作,处理完成后,在返回执行正常的程序。

中断功能使用中的困难是需要精确地知道什么时候不允许中断发生(屏蔽中断)、什么时候允许中断发生(开中断),需要设置哪些寄存器才能使某种中断起作用,中断开始时,程序应该干什么,中断完成后,程序应该干什么等等。中断学会后,就可以编制更复杂结构的程序,这样的程序可以干着一件事,监视着N件事(多个中断),一旦监视的事情发生,就中断正在干的事情,处理监视的事情,形象的比喻,中断功能使单片机具有吃着碗里的,看着锅里的功能。举个例子,中断就是,你正在宿舍写代码,突然有人敲门,你停下写代码去开门,开完门后又回来接着写你的代码,这就是一个中断的过程。以上三步学会,就相当于降龙十八掌武功,会了三掌了,可以勉强护身。但是离大神还有很长一段距离。

4、串口的使用

单片机都有串口,比如国产芯片STC15系列的很多型号,都具有两个串口,更有一些型号有4个串口的。单片机串口接口不能直接与PC机的RS232接口连接,因为它们之间的逻辑电平不同,需要使用一个电平转换芯片进行电平转换,最常用的转换芯片是MAX232。

串口接口的使用是非常重要的,通过该接口,可以使单片机与PC机之间交换信息,虽然RS232通信并不先进,但是对于接口的学习是非常重要的。正确使用串口,需要学习通信协议,PC机的RS232接口编程等等知识。试想,单片机实验板上的数据显示在PC机监视器上,而PC机的键盘信号可以在单片机实验板上得到显示,将是多么有意思的事情啊!

5、A/D转换器

很多单片机带有多通道A/D转换器,转精度有8位,10,12位或更高的不等。STC15系列的就有8通道的10位高速A/D转换器。通过A/D转换器可以使单片机操作模拟量,显示和检测电压、电流等信号。学习时注意模拟地与数字地、参考电压、采样时间,转换速率,转换误差等概念。使用A/D转换功能的简单的例子是设计一个电压表。

6、学会用扩展接口

学会PCI、I2C接口和液晶显示器接口,这些接口的使用可以使单片机更容易连接外部设备,在扩展单片机功能方面非常重要。

7、检测、控制电机

学会比较、捕捉、PWM功能,这些功能可以使单片机能够控制电机,检测转速信号,实现电机调速器等控制功能。

8、学习产品开发方向相关

学习USB接口、TCP/IP接口、各种工业总线的硬件与软件设计是非常重要的,因为这是当前产品开发的发展方向。

学完了这些东西,你肯定会跃跃欲试的了,此时,最好的就是自己做项目,项目不在乎大小,不在乎难易,先从简单的开始做起。这里说的做项目不是说在开发板上写个程序调试下就完了,是自己动硬件设计,电路图的绘制,电路制作,电路焊接,程序的编写及调试,最后出来一个完整的成品。土豪可以绘制PCB板图打样,穷鬼就直接老老实实的用洞洞板手动焊接电路。这样又能更好的锻炼焊接技术。

围观 240

页面

订阅 RSS - 单片机