文档库 最新最全的文档下载
当前位置:文档库 › 基于单片机_CPLD的多路精确延时控制系统设计

基于单片机_CPLD的多路精确延时控制系统设计

基于单片机_CPLD的多路精确延时控制系统设计
基于单片机_CPLD的多路精确延时控制系统设计

《国外电子元器件》2008年第6期

1引言

现代控制系统中控制对象可能是复杂、分散的,而且往往是并行、独立工作的,但整体上它们是相互关联的有机组合[1]。因此,控制信号的时序逻辑则要求更加精确。CPLD单片机为控制系统提供了技术支持,由CPLD和单片机组成的多机系统具有逻辑控制方便,时序精确,并行工作,人机接口友好等优点。因此,本文提出了一种基于CPLD与单片机控制的多路精确延时控制系统的设计方案。

2设计指标与系统原理

2.1设计指标

输出多路脉宽为10ms正脉冲信号;

脉冲输出时间独立调节、显示;

时间调整范围与精度为微秒级的调整范围为1 ̄199μs,调节精度为1μs;毫秒级的调整范围为1 ̄199ms,调整精度为1ms;

提供计时基准信号和工作状态提示声音;

9V电池供电。

2.2系统设计原理

2.2.1系统时钟

本系统设计由CPLD和多个单片机组成,CPLD对24MHz高精度一体化晶体振荡器二分频得到多路同步时钟信号作为多个单片机的系统时钟,并由各个单片机外脉冲信号引脚XTAL2注入[2],二分频确保信号的占空比为50%,满足单片机时钟脉冲信号高低电平持续时间大于20ns和最高脉冲频率为

基于单片机+CPLD的多路精确延时控制系统设计

谭凤军

(瑞能北方风电设备有限公司,内蒙古包头014033)

摘要:根据多路精确延时控制系统的设计参数指标,利用单片机和CPLD的功能特性与片上资源,设计了基于CPLD与多个单片机的多路精确延时控制系统,实现了多路独立调整、显示,并能输出多个精确的延时控制信号。给出了系统电路原理图、软件流程和实际应用效果。该系统设计可为其他同步控制系统提供借鉴。

关键词:控制系统;单片机;CPLD;精确延时;中断

中图分类号:TP271+.82文献标识码:A文章编号:1006-6977(2008)06-0026-04

Designofmuliti-channelsexactdelaytimecontrolsystembasedon

microcontroller&CPLD

TANFeng-jun

(REpowerNorth(CHINA)Co.,Ltd,Baotou014033,China)

Abstract:Accordingtothedesignobjectsofthemuliti-channelsexactdelaytimecontrolsystem,utiliz-ingthecharactersofthemicrocontroller&CPLDandtheresourcesofon-chip.Thispaperpresentsamuliti-channelsexactdelaytimecontrolsystembasedonmicrocontroller&CPLD,whichmayindepen-dentlyadjustanddisplay,andcanoutputmulti-channelsexactdelaytimecontrolsignals.Thesystemcircuitandthesoftwareflowdiagramsaregiveninthispaper.Andthepracticalapplicationcharacteris-ticistest.Thissystemcanofferreferenceforothersynchroniccontrolsystem.

Keywords:controlsystem;microcontroller;CPLD;exactdelaytime;interrupter

研究与开发

收稿日期:2008-04-10稿件编号:200804011

作者简介:谭凤军(1978-),男,内蒙古包头人,工程硕士,电器工程师,从事大型风力发电机控制系统研究,嵌入式控制系统开发。

-26-

12MHz的要求,同时也提高系统的可靠性。51系列单片机采用定时控制方式,具有固定的机器周期,1

个机器周期共有12个振荡脉冲周期,则机器周期是振荡脉冲的12分频。本系统采用12MHz振荡脉冲频率,1个固定机器周期为1μs[2],因此能保证设计指标所要求的最高控制精度。

2.2.2同步计时启动信号

本系统设计由外部按键提供启动信号,由于机械接触点的弹性及电压突跳等原因,按键存在抖动效应,为保证按键准确识别,本系统设计采用软件去抖动,再经单片机引脚输出无电压毛刺的稳定启动信号,再经CPLD变换后,可提供多路同步计时启动信号。

2.2.3输出信号

本系统设计采用10ms单脉冲信号作为各模块单元控制输出信号,其输出形式可根据需要通过软件调整,并保证系统输出信号的时序与逻辑关系。

2.2.4系统时序

系统时序图如图1所示,在计时脉冲的驱动下,按键信号经去抖动变换、CPLD逻辑同步后形成计时启动信号(0-n),以计时基准脉冲的前沿为计时起点,经设定延时后,系统输出相应的输出信号,其延时时间可独立调整,信号输出形式可由软件编程设置。图1采用单一正脉冲作为输出信号。

2.2.5系统原理框图

电源稳压单元实现系统5V电源的稳压与滤波。单片机采用外部系统时钟。主控单片机CPU0完成按键检测、计时基准信号输出和系统提示声音输出等功能。NO.1 ̄NO.n单元完成时间调整与显示、

μs/ms(微秒/毫秒)变换和信号输出等功能,CPLD完

成时钟2分频、

同步计时脉冲输出和计时启动信号同步输出功能。图2为多路精确延时控制系统原理框图。

3硬件电路设计

3.1主控单元

每个系统都由独立的主控单元组成,如图3所

示。主控单元由电压、CPU0和CPLD同步控制模块等组成。电压模块完成由可充电电池电压到稳定的

5V系统电源变换与滤波。CPU0单元模块选用

ATMEL公司51系列单片机AT89S52[3]。AT89S52是低功耗、高性能CMOS8位微控制器,具有8KB在

系统可编程Flash存储器、256字节的随机存取数据存储器(RAM)、32个外部双向输入/输出(I/O)端口、

5个中断优先级2层中断嵌套中断、2个16位可编程定时计数器、2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器,兼容标准MCS-51指

图1多路精确延时控制系统设计时序原理图

图2多路精确延时控制系统原理框图

基于单片机+CPLD

的多路精确延时控制系统设计

-27-

《国外电子元器件》2008年第6期

令系统。CPU0模块完成按键信号检测,工作状态提示音输出,计时基准信号输出等功能。CPLD同步控制模块采用ALTRA公司EPM7032SLC44[4]为控制核心。EPM7032SLC44是MAX7000CPLD,是基于先进的多阵列矩阵(MAX)架构,采用先进的CMOS制造工艺,提供从32到512个宏单元的密度范围,速度达3.5ns的引脚到引脚延迟。支持在系统可编程能力(ISP),可以在现场进行重配置。CPLD同步控制单元完成时钟分频与同步,按键信号同步等功能,

Program插座是CPLD的编程接口。

3.2输出控制单元

每个系统由n(本系统设计中n=9)个输出控制单元组成,这n个单元输出控制独立并行工作,如图4所示。NO.1 ̄NO.n以ATMEL公司51系列单片机AT89C2051[5]为核心。AT89C2051是低功耗、高性

能CMOS8位单片机,具有15个双

向输入/输出(I/O)端口、

片内含2K字节的可反复擦写的只读Flash程序存储器和128字节的随机存取数据存储器(RAM);采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统。输出控制单元(NO.1 ̄NO.n)并行工作,完成延时时间设置、μs/ms变换设置、控制信号输出和延时显示等功能,延时时间显示通过单片机串口实现,由3片串/并变换器件74LS164驱动3个共阳数码管。

4系统软件设计

本系统软件设计包括CPU0单

元、NO.1~NO.n输出单元及CPLD单元程序设计。由于对时间要求严格,采用汇编语言编写,信号输出由中断程序完成,由于中断响应过程[6]、现场保护以及中断后必要的设置条件检测需要时间,所以软件必须通过容余指令(比如NOP)的延时,可保证

counter0输出和控制信号延时起点在

同一时刻。

CPU0单元程序流程如图5所

示。CPU0主程序完成系统初始化、

按键检测、去抖动信号输出和工作状态提示音输出等工作,中断服务程序计时基准信号counter0输出。输出控制单元NO.1~NO.n程序流程如图6所示,各单元主程序完成μs/ms设置检测,延时设置读取,延时时间显示,中断程序完成控制信号输出功能。CPLD程序采用VHDL[7]语言编写,采用QuartusⅡ软件编译仿真。

5结语

该系统设计可应用于电容组(9只)放电控制系

统,在放电电子开关控制端、负载端测量以及微秒级延时范围内,延时误差小于0.1μs,毫秒级延时范围内,延时误差小于50μs。实际测试显示,系统实现了设计要求的调整精度。基于单片机+CPLD的多路精确延时控制系统充分利用单片机和CPLD的各

图3

主控单元

-28-

4输出控制单元

自特点,实现主要设计指标。实际应用证明,该系统能够完全满足时序逻辑要求中严格控制系统的控制需求。参考文献:

[1]饶运涛,邹继军,郑勇芸.现场总线CAN原理与应用技术[M].北京:北京航空航天大学出版社,2003.[2]李广第.单片机基础[M].北京:北京航空航天大学出版社,1999.

[3]ATMEL.AT89S52DataSheet[DB/OL].http://www.atmel.com/dyn/products/datasheets.asp?Family_id=604,doc1919[1].Pdf,2008.

[4]ALTERA.MAX7000ProgrammerLogicalDevicesFamilyEPM7032SLC44DataSheet[DB/OL].http://www.altera.com.cn/literature/lit-m7k.jsp,m7000[1];2008.

[5]ATMEL.AT89C2051DataSheet[DB/OL].http://www.atmel.com/dyn/products/datasheets.asp?Family_id=604,doc0368.pdf,2008.

[6]安会霞,李刚.MCS-51外部中断方案的改进[J].单片机与嵌入式系统应用,2003(3):76-76.

[7]曾繁泰,陈美金.VHDL程序设计[M].北京:清华大学出版社,2004.

图5CPU0单元程序流程图

输出控制单元程序流程图

基于单片机+CPLD的多路精确延时控制系统设计

-29-

51单片机中断程序大全

//实例42 :用定时器T0 查询方式 P2 口8 位控制LED 闪烁 //#include单片机寄存器定义的头文件 51包含 /******************************************************* *******函数功能:主函数 ******************************************************** ******/void main(void){ // EA=1;开总中断// 中断允许T0 // 定时器// ET0=1; 1的模式TMOD=0x01;// 使用定时器T0 位赋初值定时器T0 的高8 TH0=(65536-46083)/256; // 位赋初值的高8 TL0=(65536-46083)%6; // 定时器T0 T0启动定时器TR0=1;// TF0=0;P2=0xff; 无限循环等待查询while(1)// {while(TF0==0); TF0=0;P2=~P2; 位赋初值的高8 定时器TH0=(65536-46083)/256; // T0 位赋初值T0 TL0=(65536-46083)%6; //

定时器的高8 }} 1KHzT1:用定时器43 实例// 音频查询方式控制单片机发出 #include 单片机寄存器定义的头文件51 // 包含sbit sound=P3^7;将// 引脚sound P3.7 位定义为 /********************************************************** **** 函数功能:主函数 ******************************************************** ******/void main(void){// EA=1;开总中断// 中断允许ET0=1;// // 定时器T0 1的模式使用定时器// T1 TMOD=0x10; 位赋初值// TH1=(65536-921)/256; T1 定时器的高8 TL1=(65536-921)%6; // 定时器T1 的高8 位赋初值 TR1=1;// 启动定时器T1TF1=0; while(1)// 无限循环等待查询{while(TF1==0); TF1=0;

单片机中断程序大全

单片机中断程序大全公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-

//实例42:用定时器T0查询方式P2口8位控制L E D闪烁#include // 包含51单片机寄存器定义的头文件void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 //实例43:用定时器T1查询方式控制单片机发出1KHz音频

#include // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚 void main(void) {// EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 { while(TF1==0); TF1=0; sound=~sound; //将P3.7引脚输出电平取反 TH1=(65536-921)/256; //定时器T0的高8位赋初值 TL1=(65536-921)%256; //定时器T0的高8位赋初值 } } //实例44:将计数器T0计数的结果送P1口8位LED显示 #include // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为P3.4引脚

大迟延和复杂控制系统

现代工程控制理论实验报告学生姓名:任课老师: 学号:班级:

实验十二大迟延和复杂控制系统 摘要 本次试验主要研究了大迟延系统和串级双回路系统,每个部分所包含的内容如下。 基于大迟延系统主要研究对其的各种控制方法,使系统品质能够满足要求,具体内容于下: (1)研究大迟延系统PID控制器参数的选择方法; (2)研究基于微分先行的大迟延控制方法; (3)分析基于smith预估的控制策略,并与PI控制作对比。 其次要分析复杂控制系统。主要分析以下中系统的特性: (1)分析串级控制系统的各种特点并与单回路系统作对比; (2)研究基于多输入多输出系统的解耦方法; (3)研究机跟炉,炉跟机两种协调方式

目录 实验十二大迟延和复杂控制系统 (2) 摘要 (2) 1、大迟延控制系统 (4) 1.1大迟延环节 (4) 1.2对大迟延系统的几种控制策略 (4) 2、串级控制系统 (18) 2.1串级控制系统的组成 (18) 2.2串级控制系统的特点 (18) 2.3串级控制系统各种特点的实验验证与分析 (19) 3、多输入多输出系统的解耦 (24) 3.1解耦原理 (24) 3.2仿真实例 (26) 4、协调控制系统 (39) 4.1协调控制方式介绍 (39) 4.2协调控制方式的仿真 (39)

1、大迟延控制系统 1.1大迟延环节 控制领域中称传递函数为s eτ-的环节为纯迟延环节。当对象的传递函数中含有纯迟延项时,我们称这样的对象为迟延对象。 纯迟延环节虽然不会改变系统的增益,但会改变系统的时间特性和稳定性。 由于纯迟延环节的存在,系统的输出会滞后sτ,不仅会降低系统的反应时间,而且会导致反馈量不能表示当前系统的状态,直接影响控制器的控制效果,甚至导致破坏整个系统的稳定性。 设某一迟延对象的传递函数为 (1) s n k e Ts τ- +,当0.3 T τ >时我们称这 样的对象为大迟延对象。对于含有大迟延对象的系统,上述问题尤为严重。 因此针对大迟延对象,需要新的控制策略。常见的针对大迟延系统的控制方法有PI控制、微分先行、smith预估。 1.2对大迟延系统的几种控制策略 1.2.1PI控制与PID控制 1.2.1.1控制原理及方法 针对大迟延环节选择控制器时,以往的经验公式不能直接使用了,需要用到大迟延环节特有的整定方法。

基于51单片机的精确延时(微秒级)

声明: *此文章是基于51单片机的微秒级延时函数,采用12MHz晶振。 *此文章共包含4个方面,分别是延时1us,5us,10us和任意微秒。前三个方面是作者学习过程中从书本或网络上面总结的,并非本人所作。但是延时任意微秒函数乃作者原创且亲测无误。欢迎转载。 *此篇文章是作者为方便初学者使用而写的,水平有限,有误之处还望大家多多指正。 *作者:Qtel *2012.4.14 *QQ:97642651 ----------------------------------------------------------------------------------------------------------------------序: 对于某些对时间精度要求较高的程序,用c写延时显得有些力不从心,故需用到汇编程序。本人通过测试,总结了51的精确延时函数(在c语言中嵌入汇编)分享给大家。至于如何在c 中嵌入汇编大家可以去网上查查,这方面的资料很多,且很简单。以12MHz晶振为例,12MHz 晶振的机器周期为1us,所以,执行一条单周期指令所用时间就是1us,如NOP指令。下面具体阐述一下。 ----------------------------------------------------------------------------------------------------------------------1.若要延时1us,则可以调用_nop_();函数,此函数是一个c函数,其相当于一个NOP指令,使用时必须包含头文件“intrins.h”。例如: #include #include void main(void){ P1=0x0; _nop_();//延时1us P1=0xff; } ----------------------------------------------------------------------------------------------------------------------2.延时5us,则可以写一个delay_5us()函数: delay_5us(){ #pragma asm nop #pragma endasm } 这就是一个延时5us的函数,只需要在需要延时5us时调用此函数即可。或许有人会问,只有一个NOP指令,怎么是延时5us呢? 答案是:在调用此函数时,需要一个调用指令,此指令消耗2个周期(即2us);函数执行完毕时要返回主调函数,需要一个返回指令,此指令消耗2个周期(2us)。调用和返回消耗了2us+2us=4us。然后再加上一个NOP指令消耗1us,不就是5us吗。

51单片机中断程序大全

//实例42:用定时器T0查询方式P2口8位控制LED闪烁#include // 包含51单片机寄存器定义的头文件 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 } } //实例43:用定时器T1查询方式控制单片机发出1KHz音频#include // 包含51单片机寄存器定义的头文件 sbit sound=P3^7; //将sound位定义为P3.7引脚 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值

单元机组协调控制系统设计

单元机组协调控制系统设计 摘要 在单元制机组的不断发展,协调控制系统作为单元制机组的控制核心,已然成为电厂自动化系统中最为关键的组成单元。随着机组类型的不同,各个机组的参数也越来越高,容量也在逐渐增进,机组的动态特征和控制难度也随机组型号的不同而改动,因此不同机组的协调控制系统也是不同的。所以在设计协调控制系统时,应该综合考虑所研究机组的动态特征和生产流程,针对不同类型机组的进行相应的方略。在火电厂现场中,单元机组协调控制系统是一个具有强耦合、大时滞、大迟延、非线性等特征的一个多变量系统。所以,这些复杂的动态特征,使得创建单元机组的非线性动态模型成为一个难点,而且使协调控制及其参数整定变得复杂起来,往往使调节品质下降,不能得到令人中意的控制品质。 本文首先阐述了单元机组协调控制系统的结构和功能,并对机组的动态特征和负荷指令管理系统进行了描述。然后以一个300MW机组为研究对象,由分析得出该机组的模型结构,再对辨识出的协调系统的对象进行静态解耦控制,用工程正定法对解耦控制器参数进行整定,并用Matlab软件做了系统仿真。仿真结果表明,解耦后的协调控制系统可以达到令人满意的控制品质和效果。 关键词:协调控制;解耦控制;Matlab仿真;PID整定;300MW机组

Design of Coordinated Control System for Unit Abstract In the continuous development of unit system, coordinated control system as a unit system control core, has become the power plant automation system, the most critical component. With the different types of units, the parameters of each unit are getting higher and higher, the capacity is gradually increasing, the dynamic characteristics of the unit and the difficulty of control are also different types of change, so different units of the coordinated control system is different. Therefore, in the design of coordinated control system, should consider the selected units of the dynamic characteristics and process, for different types of units for the corresponding design. In the field of thermal power plant, the unit control system is a multivariable system with strong coupling, time variability, large delay and non-linearity. Therefore, these complex dynamic characteristics make the nonlinear dynamic model of the unit unit become a difficult point, and make the coordination control and its parameter setting become complicated, and the adjustment quality is often reduced, and the satisfactory control effect can not be obtained. In this paper, the structure and function of the unit control system are described, and the dynamic characteristics and load command management system of the unit are described. Then, a 300MW unit is taken as the object of study, and the model structure of the unit is obtained. The decoupling control of the identified coordinate system is carried out. The parameters of the decoupling controller are set by engineering positive definite method. Software to do the system simulation. The simulation results show that the coordinated control system can achieve satisfactory control quality and effect. Keywords:Coordination control system;Decoupling control;Matlab simulation;PID tuning ;300MW unit

单片机89C51精确延时

单片机89C51精确延时 高手从菜鸟忽略作起之(六)一,晶振与周期: 89C51晶振频率约为12MHZ。在此基础上,计论几个与单片机相关的周期概念:时钟周期,状态周期,机器周期,指令周期。 晶振12MHZ,表示1US振动12次,此基础上计算各周期长度。 时钟周期(W sz):Wsz=1/12=0.083us 状态周期(W zt) Wzt=2*Wsz=0.167us 机器周期(W jq): Wjq=6*Wzt=1us 指令周期(W zl): W zl=n*Wjq(n=1,2,4) 二,指令周期 汇编指令有单周期指令,双周期指令,四周期指令。指令时长分别是1US,2US,4US.指令的周期可以查询绘编指令获得,用下面方法进行记忆。 1.四周期指令:MUL,DIV 2.双周期指令:与SP,PC相关(见汇编指令周期表) 3.单周期指令:其他(见汇编指令周期表) 三,单片机时间换算单位 1.1秒(S)=1000毫秒(ms) 2.1毫秒(ms)=1000微秒(us) 3.1微秒(us)=1000纳秒(ns) 单片机指令周期是以微秒(US)为基本单位。 四,单片机延时方式 1.计时器延时方式:用C/T0,C/T1进行延时。 2.指令消耗延时方式: 本篇单片机精确延时主要用第2种方式。 五,纳秒(ns)级延时: 由于单片机指令同期是以微秒(US)为基本单位,因此,纳秒级延时,全部不用写延时。六,微秒(US)级延时:

1.单级循环模式:delay_us_1 最小值:1+2+2+0+2+1+2+2=12(US),运行此模式最少需12US,因此12US以下,只能在代码中用指定数目的NOP来精确延时。 最大值:256*2+12-2=522(US),256最大循环次数,2是指令周期,12是模式耗时,-2是模式耗时中计1个时钟周期。 延时范围:值域F(X)[12,522],变量取值范围[0,255]. 函数关系:Y=F(x):y=2x+12,由输入参数得出延时时间。 反函数:Y=F(x):y=1/2x-6:由延时时间,计算输入参数。例延时500US,x=500,y=244,即输入244时,精确延时500US. 2.双级循环模式:delay_us_2

单片机一些常用的延时与中断问题及解决方法

单片机一些常用的延时与中断问题及解决方法 延时与中断出错,是单片机新手在单片机开发应用过程中,经常会遇到的问题,本文汇总整理了包含了MCS-51系列单片机、MSP430单片机、C51单片机、8051F的单片机、avr单片机、STC89C52、PIC单片机…..在内的各种单片机常见的延时与中断问题及解决方法,希望对单片机新手们,有所帮助! 一、单片机延时问题20问 1、单片机延时程序的延时时间怎么算的? 答:如果用循环语句实现的循环,没法计算,但是可以通过软件仿真看到具体时间,但是一般精精确延时是没法用循环语句实现的。 如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统一般常选用 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。 2、求个单片机89S51 12M晶振用定时器延时10分钟,控制1个灯就可以 答:可以设50ms中断一次,定时初值,TH0=0x3c、TL0=0xb0。中断20次为1S,10分钟的话,需中断12000次。计12000次后,给一IO口一个低电平(如功率不够,可再加扩展),就可控制灯了。 而且还要看你用什么语言计算了,汇编延时准确,知道单片机工作周期和循环次数即可算出,但不具有可移植性,在不同种类单片机中,汇编不通用。用c的话,由于各种软件执行效率不一样,不会太准,通常用定时器做延时或做一个不准确的延时,延时短的话,在c中使用汇编的nop做延时 3、51单片机C语言for循环延时程序时间计算,设晶振12MHz,即一个机器周期是1us。for(i=0,i<100;i++) for(j=0,j<100;j++) 我觉得时间是100*100*1us=10ms,怎么会是100ms 答: 不可能的,是不是你的编译有错的啊

热工系统纯迟延过程的控制策略研究

毕业设计说明书(论文) 作者:张继超学号:0807240636 学院:自动化工程学院班级:自动086 专业:□∨自动化□测控技术与仪器 ∨控制科学与工程□仪器科学与技术 所在系:□ 题目:热工系统纯迟延过程的控制策略研究 指导者:顾大可副教授签字: 评阅者: 2012 年6 月吉林

摘要 摘要 工业生产过程中的大多数被控对象都具有较大的纯滞后性质。被控对象的这种纯滞后性质经常引起超调和持续的振荡。在20世纪50年代,国外就对工业生产过程中纯滞后现象进行了深入的研究,史密斯提出了一种纯滞后补偿模型,由于当时模拟仪表不能实现这种补偿,致使这种方法在工业实际中无法实现。随着计算机技术的飞速发展,现在人们可以利用计算机方便地实现纯滞后补偿。这些系统由于能量或物料在介质中的传输,使被控参数惯性大,不能及时反映扰动量或控制量的变化。在应用于某些时滞大的对象时,还可能出现系统闭环稳定性降低、动态过程变差、调节品质恶化的现象。所以,大惯性的纯迟延过程在传统控制领域是公认的控制难题。针对工业过程中广泛存在的大时滞过程,这样的过程必然会产生较明显的超调量,使控制系统的稳定性变差,调节时间延长,本文叙述了双闭环控制器和先进的控制策略。文中具体研究了双控制器设计方案,文中将两个控制器设计为比例加积分(PI)类型,给出了具体的参数整定方法。该方案含两个独立的控制器,即跟踪控制器和扰动控制器,使设定值响应得以与扰动响应分离,从而可同时获得良好的设定值跟踪性能和抗干扰能力,同时系统的鲁棒性也比现有控制方案大为增加,进一步显示了双控制器优越的性能。 关键词:时滞;过程控制;双控制器;鲁棒稳定性

单片机C延时时间怎样计算

C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时 应该使用unsigned char作为延时变量。以某晶振为12MHz的单片 机为例,晶振为12M H z即一个机器周期为1u s。一. 500ms延时子程序 程序: void delay500ms(void) { unsigned char i,j,k; for(i=15;i>0;i--) for(j=202;j>0;j--) for(k=81;k>0;k--); } 计算分析: 程序共有三层循环 一层循环n:R5*2 = 81*2 = 162us DJNZ 2us 二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值 1us = 3us 三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值 1us = 3us

循环外: 5us 子程序调用 2us + 子程序返回2us + R7赋值 1us = 5us 延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms 计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5 二. 200ms延时子程序 程序: void delay200ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=132;j>0;j--) for(k=150;k>0;k--); } 三. 10ms延时子程序 程序: void delay10ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=4;j>0;j--) for(k=248;k>0;k--);

C51精确延时

C51中精确延时 C语言最大的缺点就是实时性差,我在网上到看了一些关于延时的讨论,其中有篇文章51单片机Keil C 延时程序的简单研究,作者:InfiniteSpace Studio/isjfk,写得不错,他是用while(--i);产生DJNZ 来实现精确延时,后来有人说如果while里面不能放其它语句,否则也不行,用do-while就可以,具体怎样我没有去试.所有这些都没有给出具体的实例程序来.还看到一些延时的例子多多少少总有点延时差.为此我用for循环写了几个延时的子程序贴上来,希望能对初学者有所帮助.(晶振12MHz,一个机器周期1us.) 在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响. 一. 500ms延时子程序 程序: void delay500ms(void) { unsigned char i,j,k; for(i=15;i>0;i--) for(j=202;j>0;j--) for(k=81;k>0;k--); } 产生的汇编: C:0x0800 7F0F MOV R7,#0x0F C:0x0802 7ECA MOV R6,#0xCA C:0x0804 7D51 MOV R5,#0x51 C:0x0806 DDFE DJNZ R5,C:0806 C:0x0808 DEFA DJNZ R6,C:0804 C:0x080A DFF6 DJNZ R7,C:0802 C:0x080C 22 RET 计算分析: 程序共有三层循环 一层循环n:R5*2 = 81*2 = 162us DJNZ 2us 二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值1us = 3us 三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值1us = 3us 循环外: 5us 子程序调用2us + 子程序返回2us + R7赋值1us = 5us 延时总时间= 三层循环+ 循环外= 499995+5 = 500000us =500ms 计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5 二. 200ms延时子程序 程序: void delay200ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=132;j>0;j--)

51单片机中断程序大全

//实例42 :用定时器TO查询方式P2 口8位控制LED闪烁#include // 包含 51 单片机寄存器定义的头文件/************************************************************** 函数功能:主函数 void main(void) { // EA=1; // 开总中断 // ETO=1; // 定时器 TO 中断允许 TMOD=OxO1; // 使用定时器 TO 的模式 1 THO=(65536-46O83)/256; // 定时器 TO 的高 8 位赋初值 TLO=(65536-46O83)%256; // 定时器 TO 的高 8 位赋初值 TRO=1; // 启动定时器 TO TFO=O; P2=Oxff; while(1)// 无限循环等待查询 { while(TFO==O) TFO=O; P2=~P2; THO=(65536-46O83)/256; // 定时器 TO 的高 8 位赋初值

TL0=(65536-46083)%256; // 定时器 T0 的高 8 位赋初值 } // 实例43 :用定时器T1 查询方式控制单片机发出1KHz 音频#include // 包含 51 单片机寄存器定义的头文件 sbit sou nd=P3^7; // 将 sound 位定义为 P3.7 引脚 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; // 开总中断 // ET0=1; // 定时器 T0 中断允许 TMOD=0x10; // 使用定时器 T1 的模式 1 TH1=(65536-921)/256; // 定时器 T1 的高 8 位赋初值 TL1=(65536-921)%256; // 定时器 T1 的高 8 位赋初值 TR1=1; // 启动定时器 T1 TF1=0; while(1)// 无限循环等待查询 {

用单片机实现延时(自己经验及网上搜集).

标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。这在汇编语言中很容易实现,写几个nop就行了。 在keil C51中,直接调用库函数: #include // 声明了void _nop_(void; _nop_(; // 产生一条NOP指令 作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。 在选择C51中循环语句时,要注意以下几个问题 第一、定义的C51中循环变量,尽量采用无符号字符型变量。 第二、在FOR循环语句中,尽量采用变量减减来做循环。 第三、在do…while,while语句中,循环体内变量也采用减减方法。 这因为在C51编译器中,对不同的循环方法,采用不同的指令来完成的。 下面举例说明: unsigned char i; for(i=0;i<255;i++; unsigned char i; for(i=255;i>0;i--;

其中,第二个循环语句C51编译后,就用DJNZ指令来完成,相当于如下指令: MOV 09H,#0FFH LOOP: DJNZ 09H,LOOP 指令相当简洁,也很好计算精确的延时时间。 同样对do…while,while循环语句中,也是如此 例: unsigned char n; n=255; do{n--} while(n; 或 n=255; while(n {n--}; 这两个循环语句经过C51编译之后,形成DJNZ来完成的方法, 故其精确时间的计算也很方便。 其三:对于要求精确延时时间更长,这时就要采用循环嵌套的方法来实现,因此,循环嵌套的方法常用于达到ms级的延时。对于循环语句同样可以采用for,do…while,while结构来完成,每个循环体内的变量仍然采用无符号字符变量。 unsigned char i,j for(i=255;i>0;i--

51单片机的几种精确延时

51单片机的几种精确延时实现延时 51单片机的几种精确延时实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。 1 使用定时器/计数器实现精确延时 单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。 在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC 语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。 2 软件延时与时间计算 在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。 2.1 短暂延时 可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10 μs的延时函数可编写如下: void Delay10us( ) { _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); } Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。可以把这一函数

51单片机精确延时源程序

51单片机精确延时源程序 一、晶振为 11.0592MHz,12T 1、延时 1ms: (1)汇编语言: 代码如下: DELAY1MS: ;误差 -0.651041666667us MOV R6,#04H DL0: MOV R5,#71H DJNZ R5,$ DJNZ R6,DL0 RET (2)C语言: void delay1ms(void) //误差 -0.651041666667us { unsigned char a,b; for(b=4;b>0;b--) for(a=113;a>0;a--); } 2、延时 10MS: (1)汇编语言: DELAY10MS: ;误差 -0.000000000002us MOV R6,#97H DL0: MOV R5,#1DH DJNZ R5,$ DJNZ R6,DL0

RET (2)C语言: void delay10ms(void) //误差 -0.000000000002us { unsigned char a,b; for(b=151;b>0;b--) for(a=29;a>0;a--); } 3、延时 100MS: (1)汇编语言: DELAY100MS: ;误差 -0.000000000021us MOV R7,#23H DL1: MOV R6,#0AH I

棋影淘宝店:https://www.wendangku.net/doc/df18277264.html,QQ:149034219 DL0: MOV R5,#82H DJNZ R5,$ DJNZ R6,DL0 DJNZ R7,DL1 RET (2)C语言: void delay100ms(void) //误差 -0.000000000021us { unsigned char a,b,c; for(c=35;c>0;c--) for(b=10;b>0;b--) for(a=130;a>0;a--); } 4、延时 1S: (1)汇编语言: DELAY1S: ;误差 -0.00000000024us MOV R7,#5FH DL1: MOV R6,#1AH DL0: MOV R5,#0B9H DJNZ R5,$ DJNZ R6,DL0 DJNZ R7,DL1 RET (2)C语言: void delay1s(void) //误差 -0.00000000024us { unsigned char a,b,c; for(c=95;c>0;c--) for(b=26;b>0;b--)

哈工大控制系统设计大作业——直线一级倒立摆控制器设计(DOC)

H a r b i n I n s t i t u t e o f T e c h n o l o g y 课程设计说明书(论文) 课程名称:控制系统设计课程设计 设计题目:直线一级倒立摆控制器设计 院系:航天学院控制科学与工程系 班级: 设计者: 学号: 指导教师:罗晶 设计时间:2012.8.27——2012.9.9 哈尔滨工业大学教务处

哈尔滨工业大学课程设计任务书

*注:此任务书由课程设计指导教师填写。

一、 直线一级倒立摆数学模型的推导及建立 系统建模可以分为两种:机理建模和实验建模。实验建模就是通过在研究对象上加上一系列的研 究者事先确定的输入信号,激励研究对象并通过传感器检测其可观测的输出,应用数学手段建立起系统的输入-输出关系。这里面包括输入信号的设计选取,输出信号的精确检测,数学算法的研究等等内容。机理建模就是在了解研究对象的运动规律基础上,通过物理、化学的知识和数学手段建立起系统内部的输入-状态关系。 对于倒立摆系统,由于其本身是自不稳定的系统,实验建模存在一定的困难。但是经过小心的假设忽略掉一些次要的因素后,倒立摆系统就是一个典型的运动的刚体系统,可以在惯性坐标系内应用经典力学理论建立系统的动力学方程。下面我们采用其中的牛顿-欧拉方法建立直线型一级倒立摆系统的数学模型。 1.1、微分方程的推导 在忽略了空气阻力,各种摩擦之后,可将直线一级倒立摆系统抽象成小车和匀质杆组成的系统. 下 图是系统中小车和摆杆的受力分析图。其中,N 和P 为小车与摆杆水平和垂直方向的分量。 b p x 图1(a )小车隔离受力图 (b )摆杆隔离受力图 本系统相关参数定义如下: M : 小车质量 m :摆杆质量 b :小车摩擦系数 l :摆杆转动轴心到杆质心的长度 I :摆杆惯量 F :加在小车上的力 x :小车位置 φ:摆杆与垂直向上方向的夹角 θ:摆杆与垂直向下方向的夹角(考虑到摆杆初始位置为竖直向下) 注意:在实际倒立摆系统中检测和执行装置的正负方向已经完全确定,因而矢量方向定义如图所示,图示方向为矢量正方向。 分析小车水平方向所受的合力,可以得到以下方程: Mx F bx N =-- 由摆杆水平方向的受力进行分析可以得到下面等式: ()2 2sin d N m x l dt θ=+ 即 2cos sin N mx ml ml θθθθ=+- 把这个等式代入上式中,就得到系统的第一个运动方程: ()2cos sin M m x bx ml ml F θθθθ+++-= 为了推出系统的第二个运动方程,我们对摆杆垂直方向上的合力进行分析,可以得到下面方程:

51单片机中断程序大全

( //实例42:用定时器T0查询方式P2口8位控制LED闪烁 #include<> // 包含51单片机寄存器定义的头文件 void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 : TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; ] TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 //实例43:用定时器T1查询方式控制单片机发出1KHz音频 #include<> // 包含51单片机寄存器定义的头文件 sbit sound=P3^7; //将sound位定义为引脚 void main(void) ( {// EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 — { while(TF1==0); TF1=0;

51单片机延时模块程序

51单片机独立模块 一、延时模块 1、for循环延时 void delayms(UINT8 ms) { UINT8 x,y; for(x=ms;x>0;x--) for(y=112;y>0;y--); } 2、while循环延时 void delayms(UINT8 ms) { UINT8 x; while(ms--) for(x=112;x>0;x--); } 3、精确的单片机常用延时函数:(c代码误差0us 12M)(1)、延时0.5ms void delay0.5ms(void) //误差 0us { unsigned char a,b; for(b=71;b>0;b--) for(a=2;a>0;a--); } (2)、延时1ms void delay1ms(void) //误差 0us { unsigned char a,b,c; for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } (3)、延时2ms void delay2ms(void) //误差 0us { unsigned char a,b; for(b=4;b>0;b--) for(a=248;a>0;a--); _nop_; //if Keil,require use intrins.h } (4)、延时3ms void delay3ms(void) //误差 0us

{ unsigned char a,b; for(b=111;b>0;b--) for(a=12;a>0;a--); } (5)、延时4ms void delay4ms(void) //误差 0us { unsigned char a,b,c; for(c=7;c>0;c--) for(b=8;b>0;b--) for(a=34;a>0;a--); } (6)、延时5ms void delay5ms(void) //误差 0us { unsigned char a,b; for(b=19;b>0;b--) for(a=130;a>0;a--); } (7)、延时10ms void delay10ms(void) //误差 0us { unsigned char a,b,c; for(c=1;c>0;c--) for(b=38;b>0;b--) for(a=130;a>0;a--); } (8)、延时15ms void delay15ms(void) //误差 0us { unsigned char a,b,c; for(c=1;c>0;c--) for(b=238;b>0;b--) for(a=30;a>0;a--); } (9)、延时20ms void delay20ms(void) //误差 0us { unsigned char a,b; for(b=215;b>0;b--) for(a=45;a>0;a--); _nop_; //if Keil,require use intrins.h

相关文档
相关文档 最新文档