• 基于ARM9芯片的S3C2440和Linux操作系统设计SPI驱动程序

    基于ARM9芯片的S3C2440和Linux操作系统设计SPI驱动程序

    在嵌入式开发过程中,许多系统通常使用串口驱动来满足通信要求,但在实际应用中,使用SPI通信方式会更加高效和快捷[2]。SPI接口是一种高速、高效的串行接口技术,因而SPI设备在数据通信应用中十分方便[3]。本文基于ARM9芯片的S3C2440和Linux操作系统,设计了一种SPI驱动程序,该驱动程序功能可靠灵活、易于移植,可应用于多种嵌入式平台,实现ARM与设备之间的通信。 1硬件说明 1.1S3C2440开发平台 1.2SPI硬件模块 S3C2440具有两个SPI,每个SPI具有两个8位移位寄存器用于独立地发送和接收数据,并兼容SPIver.2.11协议,支持8位逻辑预分频,系统可用polling、中断、DMA三种方式判断SPI发送及接收状态。此SPI模块共包含以下信号线[5]: (1)SCK:数据同步时钟信号,由主设备驱动,向从设备输出,使得从设备按照同步时钟的步调来接收或发送数据。 (2)nCS(由用户指定GPIO):从设备选择信号线(SlaveSelect,SS)由主设备发出,用来选择激活某个从设备,低电平有效。 (3)MISO(SPIMISO0):主入从出信号线,表示该信号在主设备中作为输入,在从设备中作为输出。 (4)MOSI(SPIMOSI0):主出从入信号线,表示该信号在主设备中作为输出,在从设备中作为输入。 (5)/SS(nSS):多主错误检测。 2Linux下的SPI设备驱动程序设计 Linux设备驱动在Linux内核中扮演着重要的角色。它可使某些特定硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备工作的细节。用户操作可通过一组标准化的调用来执行,这些调用在形式上完全独立于特定的驱动程序,而将这些调用映射到实际硬件设备的特有操作上,则是驱动程序的任务[6]。本设计的SPI驱动主要定义了初始化、读和写三个操作。其中初始化操作用于驱动程序第一次加载到内核运行时,对一些内核机制及存储器进行初始化。写操作负责将用户数据拷贝至内核缓冲区,控制本地主SPI发送数据至从SPI寄存器中。读操作将按照用户要求读取的字节数,连续读取本地主SPI中接收到的数据,并将其拷贝至用户空间。驱动程序将采用中断的方式通知系统SPI数据是否发送完毕,即当SPI硬件模块每发送完毕一个数据,都会通过中断线向系统发起中断,系统响应中断后,驱动程序将调用中断处理例程。 2.1SPI初始化 (1)申请中断。此驱动设计通过中断判断数据是否发送完毕,所以需要申请SPI0相关的中断,并注册相应的中断处理函数。此驱动程序的中断处理函数声明如下: staTIcirqreturn_ts3c2440_isr_spi(inTIrq,void*dev_id,structpt_regs*reg) 利用request_irq向内核申请中断号并注册中断处理函数: request_irq(IRQ_SPI0,s3c2440_isr_spi,SA_INTERRUPT,DEVICE_NAME,s3c2440_isr_spi); (2)虚拟地址映射。驱动程序可以直接通过访问内核中的虚拟地址来访问设备物理地址所对应的寄存器,对其进行操作。SPI设备的地址映射过程如下: request_mem_region(S3C2440_PA_SPI,0x30,“s3c2440-spi”); base_addr=ioremap(S3C2440_PA_SPI,0x30); 其中S3C2440_PA_SPI为SPI的物理地址(在/asm-arch/arch-s3c2440/map.h中定义),从S3C2440_PA_SPI开始分配0x30大小的内存区域,此后将其移至内核空间。 (3)相关寄存器的设置。通过配置SPI功能寄存器设置SPI工作模式。以ioremap返回的虚拟地址为基址,通过增加不同偏移量访问相应寄存器。本次设计将本地SPI设为主设备,开启SCK信号使能,设定CPOL和CPHA均为0,SPI工作在普通模式下。设置波特率预分频寄存器(SPPRE)中的分频比为8。具体设计如下: __raw_writel((S3C2440_SPCON_SMOD_INT|S3C2440_SPCON_ENSCK|S3C2440_SPCON_MSTR),s3c2440_SPCON); DPRINTK(DEVICE_NAME“SPCONiniTIalizen”); __raw_writel((S3C2440_SPPIN_ENMUL|S3C2440_SPPIN_KEEP),s3c2440_SPPIN); DPRINTK(DEVICE_NAME“SPPINiniTIalizen”); __raw_writel(0x07,s3c2440_SPPRE); DPRINTK(DEVICE_NAME“SPPREinitializen”); (4)初始化发送和接收数据缓冲区。数据缓冲区使用环形缓冲区结构,通过头尾指针的循环移动,实现对缓冲区的动态管理。其定义如下: typedefstruct { spi_bufbuf[MAX_SPI_BUF]; unsignedinthead,tail; wait_queue_head_twq; }SPI_BUF;staticSPI_BUFspi_Tx_buf;staticSPI_BUFspi_Rec_buf; 其中spi_buf表示char型,MAX_SPI_BUF为缓冲区大小,设为1024B。head、tail分别表示头尾数组下标,wq为等待队列头。此结构依靠以下宏进行管理: #defineSPI_Tx_BUF_HEAD(spi_Tx_buf.buf[spi_Tx_buf.head]) #defineSPI_Tx_BUF_TAIL(spi_Tx_buf.buf[spi_Tx_buf.tail]) #defineINCBUF(x,mod)((++(x))&((mod)-1)) 前两个宏用于引用缓冲区中的元素,最后一个宏用于对头尾下标进行前移,并保证头尾下标数值可循环变化,不发生溢出。 在初始化时,分别对接收和发送缓冲区的头尾指针进行清零操作,具体如下: spi_Tx_buf.head=spi_Tx_buf.tail=0;spi_Rec_buf.head=spi_Rec_buf.tail=0; (5)内核机制相关的数据结构初始化。本设计所使用的内核机制包括了中断上下半部的操作和睡眠等待机制,因此需要对发送、接收等待队列以及tasklet结构进行初始化,并注册tasklet处理函数。初始化过程如下: init_waitqueue_head(&(spi_Tx_buf.wq)); init_waitqueue_head(&(spi_Rec_buf.wq)); tasklet_init(&spi_tasklet,spi_tasklet_handler,data); (6)初始化相应端口。根据S3C2440外部管脚配置,将与SPI功能引脚复用的GPIO设定为SPI相应功能。具体操作如下: s3c2440_gpio_cfgpin (S3C2440_GPE11,S3C2440_GPE11_SPIMISO0); s3c2440_gpio_cfgpin (S3C2440_GPE12,S3C2440_GPE12_SPIMOSI0); s3c2440_gpio_cfgpin (S3C2440_GPE13,S3C2440_GPE13_SPICLK0); s3c2440_gpio_cfgpin (S3C2440_GPG2,S3C2440_GPG2_INP);//设置nSS s3c2440_gpio_cfgpin(S3C2440_GPB10, S3C2440_GPB10_OUTP);//设置片选信号 s3c2440_gpio_setpin(S3C2440_GPB10,1); 2.2SPI写操作 写操作主要是将上层应用部分的用户空间中的数据拷贝到内核空间中的环形缓冲区中,此后将缓冲区的数据送到SPI发送寄存器中,在SPI发送完一个数据后,系统产生中断,中断例程中的下半部将调用tasklet判断缓冲区状态。若缓冲区中有相应的空间,可以将下一数据填入SPI发送寄存器中,直至将缓冲区数据全部发送完毕。 本设计的写操作实现了环形缓冲区的动态管理,即在缓冲区删除数据、尾指针前移的情况下,允许向缓冲区添加数据,头指针前移。此设计可以使用户空间任务与内核空间的数据发送同时进行,提高了用户空间任务执行效率,并且当利用copy_from_user函数将数据从用户空间拷贝至内核空间时,数据发送仍在进行,即数据从用户空间至内核空间拷贝过程与数据发送过程并发,提高了驱动程序效率。 为了实现环形缓冲区动态管理,定义了copy_to_Tx_buf_init和copy_to_Tx_buf两个函数完成数据向缓冲区的复制操作。 (1)copy_to_Tx_buf_init函数。本函数主要用于两种情况: ①如果缓冲区为空,当有一组数据到来且此数据的大小小于缓冲区的空间大小时,直接将此数据放到缓冲区中。 ②如果发送数据的大小大于剩余缓冲区的空间,则只复制缓冲区大小的数据到缓冲区。 缓冲区满,该进程进行睡眠操作,直到缓冲区所有数据发送完毕,缓冲区再次为空,当前进程被唤醒,将此组用户数据的未发送部分复制到缓冲区,继续发送。 (2)copy_to_Tx_buf函数。此函数主要用于缓冲区正在发送且未发送完毕的情况,将新一组用户数据copy至缓冲区。首先计算缓冲区剩余空间,若剩余空间大于本组用户数据大小,则直接将用户数据全部copy至缓冲区;若剩余空间小于本组数据大小,则copy与剩余空间大小相同的用户数据至缓冲区。 写操作的具体流程如图1所示,首先用户数据从空间态转换到内核态,并设置相应的接收标志位。此后判断数据大小。若数据大于缓冲区空间,数据发生溢出,写操作结束;若没有溢出,为了保证进程间的数据,使得该进程获得自旋锁,此时判断缓冲区是否为空。根据上面两个函数的介绍,在不同情况下分别调用不同的函数,在数据写入环形缓冲区后,将数据发送到SPI的发送寄存器。当SPI发送寄存器发送数据时,环形缓冲区依旧接收数据,如果此时缓冲区为满,则释放自旋锁,并设置进程等待标志位(wait_Tx_done),将此进程休眠,直到发送寄存器中的数据发送完毕,再唤醒进程,判断数据是否全部发送完毕。若仍有数据等待发送,则调用copy_to_Tx_buf_int;若数据已全部发送完毕,则写操作结束。若缓冲区不为满,则判断数据是否发送完毕。数据全部发送完毕,发送操作结束。 2.3SPI读操作 读操作是连续读取主SPI发送到从SPI的接收缓冲区中的数据,并将其传送给用户空间。具体流程如图2所示。首先判断操作标志位spi_Rec_en,若此位为0,说明此时驱动正处于发送状态,则将发送进程等待标志位(wait_Tx_done)置1,读进程进入休眠状态即放入等待队列中,等待中断处理函数中相关发送程序唤醒。若操作标志位不为1,读进程首先获得自旋锁,判断数据大小。若数据大小不为0且不超过缓冲区大小,则按照S3C2440接收数据的要求,向SPI发送寄存器写入第一个dummy数据(0xff)。此后,将接收进程等待标志位(wait_Rec_done)置1,释放自旋锁,并将此进程加入等待队列进行休眠,直到用户要求的所有数据已发送至接收缓冲区后,由中断处理函数唤醒该进程,最后将接收区中的数据放到临时接收缓存中,以便于其他操作读取。 3SPI驱动程序测试 SPI驱动程序主要通过调用写操作,使SPI连续发送数据0x55,此后再调用SPI读操作,将MISO上的串行数据读入用户缓冲区,并与实际数据进行比较。图3为示波器测试MOSI引脚波形。图中波形1为SCK信号,ARM系统时钟为40MHz,SPI的SCK信号为系统时钟的256分频,约为156kHz;波形2为MOSI信号,SPI从低位向高位串行移位。通过波形可以看出,SPI驱动能够准确地完成读写操作,验证了其正确性。

    时间:2021-03-23 关键词: S3C2440 Linux ARM

  • Java设计:JDBC连接数据库的方法介绍

    Java设计:JDBC连接数据库的方法介绍

    一、使用JDBC连接数据库 基本步骤: (1)加载并注册数据库驱动 (2)通过DriverManager获取数据库连接 (3)通过ConnecTIon对象获取Statement对象 (4)使用Statement接口执行SQL语句 (5)操作ResultSet结果集 (6)关闭连接,释放资源 2.下面进行代码演示 1.注册数据库驱动程序的语法格式如下: DriverManager.registerDriver(Driverdriver) 或者 Class.forName(“DriverName”); 2.创建数据库连接 Stringurl=“jdbc:odbc:student”; //student是在数据源管理器中创建的数据源名字 ConnecTIoncon=DriverManager.getConnecTIon(url); //一下语句是采用了一种无数据源连接数据库的方式 con=DriverManager.getConnecTIon(“jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb)}; DBQ=d:\\xsgl.mdb”) 3.获取Statement对象 可见之前连载的三种成员方法创建Statement对象、PreparedStatement对象、CallableStatement对象 4.执行SQL语句 所有的Statement都有以下三种执行SQL语句的方法 (1)execute():可以执行任何SQL语句 (2)executeQuery():执行查询语句,返回ResultSet对象 (3)executeUpate():执行增删改操作 5.获得结果结合ResultSet对象,在进行一系列操作。 举例: packagecom.bjpowernode.java_learning; importjava.sql.Statement; importjava.sql.Connection; importjava.sql.ResultSet; importjava.sql.SQLException; publicclassD134_1_JDBCConnection{ publicstaticvoidmain(String[]args){ Statementstmt=null; ResultSetrs=null; Connectionconn=null; try{ //1.注册数据库的驱动程序 Class.forName(“com.hxtt.sql.access.AccessDriver”); //2.通过DriverManager获取数据库连接 conn=DriverManager.getConnection(“jbdc:Access:///e:xsgl.mdb”); //3.通过Connection对象获取Statement对象 stmt=conn.createStatement(); //4.使用Statement执行SQL语句 Stringsql=“select*fromstudentInfo”; rs=stmt.executeQuery(sql); //5.操作ResultSet结果集 System.out.println(“studentID|studentName|studentSEX”); while(rs.next()){ intid=rs.getInt(“studentID”);//通过列名获取指定字段的值 Stringname=rs.getString(“studentName”); Stringpsw=rs.getString(“studentSEX”); System.out.println(id+“|”+name+“|”+psw); } }catch(Exceptione){ e.printStackTrace(); }finally{ //6.回收数据库资源 if(rs!=null){ try{ rs.close(); }catch(SQLExceptione){ e.printStackTrace(); } rs=null; } if(stmt!=null){ try{ stmt.close(); }catch(SQLExceptione){ e.printStackTrace(); } stmt=null; } if(conn!=null){ try{ conn.close(); }catch(SQLExceptione){ e.printStackTrace(); } conn=null; } } } } 3.注意点 JDK1.7以后的版本不再包含Access桥接驱动程序,因此不再支持JDBC-ODBC桥接方式,需要下载Access驱动程序的jar包(Access_JDBC30.jar),而JDK1.1到JDK1.6都自带jar包,不需要下载。 下载完成后把Access_JDBC30.jar包放到JDK的lib文件夹里,之后修改环境变量CLASSPATH,在其中加上这个jar包,路径为jar包的绝对路径,例如:C:\ProgramFiles\Java\jre1.8.0_65\lib\Access_JDBC30.jar。如果CLASSPATH中已经有了其他的值,最后添加该包就可以了。然后再工程里面设置好,至此就可以正常连接数据库了,但是驱动的名称就不是sun.jdbc.odbc.JdbcOdbcDriver,而是com.hxtt.sql.access.AccessDriver,数据库路径也可以采用直连,URL可以设置为jdbc:Access:///d:MYDB.accdb。 二、源码: D134_1_JDBCConnection.java https://github.com/ruigege66/Java/blob/master/D134_1_JDBCConnection.java 以上就是Java如何使用JDBC连接数据库的详细内容。

    时间:2021-03-23 关键词: 数据库 JDBC

  • EEPROM数据丢失的原因与对策

    EEPROM数据丢失的原因与对策

    LinkedInEEPROM 数据被破坏的主要原因有: 1、电源异常使EEPROM的数据彻底丢失; 2、复位不好和软件跑飞可能会使EEPROM的数据被改写。 要防止EEPROM数据被破坏,主要在以下几方面做工作: 1、选用比MCU的电源范围宽并有WP引脚的EEPROM芯片; 2、做好电源滤波,而且要等电源开机稳定后才去读写EEPROM; 3、做好复位电路; 4、做好软件跑飞的处理; 5、SDA和SCK的上拉最好用I/O口控制,既可省电,也可在一定情况下保护EEPROM; 6、WP接MCU的RESET;如WP做软件保护,将写不进数据;接I/O,上电时WP的状态可能不稳定。 7、EEPROM空间富余时考虑双备份或多备份数据,每份数据都有校验和。 选用比MCU的电源范围宽并有WP引脚的EEPROM芯片的原因: 1、EEPROM的芯片本身有一定的保护时序; 2、电源低于MCU工作电源高于EEPROM芯片的最低工作电源时,EEPROM芯片会处于稳定状态,不会丢失数据。 3、当电源较长时间低于EEPROM芯片的最低工作电压时非常容易丢失全部数据。否则MCU还能工作,但EEPROM芯片已不能工作时,EEPROM中的数据会全部丢失。 4、用I/O口线给EEPROM供电,只在读写EEPROM时才给器件供电,不仅能提高可靠性,而且能省电。 但有两点要注意: 一是一些单片机复位时所有I/O都是高电平,会使EEPROM芯片进入工作; 二是EEPROM芯片给电后需要有大于写周期的延时才能读写。 EEPROM数据丢失的原因与对策 1、环境因素 ★原因:高温、高湿、辐射、静电、强电磁场均可能使EEPROM存储单元 造成数据丢失或数据保存时间缩短。 ●对策: ①不要在高温、高湿、辐射、静电、强电磁场环境中存放EEPROM器,如果法避免,应采取适当的防护措施。 ②在高温环境中使用EEPROM器件,须确认存储内容的更新时间和器件使用期限 ③工作环境湿度较大时可考虑线路板灌胶防潮,防水胶要选用吸水率低的 ④在辐射、静电、强电磁场环境中工作要做好屏蔽。 2、设计因素 ★原因:器件在读写时系统状态不定。 ●对策: ①增加上电复位电路,确保在上、掉电期间系统处于确定的状态。复位门槛电压应不小于MCU最低工作电压,EEPROM器件的工作电压范围应不小于MCU。 注意:某些MCU内置的POR电路在电源上升缓慢时不能保证可靠复位 ②增加电源电压检测电路,确保在电源电压稳定正常后MCU才开始运而在电源状态不定时不访问EEPROM。启用MCU内的BOD电路不足以防止 EEPROM读写错误。 ③利用器件的“写保护”引脚,可以减小EEPROM被意外改写的几率 ★原因:器件在读写时被异常中断。 ●对策: ①确认电源电压从正常值跌落至MCU复位门槛电压的时间足够保持EEPROM读写操作完成。根据需要增加电源储能电容或者使用备份电源。 ②在检测到电源电压跌落时立即关闭所有无关外设,在访问EEPROM期间禁止MCU中断,或者设置EEPROM读写中断为最高优先级。 ③使用“写入查询”加快写入过程。 ★原因:模拟总线时序不够严格规范。 ●对策: ①总线上拉电阻太大,使SDA、SCL边沿上升时间太长。对400kHz快速模式,当总线电容小于100pF时上拉电阻推荐值为2.7kΩ。 ②MCU操作速度太快或延时不够,不满足总线信号的建立、保持时间查阅《I2C总线技术精要》,按示例规范时序编程。 ③总线过长,使信号边沿不能满足要求。应缩短总线长度。 ④总线电容超过400pF。应减少总线上所连接的器件。 ★原因:器件在读写时总线受到干扰。 ●对策: ①如应用板干扰较大,应重新设计电路或改变PCB布局布线,敷铜或多层板改善EMC。如环境干扰较大,应采取相应的屏蔽措施。 ②使用数据编码和校验增加数据的可信性,或写入特定标志来识别数据完整性,如有可能,在每次写入完成后立即读出校验。 ★原因:地线不合理或电源噪声干扰。 ●对策: ①重新布置地线,注意区分模拟地、数字地、信号地、功率地、屏蔽地,安全地 ②使用带屏蔽的隔离电源;在电源线上增加LC滤波器;IC器件的电源引脚加0.1uF瓷介退耦电容。别忘了三个基本电路元件之一的电感器,抑制电源噪声干扰,电感器通常有立竿见影的作用。必要时,加磁珠抑制高频噪声干扰。[page] 3、生产因素 ★原因:焊接和装配过程中的高温、静电可能造成EEPROM器件数据丢失或保存时间缩短。 ●对策: ①改进生产工艺,控制加工过程,加强防静电措施。 ②如有可能,在线路板生产完成后再写入EEPROM数据。 4、器件因素 ★原因:器件擦写次数已接近循环寿命。 ●对策:更换器件。如果器件有剩余空间,软件通过更改每次写入的地址单元可延长 器件使用寿命。 ★原因:器件质量问题。 ●对策:更换不同厂家或批号的器件;控制采购过程。 只是单片机在掉电时,电压低过一定的值。执行程序代码出错或是程序指针跑飞。刚好执行EEPORM 写入操作,才会出现所说的EEPROM 数据丢失!就算是外置EEPROM 在低于正常工作电压,进行写入操作,也会出现这种情况! BOD 的功能是低压复位。当电压低过一定的值,就会让单片机复位。不能继续程序代码,就没有出现所说的丢失数据! EEPORM 进行数据备份,并在每份数据后里加入校验机制(如RCR)。我是这么做的,读取EEPROM 的数据组并进行校验检测。如果通不过,这组数据就不要。继续下一组数据检测,当所有的数据组都不能通过检测时,并加载默认的设置参数!在更新数据时,刷新所有的数据组。并给每组加入校验机制!但最好不要在掉电时对EEPROM 进行任务的操作!这样出错的机率很低! 在项目开发中经常使用到EEPROM,现在把自己开发中曾经遇到的陷阱和自己的解决方法列出。 (1)现象:加密型遥控器的ID自动丢失和改变。 原因:在更新EEPROM过程中,断开电源。 解决方法: a.更改设计避免在写入EEPROM过程中断开电源; b.增加100uF的电容,断电后瞬间维持EEPROM供电正常至EEPROM写入完成。 (2)现象:保存在EEPROM里的配置信息自动被改变。 原因:在EEPROM读写过程中进入了中断服务程序,而中断服务程序也调用了EEPROM读写函数。 解决方法: a.保证EEPROM读写函数的第一句是cli(),最后一句是sei(); b.中断服务程序不直接调用EEPROM读写函数,如果SRAM足够大使用读写缓冲区代替直接读写EEPROM,中断返回后在主循环粒更新EEPROM; c.如果检测到EEPROM已被占用,则进入阻塞状态,等待EEPROM释放后继续执行; d.如果EEPROM里的数据长度大于EEPROM最小存储单元,必须保证该数据的读写不被打断。 (3)现象:突然断电时,EEPROM数据偶尔会丢失。 原因:在断电时刚好在进行EEPROM写操作。 解决方法:加大电源滤波电容的容量,增加电压检测功能,当电压偏低时禁止EEPROM写入操作。 (4)现象:当大功率交流或直流电机启动或后,EEPROM里的数据自动丢失或改变。 原因:在大功率电机启动或断开瞬间EMI干扰大。 解决方法: a.避开这些时候读写EEPROM。 b.如果无法避开这些时候,启动EEPROM写保护功能,并且每个数据都保存多个副本。 c.使EEPROM和EEPROM的DAT,CLK等信号线远离可能产生干扰的元件,并且避免形成大的环路。 d.使用EMI抑制电路降低干扰幅度。 9.5 注意事项 单片机的断电保护虽然不是非常复杂,但是要做得好,使线路简洁、性能可靠却很不容易。下面列了几点设计时需要注意的事项。 (1)加大滤波电容的容量。单片机接收到电压监控电路送来的中断信号后,立即中断正在执行的程序,转入中断服务子程序,执行数据保护并最后使单片机和RAM进入低功耗状态。在执行中断服务程序期间,单片机上的电源还必须保持在能够正常工作的电压范围,也就是说电源VCC的跌落速度不能太快。为了达到这个目的,必须在主电源的滤波电路中,加大滤波电解电容的容量,一般应使其总电容为4700mF以上。为了缩小体积,也可以把几个电解电容器并联使用。 对于断电后数据保存在EEPROM的单片机系统,由于EEPROM的数据写入速度要比RAM慢得多,这样写同样的数据,需要的时间将会更多,因此要求主电源电压的降低速度更慢,也就是说滤波电容的容量要更大,才能保证数据安全完整地写入到EEPROM中。 (2)中断服务程序的执行速度要快。因为断电后执行断电保护中断程序期间,完全是靠滤波电容上的储电进行工作的,如果能加快中断服务程序的执行时间,将可以降低对电源滤波电路的要求,从节约成本和减少电路所占用的印制板空间来说都是非常有利的。为了加快中断服务程序的执行速度,建议采用汇编语言编写中断服务程序。 (3)中断服务程序中,往往是直接与存储器的绝对地址打交道,很容易算错地址,必须特别小心,反复验对,才能保证程序准确无误。 (4)由于电源突然断电,在断电的某一瞬间,将会出现电源将断未断,反复断开后又闭合,闭合后又断开的情景,反映在电源波形上就是有出现了许多毛剌,这些毛剌会给单片机系统造成非常强烈的干扰,严重时会导致断电保护中断程序无法正确执行,或使保护在RAM中的数据出错。为了解决这些个问题,对需要进行实时断电保护的单片机系统,在电源设计时,要比一般的单片机系统更注重抗干扰设计,必要时可以加强电源滤波、采用开关电源等方法,千方百计地提高系统的抗干扰性能,使断电保护更可靠。

    时间:2021-03-23 关键词: 数据丢失 EEPROM

  • FLASH存储-----NOR Flash

    FLASH存储-----NOR Flash

    所谓Flash,是内存(Memory)的一种,但兼有RAM和ROM 的优点,是一种可在系统(In-System)进行电擦写,掉电后信息不丢失的存储器,同时它的高集成度和低成本使它成为市场主流。 Flash 芯片是由内部成千上万个存储单元组成的,每个单元存储一个bit。具有低功耗、大容量、擦写速度快、可整片或分扇区在系统编程(烧写)、擦除等特点,并且可由内部嵌入的算法完成对芯片的操作,因而在各种嵌入式系统中得到了广泛的应用。 作为一种非易失性存储器,Flash在系统中通常用于存放程序代码、常量表以及一些在系统掉电后需要保存的用户数据等。 常用的Flash为8位或16位的数据宽度,编程电压为单3.3V。主要的生产厂商为INTEL、ATMEL、AMD、HYUNDAI等。Flash 技术根据不同的应用场合也分为不同的发展方向,有擅长存储代码的NOR Flash和擅长存储数据的NAND Flash。一下对NOR Flash和NAND Flash的技术分别作了相应的介绍。 一.NOR Flash 1. 市场介绍 随着技术的发展,愈来愈多的电子产品需要更多的智能化,这也对这些产品的程序存储提出了更高的要求。Flash 作为一种低成本、高集成度的存储技术在电子产品领域的应用非常广泛。今天90%的PC、超过90%的手机、超过50%的Modem,都是用了Flash,如今Flash市场规模已经超过了100亿美元。 如此巨大的市场规模,也导致市场上的Flash 品牌层出不穷。在NOR Flash市场中,Intel公司是非常重要的一家生产厂商。Intel公司生产的Flash芯片多年来占据着市场的很大份额,而它的芯片封装形式和接口也成为业界标准,从而为不同品牌的Flash带来了兼容的方便。 2. NOR Flash 的硬件设计和调试 首先,Flash 要通过系统总线接在处理器上,即保持一个高速的数据交换的通道。那么就必须了解一下Flash在系统总线上的基本操作。 1) 先了解一下处理器存储空间BANK的概念。以32位处理器S3C2410为例,理论上可以寻址的空间为4GB,但其中有3GB的空间都预留给处理器内部的寄存器和其他设备了,留给外部可寻址的空间只有1GB,也就是0X00000000~0X3fffffff,总共应该有30根地址线。这1GB的空间,2410处理器又根据所支持的设备的特点将它分为了8份,每份空间有128MB,这每一份的空间又称为一个BANK。为方便操作,2410独立地给了每个BANK一个片选信号(nGCS7~nGCS0)。其实这8个片选信号可以看作是2410处理器内部30根地址线的最高三位所做的地址译码的结果。正因为这3根地址线所代表的地址信息已经由8个片选信号来传递了,因此2410处理器最后输出的实际地址线就只有A26~A0(如下图1) 图1 2410内存BANK示意图 2)以图2(带nWAIT信号)为例,描述一下处理器的总线的读操作过程,来说明Flash整体读、写的流程。第一个时钟周期开始,系统地址总线给出需要访问的存储空间地址,经过Tacs时间后,片选信号也相应给出(锁存当前地址线上地址信息),再经过Tcso时间后,处理器给出当前操作是读(nOE为低)还是写(new为低),并在Tacc时间内将数据数据准备好放之总线上,Tacc时间后(并查看nWAIT信号,为低则延长本次总线操作),nOE 拉高,锁存数据线数据。这样一个总线操作就基本完成 图2 带nWAIT 信号的总线读操作

    时间:2021-03-23 关键词: Flash FLASH存储 NOR

  • FLASH存储-----NAND FLASH

    FLASH存储-----NAND FLASH

    NAND FLASH 在对大容量的数据存储需要中日益发展,到现今,所有的数码相机、多数MP3播放器、各种类型的U盘、很多PDA里面都有NAND FLASH的身影。 1. Flash的简介 NOR Flash: u 程序和数据可存放在同一片芯片上,拥有独立的数据总线和地址总线,能快速随机地读取,允许系统直接从Flash中读取代码执行,而无需先将代码下载至RAM中再执行 u 可以单字节或单字编程,但不能单字节擦除,必须以块为单位或对整片执行擦除操作,在对存储器进行编程之前需要对块或整片进行预编程和擦除操作。 NAND FLASH u 以页为单位进行读写操作,1页为256B或512B;以块为单位进行擦除操作,1块为4KB、8KB或16KB。具有快编程和快擦除的功能 u 数据、地址采用同一总线,实现串行读取。随机读取速度慢且不能按字节随机编程 u 芯片尺寸小,引脚少,是位成本(bit cost)最低的固态存储器 u 芯片存储位错误率较高,推荐使用 ECC校验,并包含有冗余块,其数目大概占1%,当某个存储块发生错误后可以进行标注,并以冗余块代替 u Samsung、TOSHIBA和Fujistu三家公司支持采用NAND技术NAND Flash。目前,Samsung公司推出的最大存储容量可达8Gbit。NAND 主要作为SmartMedia卡、Compact Flash卡、PCMCIA ATA卡、固态盘的存储介质,并正成为Flash磁盘技术的核心。 2. NAND FLASH 和NOR FLASH 的比较 1) 性能比较 flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。 由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。 执行擦除时块尺寸的不同进一步拉大了NOR和NADN之间的性能差距,统计表明,对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行。这样,当选择存储解决方案时,设计师必须权衡以下的各项因素。 ● NOR的读速度比NAND稍快一些。 ● NAND的写入速度比NOR快很多。 ● NAND的4ms擦除速度远比NOR的5s快。 ● 大多数写入操作需要先进行擦除操作。 ● NAND的擦除单元更小,相应的擦除电路更少。 2) 接口差别 NOR flash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。 NAND器件使用复杂的I/O口来串行地存取数据,共用8位总线(各个产品或厂商的方法可能各不相同)。8个引脚用来传送控制、地址和数据信息。NAND读和写操作采用512字节的页和32KB的块为单位,这一点有点像硬盘管理此类操作,很自然地,基于NAND的存储器就可以取代硬盘或其他块设备。 3) 容量和成本 NAND flash的单元尺寸几乎是NOR器件的一半,由于生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格,大概只有NOR的十分之一。 NOR flash占据了容量为1~16MB闪存市场的大部分,而NAND flash只是用在8~128MB的产品当中,这也说明NOR主要应用在代码存储介质中,NAND适合于数据存储,NAND在CompactFlash、Secure Digital、PC Cards和MMC存储卡市场上所占份额最大。 4) 可靠性和耐用性 采用flahs介质时一个需要重点考虑的问题是可靠性。对于需要扩展MTBF的系统来说,Flash是非常合适的存储方案。可以从寿命(耐用性)、位交换和坏块处理三个方面来比较NOR和NAND的可靠性。 在NAND闪存中每个块的最大擦写次数是一百万次,而NOR的擦写次数是十万次。NAND存储器除了具有10比1的块擦除周期优势,典型的NAND块尺寸要比NOR器件小8倍,每个NAND存储器块在给定的时间内的删除次数要少一些。 5) 位交换(错误率) 所有flash器件都受位交换现象的困扰。在某些情况下(很少见,NAND发生的次数要比NOR多),一个比特位会发生反转或被报告反转了。一位的变化可能不很明显,但是如果发生在一个关键文件上,这个小小的故障可能导致系统停机。如果只是报告有问题,多读几次就可能解决了。当然,如果这个位真的改变了,就必须采用错误探测/错误更正(EDC/ECC)算法。位反转的问题更多见于NAND闪存,NAND的供应商建议使用NAND闪存的时候,同时使用EDC/ECC算法。 这个问题对于用NAND存储多媒体信息时倒不是致命的。当然,如果用本地存储设备来存储操作系统、配置文件或其他敏感信息时,必须使用EDC/ECC系统以确保可靠性。 6) 坏块处理 NAND器件中的坏块是随机分布的。以前也曾有过消除坏块的努力,但发现成品率太低,代价太高,根本不划算。NAND器件需要对介质进行初始化扫描以发现坏块,并将坏块标记为不可用。现在的FLSAH一般都提供冗余块来代替坏块如发现某个块的数据发生错误(ECC校验),则将该块标注成坏块,并以冗余块代替。这导致了在NAND Flash 中,一般都需要对坏块进行编号管理,让每一个块都有自己的逻辑地址。 7) 易于使用 可以非常直接地使用基于NOR的闪存,可以像其他存储器那样连接,并可以在上面直接运行代码。由于需要I/O接口,NAND要复杂得多。各种NAND器件的存取方法因厂家而异。在使用NAND器件时,必须先写入驱动程序,才能继续执行其他操作。向NAND器件写入信息需要相当的技巧,因为设计师绝不能向坏块写入,这就意味着在NAND器件上自始至终都必须进行虚拟映射。 8) 软件支持 当讨论软件支持的时候,应该区别基本的读/写/擦操作和高一级的用于磁盘仿真和闪存管理算法的软件,包括性能优化。在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常需要驱动程序,也就是内存技术驱动程序(MTD),NAND和NOR器件在进行写入和擦除操作时都需要MTD。使用NOR器件时所需要的MTD要相对少一些,许多厂商都提供用于NOR器件的更高级软件,这其中包括M-System的TrueFFS驱动,该驱动被Wind River System、Microsoft、QNX Software System、Symbian和Intel等厂商所采用。驱动还用于对DiskOnChip产品进行仿真和NAND闪存的管理,包括纠错、坏块处理和损耗平衡。 在掌上电脑里要使用NAND FLASH 存储数据和程序,但是必须有NOR FLASH来启动。除了SAMSUNG处理器,其他用在掌上电脑的主流处理器还不支持直接由NAND FLASH 启动程序。因此,必须先用一片小的NOR FLASH 启动机器,在把OS等软件从NAND FLASH 载入SDRAM中运行才行。 9) 主要供应商 NOR FLASH的主要供应商是INTEL ,MICRO等厂商,曾经是FLASH的主流产品,但现在被NANDFLASH挤的比较难受。它的优点是可以直接从FLASH中运行程序,但是工艺复杂,价格比较贵。 NAND FLASH的主要供应商是SAMSUNG和东芝,在U盘、各种存储卡、MP3播放器里面的都是这种FLASH,由于工艺上的不同,它比NORFLASH拥有更大存储容量,而且便宜。但也有缺点,就是无法寻址直接运行程序,只能存储数据。另外NAND FLASH非常容易出现坏区,所以需要有校验的算法。

    时间:2021-03-23 关键词: Flash NAND FLASH存储

  • 3D芯片堆栈技术向数据中心抛媚眼

    3D芯片堆栈技术向数据中心抛媚眼

    运算密度跟不上因特网流量增加速度,数据中心分析之数据量的成长速度前所未有;要解决这个问题,需要更大的内存带宽,而这是3D芯片堆栈技术展现其承诺的一个领域。 被甲骨文(Oracle)取消的一个微处理器开发项目,在传统制程微缩速度减缓的同时,让人窥见未来高阶芯片设计的一隅;该Sparc CPU设计提案的目标是采用仍在开发的芯片堆栈技术,取得越来越难透过半导体制程技术取得的优势。 在上述概念背后的研究人员,是甲骨文在今年初被裁撤的硬件部门之一员;但他的点子化为一家顾问公司而存活了下来,并且已经开始与美国硅谷的半导体业者进行合作。 甲骨文前任资深首席工程师、创办了一家三人新创公司ProPrincipia的Don Draper表示:「我看得越深,越觉得这是一条可以走的路。 」 Draper指出:「运算密度跟不上因特网流量增加速度,数据中心分析之数据量的成长速度前所未有;要解决这个问题,需要更大的内存带宽,而这是3D芯片堆栈技术展现其承诺的一个领域。 」 在一场去年底举行的研讨会上,Draper展示了现有的Sparc处理器如何能重新设计成两颗尺寸较小、相互堆栈的裸晶;其中一颗只有处理器核心与高速缓存(caches),另一个则是以N-1或N-2制程节点制造,以一半数据速率运作,乘载串行器-解串行器(serdes)等周边,以及L4高速缓存与芯片上网络──可降低成本与功耗。 Draper表示,新架构芯片的核心数量与L3高速缓存也能增加近一倍,特别是如果堆栈技术采用新兴的微流体冷却(microfluidic-cooling)技术:「在相同的技术节点,可以将性能提升两倍。 」 一颗大型CPU能被重新设计成两颗成本较低的芯片,并取得在功耗、性能方面的优势 (来源:ProPrincipia) 高风险却适用机器学习的设计提案 Draper并指出,新兴的芯片堆栈技术是将一个主处理器与一个加速器绑在一起、以因应内存密集任务例如机器学习应用的理想方案;而相反的,若采用芯片对芯片互连例如CCIX与OpenCAPI:「就像在用吸管吸汽水。 」 此外Draper也建议在后缘的裸晶采用整合式稳压器(integrated voltage regulator,IVR);他估计,采用相对较小的磁性电感(magnetic inductors),该IVR能节省功率以及电路板站为面积,并将芯片的数据传输速率提升到150MHz。 尽管如此,Draper坦承,这个他在甲骨文提出的设计提案,也就是在最顶级的M系列处理器采用芯片堆栈技术,是非常高风险且巨大的承诺;举例来说:「如果在(芯片堆栈)实作过程中出了任何问题,最顶端的裸晶可能就会无法使用。 」 该芯片堆栈采用内存堆栈使用的硅穿孔(TSV)技术,该结构是规律的,但对于高密度、不规则的逻辑芯片来说会很棘手;TSV在厚度上也相对较高,在周遭也需要有保留区域。 Draper声称,芯片堆栈的散热问题大部分可以被解决;具备高导热性的铜接口能轻易地将热从温度较高的顶部裸晶,透过散热片或是风扇从对温度较低的底部裸晶排出。 Sparc T2处理器重新设计为两颗中型尺寸芯片,能将功耗降低17.3% (来源:Moongon Jung, Georgia Institute of Technology) Xperi (编按:原为Tessera)旗下的Invensas,在室温晶圆/裸晶堆栈技术方面是领导者;其技术也是新创公司ProPrincipia创办人Don Draper认为微处理器设计工程师将会用到的。 Invensas的DRAM堆栈可望在2019年量产,接着是处理器、ASIC、GPU与FPGA等各种组件。 Invensas总裁Craig Mitchell表示:「我们现在的目标是与客户沟通,取得他们的晶圆片,因为每个人的制程与硅穿孔(TSV)技术都有点不太一样。 」 另一个障碍是避免晶圆切割时产生的微小颗粒污染;他指出:「我们正在取得良好的进展,能展现4层的DRAM堆栈;另外我们正以3D DRAM为出发点,因为这是一个大规模的市场,而且如果你能在DRAM领域证实技术,将技术转移到任何地方就会容易许多。 」 Invensas是为Sony等厂商采以6~14微米间距的晶圆对晶圆技术接合氧化物,来堆栈CMOS影像传感器而立足市场;在明年某个时候,Invensas预期能迈向下一步,提供能封装一组MEMS传感器的制程技术。 接下来Invensas则将提供新开发的裸晶等级直接结合互连(die-level Direct Bond Interconnect,DBI),以链接传感器与逻辑芯片;该技术已经授权给具备一座大型MEMS晶圆代工厂的Teledyne Dalsa。 最终Invensas的目标是让DBI互连能小于1微米,好将大型芯片转换成相互堆栈的小芯片数组。 Draper展示了类DBI芯片堆栈的横切面 (来源:ProPrincipia) 也有其他厂商准备进军此一领域,以较低成本的2.5D芯片堆栈技术,将裸晶并排在相对尺寸较大、较昂贵的硅中介层(interposer)上。 例如台积电(TSMC)在不久前宣布,正在开发一个新版本的晶圆级扇出式封装技术,名为整合式扇出封装(InFO),目前应用于手机应用处理器。 此外台积电也将扩展其2.5D CoWos制程,可在约1,500 mm2面积的基板上放最多8颗的HBM2 DRAM。 Mitchell表示,扩展的InFO技术之40微米I/O焊垫与65mm2基板,不会与Invensas采用DBI技术的更大、更高密度芯片堆栈直接竞争。 但市场研究机构Yole Developpement封装技术分析师Emilie Jolivet表示,最近联发科(Mediatek)宣布,将在一款数据中心应用之芯片使用InFO,显示该技术正在伸展触角。 不过Mitchell表示,DBI与InFO式两种完全不同的技术,后者是一种封装技术、将精细节点的芯片链接到较大节点的印刷电路板链路,而DBI则是采用精细链接的芯片对芯片互连。 举例来说,苹果(Apple)的A10应用处理器采用InFO技术,将220微米间距的裸晶接口,转接至印刷电路板的350微米接口;相反的,DBI正被测试应用DRAM之间40微米的触点,可望在未来能堆栈到8层高。 至于英特尔(Intel),则是开发了EMIB (Embedded Multi-Die Interconnect Bridge)技术,一开始使用于大型FPGA链接外部的串行/解串器;Jolivet认为EMIB技术将改变市场局势,并扩大封装技术领域的战场。 而Mitcell则指出,EMIB也不会与DBI直接竞争,并质疑该技术能扩展到多大程度;他表示,DBI目前最大的竞争对手是热压接合(thermal compression)技术,但被限制在25微米以上的互连:「25微米看来是一道难以突破的障碍。 」 Yole Developpement表示,Apple在A10处理器采用的台积电InFO技术,可说是扇出式封装技术发展在去年的一个转折点;最近该机构有一篇报告指出,扇出封装的设备与材料可望取得40%的复合成长率。

    时间:2021-03-23 关键词: 处理器 堆栈 3D芯片

  • 基于AT89C51 单片机的节拍器

    基于AT89C51 单片机的节拍器

    1 硬件电路原理 节拍器以AT89C51 单片机为控制中心,由LED 显示模块、调节键盘模块、声音输出模块组成。图1 是节拍器的电路原理图。ATMEL 公司生产的AT89C51 单片机与MCS51指令系统兼容,40 脚结构,是系统的控制中心。显示模块由四位一体的共阳极蓝色LED 显示器构成,采用动态扫描显示方式, Q11~ Q14是LED 的位选择开关三极管, R6~ R13是数码管段发光二极管的限流电阻。四位一体的LED 数码管完成显示节拍数、各功能代码及参数值的功能。键盘调节模块由4 只按键构成,分别是功能选择键A、设置参数选择键B、参数增加键C和参数减少键D ,4 只按键可以完成各种功能的选择和各参数的设置。声音输出模块由以Q1、Q2、Q3和扬声器为中心的功率放大电路组成,不同频率的脉冲从单片机的P2.6口输出, 经R14限流和功率放大后,推动扬声器发出洪亮的声音。由于输出的音频信号是脉冲波,三极管工作在开关状态,损耗小发热量不大, Q2、Q3使用小功率管C8050和C8550 即可。整个系统硬件结构简单。由外部提供12 V直流电直接供音频功放模块使用,经LM7805 稳压成5 V 后供单片机及LED 显示用。 2 软件说明 软件系统采用模块化结构设计,分别是主程序模块、节拍器模块、键盘识别和参数设置模块等。其中每个模块又由若干个子模块构成。上电或复位后进入调节功能,重复按A键在调节功能、节拍器功能之间轮换。当进入调节功能后,重复按B 键可选中不同的调节对象,再按C 或D 键增加或减少调节对象的参数值,调节时显示调节对象的代码和参数值。 2.1 主程序模块 在主程序模块中完成存储单元的初始化、定时器计数器的初始化、中断初始化、标志位的初始化、扫描键盘,并根据功能选择键A 的值启动以下功能模块之一:参数设置功能、节拍器功能。 2.2 节拍器功能模块 节拍速度在24~400 拍/min 范围内可调,节拍误差小于2%,节拍数为1~9可调。显示器显示节拍数,扬声器发出节拍声,显示节拍数1 时发出600 Hz 的高频声0.1 s ,显示其他节拍数时发出300 Hz 的低频声0.1 s。该模块由节拍延时部分、节拍数显示部分、音频脉冲形成部分组成。节拍功能模块程序流程图如图2 所示。 2.3 参数调节模块 按A 键选择进入参数调节功能模块后,重复按B 键,可以依次选择节拍速度、节拍分度参数的设置,LED 显示器上显示参数类型代码和该参数的数字,按C 或B 键则在该参数的取值范围内循环增加或减少一个单位值。代码1 是节拍数,取值范围1~9。代码2 是节拍速度,取值范围是24~400拍/min。该模块程序由键盘扫描识别部分、参数显示部分、A键处理部分、B 键处理部分和C、D 键处理等子程序组成。 图2 节拍器模块流程图 3 实验 从显示、按键、声音和节拍精度等方面进行测试。 显示观察:处于节拍工作状态时4 个数码管同时循环显示节拍数,练琴时眼睛的余光就能看清节拍数。处于调节模式时,最高位显示待调节的参数代码,其余3 位显示参数值,当参数高位为零时不显示。显示正确。 按键测试:按下功能键A ,可以在参数调节和节拍模式之间转换。当处于参数调节模式时,按下参数更改键B ,可以在节拍数和节拍速度之间转换;按下增加键C 或减少键D ,参数值在当前值基础上增加或减少1 ,并且在参数的调节范围内循环变化。当处于节拍工作模式时,BCD 键不起作用。键盘工作正常。 声音观测:节拍音短促有力,起始拍与其余拍音调区别明显。在钢琴弹奏的环境中清晰可闻。 节拍精度测量:用秒表测量节拍器500 拍所用时间。节拍速度分别为72、112、144 拍/min 的时候, 用时分别为418.1 s、268.9 s、210.5 s ,误差分别为0.29%、0.35%、1.1%。节拍精度达到设计要求。 4 结束语 节拍器的起始拍的声音和其它拍的声音不同,听觉和视觉效果好,节拍精度高,调节方便。多名琴童使用该节拍器练钢琴均取得很好的效果。硬件成本低廉,不易损坏,可以将外形设计成工艺品。基于AT89C51 单片机的节拍器具有较好的应用价值。

    时间:2021-03-23 关键词: 单片机 节拍器 AT89C51

  • C8051F020中的ADC应用要素

    C8051F020中的ADC应用要素

    F020具有8路12位A/D转换(简称ADC)接口和8路8位在线可编程(ISP)的ADC电路,片上的特殊功能寄存器(简称SFR)有15个与ADC的控制相关,它们是: AMUX0SL——AMUX0通道选择寄存器,复位值为00000000; MAX0CF——AMUX0配置寄存器,复位值为00000000; ADC0CF——ADC0配置寄存器,复位值为11111000; ADC0CN——ADC0控制寄存器,复位值为00000000; ADC0H——ADC0数据字MSB寄存器,复位值为00000000; ADC0L——ADC0数据字LSB寄存器,复位值为00000000; ADC0GTH——ADC0下限数据高字节寄存器,复位值为11111111; ADC0GTL——ADC0下限数据低字节寄存器,复位值为11111111; ADC0LTH——ADC0上限数据高字节寄存器,复位值为00000000; ADC0LTL——ADC0上限数据低字节寄存器,复位值为00000000; AMX1SL——AMUX1通道选择寄存器,复位值为00000000; ADC1CN——ADC1控制寄存器,复位值为00000000; ADC1CF——ADC1配置寄存器,复位值为11111000; ADC1——ADC1数据字寄存器,复位值为00000000; REF0CN——基准电压控制寄存器,复位值为00000000。 ADC是混合信号控制器的重要功能,如欲在应用编程中得心应手,就必须对其相关的要素有较清晰的整体认识。 1 ADC的精度与通道 F020采用TQFP100封装,芯片引脚有8个(引脚18~25)专用于模拟输入,是8路12位ADC的输入端。每路12位的转换精度都是其自身的±1LSB(最低位)。实际上,对于12位逐次逼近寄存器型(SAR)ADC只有1个,在它与各输入端之间有1个具有9通道输入的多路选择开关(可配置模拟多路开关AMUX)。AMUX的第9通道连接温度传感器。在F020中,12位ADC称为ADC0,另有8路8位在系统可编程(ISP)的ADC电路称为ADC1。其8个外接引脚与P1口复用,片内结构与ADC0相近,只是转换的位数为8位,转换精度为8位的±1LSB。 ADC0端口的每一对均可用编程设置成为分别地单端输入或差分输入。差分输入时的端口配对为0-1、2-3、4-5、6-7,此设置由通道选择寄存器AMUX0SL的低4位和通道配置寄存器AMUX0CF的低4位确定。在AMX0CF中,位3~0各对应2个引脚通道。位值=0,表示是独立的单端输入(复位值均为单端输入);位值=1,表示是差分输入对。对应AMX0CF选差分输入时,AMUX0SL中只有在选双数(含0)通道时才有效(注:AMUX0SL低4位为1xxx时,不论AMX0CF低4位为何值,均选温度传感器)。 将REF0CN的位3置“1”时,允许使用温度传感器;置“0”时,温度传感器的输出为高阻态。温度传感器的值可用于修正参数的非线性或记录、调整与温度相关的数据。 2 ADC的速率与启动 C8051F系列单片机中ADC的速率都是可用编程设置的,但最少要用16个系统时钟。一般在转换之前还自动加上3个系统时钟的跟踪/保持捕获时间(>1.5μs)。设置F020内ADC速率的方法是通过配置寄存器ADCxCF(x为0或1)的位7~3来进行的,其复位值为11111(位7~3=SYSCLK/CLK SAR-1)。 一般在启动ADC之前都要处于跟踪方式,控制寄存器ADCxCN的位6如果为“0”,则一直处于跟踪方式(此时启动4种启动方式都可比跟踪启动快3个系统时钟);如为“1”,则有4种跟踪启动方式可选择,即对ADCxCN中的位3~2赋值:00为向ADBUSY写1时跟踪(软件命令);01为定时器3溢出跟踪;10为CNVSTR上升沿跟踪(外部信号);11为定时器2溢出跟踪。 复位时,ADCxCN的位7为0,处于关断状态。每次转换结束时,ADCxCN的位5为“1”,位4(忙标志)的下降沿触发结构中断,也可用软件查询这些状态位。 3 ADC的基准与增益 F020的片内有1个1.2V、15×10 -6/℃的带隙电压基准发生器和1个两倍增益的输出缓冲器。2.4V的基准电压(VREF)可通过外引脚分别接入ADC0、ADC1和DAC中。VREF对外带载能力为200μA(建议在驱动外部负载时,对地接1个负载电阻)。ADC使用偏置时,必须将参考源控制寄存器REFcCN中的位1置“1”;如果“0”,则关闭内部偏压,此时可通过VREF引脚(引脚12)使用外部基准电压,外部基准电压必须小于VAV±0.3V(还要大于1V)。不用ADC,也不用DAC时,可将REFxCN的位0置“0”,使缓冲放大器处于省电方式(输出为高阻态)。 设置REF0CN的位4为“0”时,ADC0用VREF偏置,为“1”时,用DAC0输出偏置;设置REF0CN的位3为“0”时,ADC1用VREF偏置,为“1”时,用AV+偏置。 在F020的ADC电路中,输入多路选择开关AMUX后面都带有1个可用编程设置增益的内部放大器(PGA)。当各模拟通道之间输入的电压信号范围差距较大时,或需要放大一个具有较大直流偏移的信号时(在差分输入方式,DAC可用于提供直流偏移)显得尤为有用。设置的方式是配置ADCxCF中的位2~0(000对应PGA的增益为1;001对应为2;010对应为4;011对应为8;10x对应为16、11x对应为0.5)。这里的增益对温度传感器信号也起作用。当增益为1时,VTEMP=0.002 86(V/℃)(TEMPC) ℃+0.776V。 4 ADC的数据与控制 对应单端输入,ADC结果数据字格式为:0V——0000,VREF——0FFF或FFF0。 对应差分输入,ADC结果数据字格式为2的补码:VREF——07FF,0——0000,-VREF——F800或8000。 将ADCxCN的位0置“0”可使结果右对齐;置“1”可使结果左对齐。当差分输入时,右对齐产生的多余高位是符号扩展位。 C8051F系列单片机内还设有数据相关窗口中断发生器或称可编程窗口检测器,也叫ADC上(下)限数据寄存器ADC0G(L)TH(L),用后台方式监视一个关键电压。当转换数据位于规定的窗口之内(或之外)时,向控制器申请转换结束中断。要求在窗口之内中断时,上限寄存器LT装入高位窗口数,下限寄存器GT装入低位窗口数;若要求在窗口之外中断时,则在下限寄存器GT中装入高位窗口数,在上限寄存器LT中装入下限窗口数。 复位时,ADC部分的状态为:内部电压基准缓冲器关闭、内部偏压关闭、内部传感器关闭、ADC禁止、转换结果数据寄存器右对齐、12位的端口均为单端输入、端口指向AIN0、SAR转换33个系统时钟、内部放大器增益为1、下限数据寄存器为FFFFH、上限数据寄存器为0000H。 综合F020中与ADC相关的各要素,要想正确应用ADC功能,应按下列顺序编程:设置参考电压>设置允许ADC>设置跟踪(启动)方式>设定数据对齐>配置通道>选择通道>设置转换时钟和增益>设定窗口检测上、下限>启动转换。操作SFR的顺序(以12位为例)为:REF0CH>ADC0CN>AMX0C>AMUX0SL>ADC0CF>ADC0GTH>ADC0GTL>ADC0LTH>ADC0LTL>ADC0CN或其它启动方式。

    时间:2021-03-23 关键词: ADC C8051F020 精度与通道

  • 基于ATmege128的多功能照明开关自动控制系统

    基于ATmege128的多功能照明开关自动控制系统

    一、项目概述 1.1 引言 能源短缺是21世纪国际面临的新问题。在寻找新的储备能源之外,节约能源,提高效益也就成为更加符合当下注重研究的课题。随着国民经济的快速发展和社会进步,教育在全社会愈加被关注和重视,校园规模也随着招生规模的扩大不断扩大,教室的数量也大幅度增加。但对目前的各类高校说,照明控制系统的使用还处于初级阶段,由于国家关于“创建节约型校园”政策的颁布,加之传统的手动关灯方式操作繁琐且存在着较大的人为浪费的弊端,在教学楼内使用新型的照明节能自动控制系统已成为大势所趋。 在本次大赛的调研阶段,我们还注意到,尽管市场上存在着形形色色的智能灯控设备,但或其设备体态太大,或其成本较高,仅仅局限在某些公共场合或厂家使用,严重限制了其使用的普适性和广泛性,照明节能自动控制设备技术在我们家庭生活中的应用几乎是一项空白。特别是在当今智能家居的理念深入人心,简约性环保性成为新的看点,用科技改变生活已成为人们执着追求的目标。 本系统是以Atmegal28单片机为控制器核心,通过其强大的微控功能,扩展了无线通信、传感和显示模块,实现对照明系统的自动控制,既在一定程度上杜绝了教室电力资源浪费现象的出现,又满足了日常生活中人们所倡导的简约便捷和自动控制,降低了运行维护的费用,节约了管理成本,有着巨大的生态、环境和经济效益。 1.2 项目背景/选题动机 当今的社会生活特别是众多高校中,现存的能源浪费、经费超支和学生视觉健康等问题已越发引起人们关注,高校教室照明的节电问题不得不提到重要的议事日程上来。加之当今人们对生活智能化简约化要求的提高,能否利用现有的资源设计一款自动控制且具有相对实用性照明系统,填补家庭生活自动照明技术的空白,改进现有照明设备存在的缺陷,是我们队伍本次参赛目的的重中之重。 在本次参赛调研准备阶段,我们特意对现今市面所广泛使用的人体红外感应开关电路做了研究分析。现有人体感应设备是利用人体红外热释感应技术,判断人的动作有无来控制灯的亮灭,其灵敏感应、抗干扰力确实值得称道。但我们都有这样的体会,当在教室中静坐一段时间,由于感应不到人体动作的变化,灯会自动熄灭,直到我们再给予相关的动作才会重新将灯置亮,这给我们的正常学习带来了极大的不便;而且,由于系统中的延时设置,当教室中人都走光之后,所有的灯仍会亮一段时间,如果我们能将这段时间内不必要的电力资源耗费节省下来,日积月累,对任何一个高校众多的教室而言,绝对是一笔不小的开支。我们认为以上两点,是现有设备没有考虑也无法克服的性能漏洞。更显然的是,这样的设备根本不适合应用在我们日常家庭生活当中,设想如果我们在房间中休息,灯自动熄灭,将会给人们带来多大的不方便与不习惯。 鉴于以上功能与需求的分析,我们决定利用Atmegal28 单片机以及外围设备,通过对人体进出房间的计数,判断房间内人的有无来控制灯的亮灭,既克服了需要不断动作的弊端,减少了不必要的延时所造成的资源浪费,又能自动控制,很好的应用于学校工厂及家庭日常生活当中去,具有较好的应用前景,这是我们选择此项目的直接背景和根本动机。 二、需求分析 2.1 功能要求 本系统主要采用光感应传感器和红外光感应计数器共同设卡来控制室内的照明设备的亮与灭,当室内光线暗到一定程度以及计数装置计算结果为≥1(即室内有人)时,条件满足,单片机控制系统会自动动作打开照明设备的开关,当条件不满足时,控制系统也会动作立即关闭开关。 由于设计伊始,我们小组主要把该设备的应用场合应用定位于学校或工厂等大型公共场合。首先假如以我们大学教室照明为应用对象,我们还加了一些可选功能。比如说,据我们调查了解,像我们学校这样的普通教室一般会有六排左右灯,但当只有少部分人(具体数目因情况而定)进去的时候我们只要求靠前的三排灯亮,但是如果这少部分人有特殊情况非要把所有的灯都打开,我们专门在键盘上设置了一个按键功能,此按键动作就会把剩余未打开的三排的灯强制打开。 但是由于节能观念的普适性,我们的这个装置也可以装在普通家庭照明系统中,鉴于此我们又给该装置加了一个遥控器装置,用户可以用遥控器通过无线装置远距离操作强制打开和关闭照明设备。 为了丰富该装置的功能,我们还给该控制系统加了一个显示屏和一个键盘模块。由单片机驱动在显示屏上显示当前时间、当前温度、当前计数值。键盘用来调节相应参数,比如当系统由于发生不可避免故障时,计数器会发生错误,此时就用键盘重新输入值更正一下,同时键盘还可以用于调节时间,还有之前介绍的功能键也是其中的一部分。 图1 系统架构 2.2 性能要求 ①光感应灵敏,响应速度快(2us左右),工作温度范围宽(-25℃~+70℃)。 ②计数准确。 ③测温精确度高,精度为±0.5°C;适应电压范围更宽,电压范围:3.0~5.5V. ④使用PT2262射频无线通信芯片,在室内可用通信距离为几十米,无线遥控距离遍及了一般的教室(或工厂)空间。 本系统有两个要求相对要严谨一点的模块。首先是计数模块,因为我们使用的是对射式计数方式也就是一旦遮住光线,红外感应器就会发出一个计数脉冲。但是,当人员相对比较密集的时候,也就是说当门足够宽时,出现两个人并排或者是错开但仍连续遮掩光线时,这时计数器只记一个数,这样就会出现错误。所以,我们所设计的装置只适应于那种门不会太宽以至于不会出现多人连续遮掩光线,使计数值不准的场合。就我们对我们学校的观察以及测量发现,就一般的学校教室几乎不会出现上述情况,所以本装置安装在教室内计数上几乎不会产生错误。 其次是无线遥控模块(该模块主要用于家庭照明系统或工厂中),该模块传输距离有限,一般在几十米,但当用户在较远距离遥控时可能会出现失灵的情况。 三、方案设计 3.1 系统功能实现原理 本系统主要包含以下几个模块: ①计数模块 ②光感应模块 ③显示模块 ④测温模块 ⑤键盘模块 ⑥无线遥控模块 1、计数模块 计数模块我们采用红外线感应计数器,该种计数器大体分为两种,其中一种是对射式,另一种是反射式。对射式是利用一个发射头一个接收头,中间如果有物体通过就遮挡一下光线,输出一个脉冲给计数器,计数一次;反射式是发射头和接收头做在一块成为一个红外探头,当红外探头前有物体出现就把发射头的红外线反射给接收头,探头输出一个计数脉冲给计数器,计数一次。由于对我们这个系统的应用场合对射式要比反射式计数方面要准确些,所以采用对射式。我们把红外线感应计数器的脉冲输出端直接连接在单片机的I/O口上进行计数处理,计数结果同时要在液晶屏显示器上显示一下。 红外感应器与单片机连接示意图 2.光感应模块 光感应模块我们首选的是欧恩光电技术研究所 2006 年研发的专利项目--ON9658光感应传感器。该产品采用的是CMOS工艺内置了稳压、OP 放大、红外差分等近10000门电路,还有暗电流小,低照度灵敏等等优点,在实际应用中,只需加一个下拉电阻即可。此产品适合电视机、LCD背光、数码产品、仪器仪表、工业设备等诸多领域的节能控制、自动感光、自适应控制等,同时可定位为环保产品,替代传统光敏电阻、光敏二极管、光敏三极管,符合本次大赛环保的理念。 实现原理:当光照射到光敏三极管上,光敏三极管的阻值急剧减小,利用光敏三极管On9658作为传感器串联一个7.5K的电阻,通过光敏三极管电压的变化反映因光源的照射强度在光敏三极管上的变化。把检测的电压信号通过电压跟随器电路输入Atmega128型单片机。该电路结构简单,灵敏度高且检测电压信号稳定,效果明显。 采样信号运放电路,增强信号的强度,通过电压跟随器可以增加信号电压的稳定性,后级接电压跟随器增强了电路带负载能力。 3.显示模块 设计中LCD主要作用:本次设计LCD主要作用于显示当前室内人数以及对系统操作时的操作菜单,通过显示器实现方便直观人机对话界面。 LCD显示原理:本设计采用以ST7920为驱动芯片的LCD12864字符液晶显示器。ST7920通过RS、R/W 和E的时序配合,通过DB0-DB7八位数据端口对其内部数据寄存器DR和指令寄存器IR的读写操作,通过对数据寄存器DR 的访问,可以存取DDRAM、CGRAM、CGROM 和IRAM 的值。将要显示的字型码写入到DDRAM上,ST7920将自动地按照编码从CGROM 中将要显示的字型显示到屏幕上。 LCD初始化流程: LCD显示内容: 时间设置 人数更改设置 4.测温模块 测温模块我们首选的是DS18B20,因为该模块我们之前使用过,不仅使用方便,而且在性能上也有不错的效果。

    时间:2021-03-22 关键词: ATmege128 多功能照明 开关自动控制系统

  • 基于Atmegal6单片机的通用电机控制装置的设计

    基于Atmegal6单片机的通用电机控制装置的设计

    0 引言 电机的驱动与控制是现代电子技术中一个重要的研究课题,不同种类的电动机需要有不同的控制和驱动方法。使用高性能单片机作为电机控制驱动装置的核心,可以有效降低电机驱动器的成本,扩展应用范围,提高使用灵活性。 ATmegal6单片机是ATMEL公司的一款高性能8位AVR单片机,它内部带有功能强大的可编程定时和计数单元,通过编程可以很容易地产生各类交、直流电机以及步进电机的驱动波形,因此,利用这类功能强大的单片机作为电机控制器的核心,可以使控制器应用更加灵活、应用范围更广、维护成本更低。本文设计出的电机通用控制装置功能齐全,其液晶显示装置和按键可以控制并显示电机的运行状态,而数字化的温度传感器则能有效准确地监控电机的运行温度,RS485/232总线通信接口可以将多个控制器进行联网。从而实现电机的智能化远程控制。 1 电机控制及驱动电路设计 图l所示是一种通用电机控制装置系统的总体结构图。其整个单片机系统以ATmegal6单片机为控制核心,其中从单片机和主单片机利用I2C总线进行通信。从单片机连接按键和液晶屏,可以实现人机接口的功能,这样即可以为主单片机节约宝贵的I/O资源,又可以提高系统的运行效率。另外,DSl8820采用单总线结构采集温度,可以实现对电机温度的监控。 1.1 ATmegal6主控电路 ATmegal6单片机具有3个PWM功能的定时器/计数器T/C0、T/Cl和T/C2,其中T/C0和T/C2是两个8位的定时器/计数器,而T/Cl是16位具有输入捕获功能的定时器/计数器。 本系统的主控单片机电路如图2所示。它以megal6单片机为核心,配有外围复位电路和振荡器电路,单片机所有I/0都可独立引出,以便与外部电路的连接和扩展。 1.2 电机温度监测电路 电机的表面温度是衡量电机是否在安全状态下工作的一个重要指标。本系统的电机温度监测电路利用美国DALLAS半导体公司推出的单总线数字化测温集成电路DSl8820来实现。该数字化传感器具有很宽的测温范围(-55℃~+125℃),工作时只需要三根引线,而且多只DSl8820可以并行连接,以实现对多个电动机的温度监控。 系统工作时,DSl8820可把测得的温度数据传给单片机。如果超过用户设定,系统还可执行电机保护和报警等程序。电机温度监测系统的结构如图3所示,图4所示是其温度监控电路。 1.3 键盘及LCD接口电路 本系统的按键和LCD接口控制电路以单片机AT89S51为核心,该电路使用I2C总线与主单片机进行通信。利用这种主从单片机分离的设计可将一些大量占用IO端口资源的低速设备进行集中管理,从而为主单片机节约硬件资源和程序开销,提高系统的使用灵活性和运行效率。其LCD显示和键盘处理电路如图5所示。 1.4 RS-232/485通信电路 为了适应电机控制的网络化、智能化需求,本电机控制器带有RS232/RS485数据接口。用户利用这两种总线接口可以方便地将多个电机控制器连接成网,以方便电机系统的集中化管理。RS485接口电路使用收发控制的“透明化”管理,MAX485芯片的收发切换由NE555组成的单稳态电路自动完成,当单片机需要向RS485总线传输数据时,NE555可自动将MAX485切换至发送状态,数据传送完毕后,MAX485又将恢复至接收状态。RS-232/485总线驱动电路如图6所示。 1.5 电机驱动电路 本控制器的驱动部分使用凌阳SPGT62C19B电机驱动芯片来实现对直流电机和步进电机的驱动。SPGT62C19B是低电压单片式步进电机驱动 器集成电路芯片,其输出电压可达40 V,输出电流可达750mA。设计时,可由输入的逻辑电平来决定输出脉冲的宽度及频率。由该芯片组成的电机驱动系统将脉冲发生器、脉冲分配器、脉冲放大器合为一体,故可省去很多外围器件。与其它部件一样,主控电路也被设计成为一个独立的模块.以方便更换,而且该模块还可用于别的场合。其电机驱动电路图如图7所示。 1.6 转速测量电路 转速测量可采用一组鼠标上用的红外对管来实现,其电路原理如图8所示。当红外发射管与红外接收管之间被直流电机光栅转盘的不透明部分遮挡时,红外接收管处于截止状态,此时图中的SPEED输出高电平。反之,当光栅转盘的通光槽转至红外对管之间时,红外接收管处于导通状态,此时SPEED输出低电平。这样,将SPEED连接到单片机的I/O口,即可通过定时计数的方法计算出电机的转动速度。 2 单片机程序设计 2.1 主程序 本驱动器的程序设计使用模块化编程思想,其主程序用于完成对各子程序的调用。系统工作后,首先调用初始化子程序,以完成具有复用功能的I/0脚的选择和设置、各种中断功能的选择及其设置、AT89S51和ATmegal6的初始化、中断屏蔽寄存器的设置、中断寄存器的清零、系统变量的初始化等,最后完成开中断。初始化完成之后,系统将调用驱动程序,并完成系统的起动。系统起动之后,即进入正常运行状态。系统的全部运行过程均可由键盘进行实时控制和调节。 2.2 初始化程序 系统的初始化程序流程图如图9所示。该程序中包括LCD显示器、键盘等人机接口部分的初始化。主要功能是对具有复用功能引脚的选择和设置,以及各种中断功能的选择及设置(如外部键盘的中断选择等),同时包括AT89S5l的初始化、键盘的方式选择、工作时间的确定、显示方式的设定等。而系统变量的初始化包括温度的设定,转速初值的设定等。 2.3 控制程序 系统起动后即进入控制程序。控制程序是系统程序的主要部分,主要用来保证系统在给定的转速下正常运行,该程序主要调节单片机PWM口的占空比,从而调节电机绕组两端的平均电压,达到调速的目的,其控制程序流程如图10所示。 3 结束语 本设计实现了一种以ATmega16单片机为核心的电机控制装置。该装置具有各类电机驱动脉冲的输出、电机温度监测与保护、人机操作界面和长距离工业总线通信等功能。利用AVR单片机具备的软硬件特点,可实现对多种电机的驱动与控制,以用于电机驱动研究、网络化电机集中控制等领域。由于该控制器采用主从单片机设计,系统的运行得以很好地分工,其中从单片机实现低速人际交互,主单片机则实现高速的电机驱动与控制,主从单片机各司其职,故可使系统的运行效率达到最高。本电机控制装置的架构开放,使用灵活,可以很好地应用于直流电机的调速控制,交流电机的变频驱动,步进电机的步距细分等多种电机驱动和控制领域。

    时间:2021-03-22 关键词: 单片机 Atmegal6 通用电机控制装置

  • pic16f877单片机TMR1的使用笔记

    pic16f877单片机TMR1的使用笔记

    一、结构 1、TMR1可以作为通用的定时器和计数器,也可以利用内置的低频时基振荡器实现实时时钟RTC功能;通过TMR1与CCP模块的配合使用,TMR1还可以实现输入捕捉和输出比较功能。 TMR1是一个16位的可读可写的计数寄存器,由高低两字节组成(TMR1H和TMR1L)16位寄存器从0000H到FFFFH加1计数,然后回到0000H。在从FFFFH到0000H的过程中,置位中断标志位TMR1。 TMR1带有一个3位的可编程预分频器和一个低功耗低频时基振荡器。 二、特点 1、由16位的时钟信号上升沿触发的累加计数寄存器对 TMR1H,TMR1L; 2、TMR1H和TMR1L是在RAM中统一编址的寄存器对,地址为0EH和0FH,可用软件的方式读/写TMR1寄存器对的内容; 3、一个可选用的3位可编程的预分频器; 4、累加计数的信号源可以选择内部系统时钟、外部触发信号或自带时基振荡器信号; 5、既可工作于定时器模式,又可以工作于计数器模式,还可以用作实时时钟RTC; 6、在计数溢出时,相应的溢出中断标志自动置位,并可产生溢出中断。 三、相关寄存器 1、中断控制寄存器 INTCON 2、第一外设中断标志寄存器 PIR1 3、第一外设中断使能寄存器 PIE1 4、计数寄存器 TMR1H和TMR1L 5、控制寄存器 T1CON 四、工作方式 TMR1两种工作方式:定时器方式和计数器方式,其中计数器方式又分为同步计数器方式和异步计数器方式。 TMR1的时钟信号或者触发信号共有3种获取方式: 1、有内部系统时钟4分频后获取,即取自指令周期 2、从RC0/T1OSO/T1CKI和RC1/T1OSI/CCP2引脚获取 3、振荡器产生 五、使用定时器TMR1注意事项 1、当对寄存器TMR1H和TMR1L进行初始化时,预分频器将会自动清零 2、在寄存器对TMR1H和TMR1L进行写操作时,可以使预分频器清零。当TMR1处于运行状态时,对于寄存器TMR1H和TMR 1L值进行的写操作,可能会写入不希望的值 3、TMR1工作于异步计数器方式时,不能作为CCP模块的输入捕捉或输出比较的时间基准。 4、在上电复位(POR)或者其他复位时,TMR1H和TMR1L的内容保持原有数值,不会复位到0000H 5、在上电复位或掉电复位时,控制寄存器T1CON的内容将回到00H,并关闭TMR1,且预分频器的分频比设定为缺省值 1:1。在所有的其他复位时,均不会影响T1CON寄存器的值。 6、如果在复位时需要将TMR1H和TMR1L的内容回到00H,可以用程序实现,即先将TMR1关闭,然后分别将寄存器TMR1H和TMR1L清零 六、使用方式 1 void main() 2 { 3 unsigned int num; 4 /* 5 预分频器1:256,赋值61 256-61=195 6 */ 7 INTCON = 0xc0;//开总中断,开第一外设中断 8 PIE1 = 0x01;//使能定时器1中断 9 //赋值 50ms 10 TMR1H = (65536-50000)/256; 11 TMR1L = (65536-50000)%256; 12 T1CON = 0x01;//启动定时器,不使用预分频器 13 14 while(1) 15 { 16 if(20 == num) 17 { 18 num = 0;//计数清零 19 //功能1 20 { 21 22 } 23 } 24 } 25 } 26 27 void interrupt timer1() //中断函数不需要调用 28 { 29 //注意进入中断T0IF已经置1 30 TMR1IF = 0//标志位清零 31 //重新赋值 32 TMR1H = (65536-50000)/256; 33 TMR1L = (65536-50000)%256; 34 num++; 35 } 使用预分频器 1 void main() 2 { 3 unsigned int num; 4 /* 5 预分频器1:8 6 */ 7 INTCON = 0xc0;//开总中断,开第一外设中断 8 PIE1 = 0x01;//使能定时器1中断 9 //赋值 50ms 10 TMR1H = (65536-50000)/256; 11 TMR1L = (65536-50000)%256; 12 T1CON = 0x31;//启动定时器,预分频器1:8 13 14 while(1) 15 { 16 if(20 == num)//8s 17 { 18 num = 0;//计数清零 19 //功能1 20 { 21 22 } 23 } 24 } 25 } 26 27 void interrupt timer1() //中断函数不需要调用 28 { 29 //注意进入中断T0IF已经置1 30 TMR1IF = 0//标志位清零 31 //重新赋值 32 TMR1H = (65536-50000)/256; 33 TMR1L = (65536-50000)%256; 34 num++; 35 }

    时间:2021-03-22 关键词: 单片机 pic16f877 TMR1

  • 采用PIC16C621A单片机和线圈实现八细分步进电机驱动器的设计

    采用PIC16C621A单片机和线圈实现八细分步进电机驱动器的设计

    引言 步进电机广泛应用于对要求比较高的运动控制系统中,如机器人、打印机、软盘驱动器、绘图仪、机械阀门控制器等。目前,对步进电机的控制主要有由分散器件组成的环形脉冲分配器、软件环形脉冲分配器、专用集成芯片环形脉冲分配器等。分散器件组成的环形脉冲分配器体积比较大,同时由于分散器件的延时,其可靠性大大降低;软件环形分配器要占用主机的运行时间,降低了速度;专用集成芯片环形脉冲分配器集成度高、可靠性好,但其适应性受到限制,同时开发周期长、需求费用较高。 步进电机控制 步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。步进电机可分为反应式步进电机(VR)、永磁式步进电机(PM)和混合式步进电机(HB)。 步进电机区别于其他控制电机的特点是,它是通过输入脉冲信号来进行控制的,即电机的总转动角度由输入脉冲数决定,而电机的转速由脉冲信号频率决定。步进电机的驱动电路根据控制信号工作,控制信号由单片机产生。其基本控制如下: 控制换相顺序—通电换相这一过程称为脉冲分配。例如:混合式步进电机的工作方式,其各相通电顺序为A-B-C-D,通电控制脉冲必须严格按照这一顺序分别控制A,B,C,D相的通断,这就是所谓脉冲环形分配器。 控制步进电机的转向—如果给定工作方式正序换相通电,步进电机正转,如果按反序通电换相,则电机就反转。 控制步进电机的速度—如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步。两个脉冲的间隔越短,步进电机就转得越快。 硬件设计 通常步进电机的脉冲控制是由逻辑电路或专用芯片实现的脉冲环形分配的,因A3955不自带环形分配功能,本设计采用两片A3955驱动步进电机的两个线圈,来实现脉冲环形分配的实现。 本设计采用脉冲加方向的步进电机控制方式,应用于驱动二相或四相混合式步进电机。电机的出线方式不同,与驱动器的连接也不同,一般有以下几种方式: 对于二相四根线电机,可以直接和驱动器相连(见图1); 对于四相六根线电机,中间抽头的二根线悬空不接,其它四根线和驱动器相连(见图1)。 具体硬件如图2,CLK 为外部脉冲输入端,DIR为外部方向输入端,步进脉冲信号CLK用于控制步进电机的位置和速度,本驱动器的设计为CLK信号为上升沿有效,要求CLK信号的驱动电流为8-15mA,对CLK的脉冲宽度也有一定的要求,一般不小于5mS。方向电平信号DIR用于控制步进电机的旋转方向。此端为高电平时,电机逆时针方向转,此端为低电平时,电机为顺时针方向转。CLK和DIR信号默认幅值为5V,如果不是5V则须外部另加限流电阻R,如信号幅度为12V时,加680W的电阻。MS0,MS1,MS2 为细分输入端,多为8细分(见表1)。 软件设计 为了防止程序进入到非程序区,在非程序区设置拦截措施,使程序进入陷阱,然后强迫程序回到初始状态,从而保护程序的正常运行。程序设计首先判断细分数,其次判断方向信号DIR,判断脉冲信号CLK,当没有脉冲信号时,程序进入休眠状态,随时准备接收中断来的信号,进入程序区,根据判断的细分数和方向信号进行电机的驱动。代码如下: 结语 采用此设计的八细分步进电机驱动器,在驱动二相或四相混合式步进电机时运动平稳,速度快,噪音低,控制精高,而且专用芯片细分数可选。在外观采用铝镁合金,散热性好,价格低廉,可广泛应用于需要驱动电流小于1.5A的混合式两相或四相步进电机的系统中。

    时间:2021-03-22 关键词: 单片机 线圈 步进电机驱动器 PIC16C621A

  • 基于PIC16C63单片微机和模糊控制器实现新型电机调速系统

    基于PIC16C63单片微机和模糊控制器实现新型电机调速系统

    传统PID控制的电机调速系统技术成熟,结构简单,较稳定可靠,应用较为广泛,但也存在一些缺点,例如无法有效地克服传动对象和负载参数的大范围变化以及非线性因素对系统造成的影响,因而不能满足高性能和高的要求。随着模糊控制技术的成熟,应用越来越广泛,人们也开始将它应用于电机调速中。使用模糊控制技术后,能充分利用其非线性结构自寻优等各种功能,从而显著提高系统的鲁棒性(robustness)。此外,由于不需要建立被控对象的数学模型,系统的设计也变得较为简便。本文研究的这种新型电机调速系统,用模糊控制器替代传统的PID调节器,能明显改善系统的稳态和动态性能,有较好的控制效果。 系统硬件结构 系统硬件结构如图1所示。系统主要由单片微机PIC16C63、显示器、整流电路、直流变换、斩波电路、转速检测电路、直流无刷电动机(额定电压48V,额定转速2000r/min)等组成。 设置CCP1模块工作于PWM方式。把脉宽值置入CCPR1L寄存器和CCP1CON5:4》,RC2/CCP1引脚可输出高达10位的脉宽调制波形。当每次将CCPR1L中的数据再载入CCPR1H时,RC2/CCP1输出高电平;当定时/计数器TMR2的计数值等于CCPR1H的值时,RC2/CCP1输出低电平,产生脉宽。TMR2继续递增,直至计数值等于周期寄存器PR2的值,此时RC2/CCP1输出高电平,产生PWM周期,同时使CCPR1L再载入CCPR1H,如此周期循环,产生PWM信号。PWM输出周期和脉宽的计算公式如下: PWM周期=[(PR2)+1]*4TOSC*(TMR2预分频值) PWM脉宽=(DC1)*4TOSC*(TMR2预分频值) 式中的DC1的值由8位的CCPR1L和CCP1CON5:4》2位组成。由此若PWM周期确定后,要获得不同占空比的PWM信号,只要改变DC1的值即可。 系统的基本工作原理为:转速由霍尔位置传感器检测,测得的实际转速与给定速度进行比较,将输入变量模糊化(fuzzification)后进行模糊推理,产生相应的PWM信号从RC2/CCP1引脚输出。图1中,当RC2/CCP1输出低电平时,六只MOSFET仍受RA口控制进行电动机的正常换相;当RC2/CCP1输出高电平时,下半部的三只MOSFET被封死。因此,只需对RC2/CCP1的输出进行PWM控制,就可以控制直流无刷电动机的转速。整流电路的输出除提供给直流电动机电源外,还通过DC-DC变换器获得5V电源提供给单片机。系统设置一个2位的DIP开关,用于选择给定转速,有四个不同的给定转速供选择,以满足不同运行状态和不同额定转速的电动机;按键K1用于显示给定转速,按下则显示给定转速,否则显示实时转速。4个LED显示器组成了显示电路。 模糊控制器 模糊控制方法 模糊控制器结构如图2所示,是一个参数自调整的模糊控制系统,其输入变量是转速偏差e和转速偏差变化率Δe,输出变量是PWM脉宽调制信号占空比δ的增量Δδ。在进行输入变量模糊化时,转速偏差e在其论域(full set)上定义3个模糊集隶属度函数,相应的语言变量为负(N)、零(Z)和正(P),其隶属度函数分布如图3(a)所示。转速偏差变化率Δe在其论域上定义6个模糊集隶属度函数,相应的语言变量为负大(NB)、负小(NS)、负零(NZ)、正零(PZ)、正小(PS)和正大(PB),其隶属度函数分布如图3(b)所示。转速偏差e的模糊集只简单的划分为3个,而转速偏差变化率的模糊集却划分为6个,一方面是考虑模糊控制器的结构优化问题[3],优化后的模糊控制系统只有18条模糊规则;另一方面是满足控制的要求,根据直流电动机的运行特点,在控制时为了达到控制的要求,有时更注重转速偏差变化率。采用这样的结构可使系统在转速偏差变化率比较小时获得精细调节。输出量PWM占空比增量Δδ的模糊化,要充分考虑到电动机转速响应的暂态和稳态指标的协调。为了使转速偏差较大时电机能快速响应,而在转速偏差较小时又不至于产生较大的超调量,输出变量Δδ的模糊化采取两种方案,一种方案的模糊化定义5个模糊集,相应语言变量为负大(NB)、负小(NS)、零(Z)、正小(PS)和正大(PB),其隶属度函数分布如图4(a)所示;另一种方案的隶属度函数采用单线形。两种方案由模糊控制器根据转速偏差量的大小进行自动切换。解模糊化(defuzzification)采用加权平均的重心法。 参数自调整原则 图2所示的参数自调整模糊控制器可以提高模糊控制系统的动、稳态性能。量化因子Ke和Kec及比例因子Ku对模糊系统的稳态特性和动态特性均有较大的影响。一般来说,Ke和Kec越大,系统的控制越高,但大偏差范围分辩率相应提高,可能导致系统超调,调节时间增加,动态特性变差。增大Ku可以提高系统的控制和响应速度,减少Ku能减少超调,提高系统稳定度。因此,参数自调整的一般原则为:当偏差或偏差变化率较大时,Ke和Kec取较小值,Ku取较大值,这样可以保证系统的快速性和稳定性;当偏差或偏差变化率较小时,Ke和Kec取较大值,Ku减小,这样可以避免产生超调,并使系统尽快进入稳态范围。 控制软件 控制系统软件的主程序流程图如图5所示 。模糊控制器的初始化实际上是取出以表格形式存放在程序存储器的模糊控制规则,以初始的比例因子进行模糊判决后,将得出的控制数值以表格形式存放在RAM中,使用时可通过一个查表子程序直接提取,以满足实时控制系统的快速要求。若运行中比例因子自调整,只需要做简单的计算可获得新值;同时,还可以在不改变程序的情况下,将控制系统应用于不同参数的直流电动机。 实验 取直流电动机系统的模型为: 式中,K为放大系数,Tm为机电时间常数,Tu为小时间常数之和。 采用MATLAB进行仿真实验,具体仿真方法见文献[4]。仿真时所有的变量进行了归一化,仿真结果如图5所示。图5(a)和图5(b)为Tm=0.4和Tu=0.02时模糊参数自调整和参数固定的两种仿真结果,图5(c)为系统参数变化为Tm=0.5和Tu=0.02时模糊参数自调整的仿真结果。由仿真结果可知,该模糊参数自调整直流电动机控制系统具有调节速度快、动态性能好、超调小、控制较高的特点;同时,在系统参数发生较大变化时系统的动、稳态特性变化不大,说明具有良好的鲁棒性。 实验室试运行也表明该控制系统具有良好的控制性能。 结语 将高性能、高集成度并提供PWM信号的单片微处理器PIC16C63应用于中小功率的直流无刷电机调速系统,具有系统结构简单、成本低廉和高可靠性等优点,在结合采用参数自调整的模糊控制技术,使系统具有较高控制、良好的动态特性和鲁棒性,使设计也变得较为简单。该系统直接使用220V市电,其调速方案稍加改进和工艺化,便可以在许多现代化家用电器中广泛应用;如果将电机换成交流驱动的通用电机,并配以双向可控硅控制电路,则该方案的应用前景将更为广阔。

    时间:2021-03-22 关键词: 模糊控制器 PIC16C63 单片微机 电机调速系统的设计

  • 基于PIC16F877A单片机和SCA60C芯片实现帆船姿态仪的设计

    基于PIC16F877A单片机和SCA60C芯片实现帆船姿态仪的设计

    帆船运动越来越受到人们的重视,如何利用现代科技手段辅助训练,来提高比赛成绩显得尤为重要。从赛场实时采集数据指导训练和减轻帆船教练工作强度方面考虑,设计帆船姿态仪,可使教练员了解每位运动员具体的训练细节,提高工作效率。 1、帆船姿态仪的系统设计 基于PIC16F877A设计的帆船姿态仪,能采集帆船行驶过程中的前后仰俯角、左右摇摆角、桅杆旋转角和GPS系统记录帆船行驶轨迹。系统每0.5s将采集到的数据记录1次,记录时间大约为5 h(小时)。上位机通过RS232接口,可将存储的数据读取上来。上位机可以形象地将帆船行驶轨迹、帆船前后仰俯角、左右摇摆角等数据显示出来。它的系统结构框图如图1所示。 2、帆船姿态仪的硬件设计 PIC16F877A单片机作为处理器,通过采集倾角传感器SCA60C检测帆船的倾斜角度,然后将检测到的数据存储到AT45D081A-RI大容量Flash存储器中。其部分硬件电路如图2所示。 DS1302时钟芯片记录测控系统中的数据,并在记录时进行时间标定。其软硬件设计简单,时间记录准确,既避免了连续记录的大工作量,又避免了定时记录的盲目性。DS1302与CPU的连接仅需要3条线,即SCLK、I/O、RST。DS1302与单片机连接的电路原理如图2所示。 采用双电源供电方式,以便在没有主电源的情况下仍能保存时间信息以及数据。DS1302由VCC1或VCC2两者中的较大者供电,当VCC2小于VCC1时,VCC1给DS1302供电。 AT45D081A-RI是Atmel公司生产的大容量Flash存储器,容量为4 Mb。它采用串行方式传送数据,单5V电源供电;具有功耗低、体积小、容量大、传送快,与CMOS和TTL电平兼容以及掉电后数据不丢失等特点,因此,其硬件设计与软件编程都很容易。 系统通过RS232C通信方式与上位机通信,将帆船在海中行进的姿态传送到上位机,由上位机软件管理和显示。 3、倾角传感器的选取 系统采用上海朗尚科贸有限公司的SCA60C高倾角传感器检测帆船的倾斜角度,通过不同的安装方式检测帆船前后仰俯角和左右摇摆角。SCA60C实际上是一个加速度计,内部由一个硅微传感器和信号处理芯片组成;SMD形式封装;通过测量地球引力在测量方向上的分量,再将其转换为倾斜角度,其模拟输出特性如图3所示。箭头标明了加速度的正方向,如果帆船沿箭头所指方向有加速度,或按图3所示的方向倾斜,则输出值增大。 其中,Offset是帆船在0 g位置时的电压输出(一般输出值为2.5 V),Sensitivity是设备的灵敏度(通常灵敏度为2 V/g)。为得到的度,应当用实际输出值代替通常值。 4 、上位机软件设计 采用Delphi软件设计帆船姿态仪的上位机,将帆船姿态仪采集存储的数据通过串口读取上来,利用上位机软件对读取上来的数据进行管理,并以曲线的形式形象地显示出来,教练员可以在上位机上了解运动员训练的具体情况。软件界面如图4所示。 5、结 语 帆船姿态仪安装调试简单,技术先进,功能丰富,维护方便,可帮助帆船运动员进行科学的训练

    时间:2021-03-22 关键词: 单片机 PIC16F877A SCA60C 帆船姿态仪

  • PIC16F887 MPLAB IDE 多个工程的建立 多机仿真

    PIC16F887 MPLAB IDE 多个工程的建立 多机仿真

    现在你应该知道我们写的c语言程序,需要借助于编译器编译成机器能够看懂的机器文件,也就是hex文件。同时你也应该知道这个hex文件所处的文件目录在哪里。那么接下来你就可以看下面的内容: 1、 假如我们在仿真图里面有4块单片机,那么每一块单片机所需要用到的程序都不一样,每一个程序文件都是一个工程所产生出来的,所以我们需要新建4个工程。当然,如果你所做的实验在仿真图里面只需要三块单片机或者只需要两块单片机,那你就需要建立对应的工程个数。 在下面的步骤中,我假设我正在做一个题目,题目需要用到两块单片机,我需要新建两个工程文件出来,下面的步骤会展示具体的操作。 2、 首先我们需要在桌面上新建一个文件夹。必须是英文。 3、 然后我们打开MPLAB,在下图里面这种情况下,也就是软件里面有了别的工程,看起来不好看,建议直接删除它。怎么删除呢?鼠标右键点击下图中的这个工程名字,然后按键盘上的delete按键, 你会看到这个页面,这个页面正在告知你你想要把它移除吗,点击yes就可以,这个操作直接把工程从IDE中移除,但是并没有把工程文件从你的磁盘储存上删除,你依旧能在之前所建立的工程文件目录下找到你之前的文件。但是如果你勾选了上面的选项,然后点yes,就意味着你把整个工程文件删得干干净净。 4、 如果你打开软件看到下图这种情况,也就是IDE里面没有任何工程项目文件。那我们就可以进行下一步。 5、 根据博客3的内容新建一个工程,但是要注意在最后选择文件目录和工程名字的时候,最好是像下图所展现的这样。下图里面第1个红框是工程名字,工程名字必须是英文,也最好给他带一个标识,比如我在下图里面就给他取了工程名字叫gongcheng1,这里这个数字一有便于我们去识别这是哪一个工程,看到这个工程名字就知道是第1块单片机所需要的程序。下图里面第2个红框是选择了工程目录,我们最开始在桌面上新建了一个空的文件夹,我们应该去选择那个文件夹作为我们的工程目录,像在下图中我就选择了我新建的文件夹zongwenjian。 这些操作对于后面的辨识度是有好处的。 6、 我们已经创建好的我们的第1个工程。在下图中展示了我们应该看到的视角。 7、 同创建第1个工程类似,我们创建第2个工程.同样下图给出了我们应该看到的视角,这是我们新建的第2个工程,我们把工程名字取做gongcheng2. 8、 根据上面所描述的规律和道理,我们还可以创建更多的工程项目,想强调的就是工程名字一定要有区分度,工程的目录一定要在桌面或者自己能找得到的地方。这几个工程项目最好是放在同一个总工程目录下。 我这里就不再演示别的工程项目的创建,我这里就用了两个工程,我在后面仿真图里面我只有两块单片机,我只需要两个程序。那么现在我看到的视角应该是我的IDE里面一共有两个工程,就像下图所示。 我在心里已经为我后面仿真图里面的单片机打上了标识符,我管里面出现的两块单片机分别叫单片机1和单片机2,我准备单片机1就用这个gongcheng1里面所写的程序,我准备单片机2就用这个gongcheng2里面所写的程序。 9、 在每个工程里面我应该新建一个main.c来写他们各自的程序,因为每块单片机的工作内容都不一样所以他们的程序也是不一样的。 10、 根据博客3的内容,我应该点击下图这个图标去进行编译程序,但这是错误的操作。请注意这里,我们已经不能再点击这个图标去编译程序了。 正确的操作是: 如果我想编译我们的工程项目gongcheng1,我应该使用我的鼠标右键去点击gongcheng1名字。然后你会看到下图这个选项,这个时候我点击build(翻译为编译),就可以把工程项目gongcheng1的c语言编译成机器文件,在这个操作之后我们就能够在对应的工程目录文件下找到我们想要的hex机器文件。同样的,如果我们想要编译工程项目gongcheng2,我们应该鼠标右键去进入工程项目gongcheng2的选项,然后点击编译。 11、 在编写好所有的程序之后,并且把所有的程序都编译好。 我在我的一个项目里面我需要用到两块单片机,也就是下面仿真图的这两块单片机,我已经在心里把左边的这块单片机记做单片机1,把右边的这块单片机记做单片机2。并且我在心里已经清楚单片机1需要gongcheng1的机器文件,单片机2需要gongcheng2的机器文件. 首先我双击单片机1,我需要点击下图中这个打开文件的按钮去打开gongcheng1的机器文件,然后点击OK完成设置。 然后我双击单片机2,我需要点击下图中这个打开文件的按钮去打开gongcheng2的机器文件,然后点击OK完成设置。 12、 这个时候我已经为仿真图里面两块单片机选择了不一样的程序,我可以点击仿真图里面的运行去开始仿真。 13、 这个时候就已经结束了。如果我想要去做实物,我自己心里应该清楚,我这个项目用到了两块单片机,所以我应该找管理员要两个实验箱来进行这个实验。加油吧。

    时间:2021-03-22 关键词: 工程 IDE PIC16F887 MPLAB

发布文章