基于微处理器的数字PID控制器改变了传统模拟PID控制器参数整定不灵活的问题。但是常规微处理器容易在环境恶劣的情况下出现程序跑飞的问题,如果实现PID软算法的微处理器因为强干扰或其他原因而出现故障,会引起输出值的大幅度变化或停止响应。而FPGA的应用可以从本质上解决这个问题。因此,利用FPGA开发技术,实现智能控制器算法的芯片化,使之能够广泛的用于各种场合,具有很大的应用意义。 首先分析FPGA的内部结构特点,总结FPGA设计技术及开发流程,指出实现结构优化设计,降低设计难度,是扩展设计功能、提高芯片性能和产品性价比的关键。控制系统由四个模块组成,主要包括核心控制器模块、输入输出模块以及人机接口。其中控制器部分为系统的关键部件。在分析FPGA设计结构类型和特点的基础上,提出一种基于FPGA改进型并行结构的PID温度控制器设计方法。在PID算法与FPGA的运算器逻辑映像过程中,采用将补码的加法器代替减法器设计,增加整数运算结果的位扩展处理,进行不同数据类型的整数归一化等不同角度的处理方法融合为一体,可以有效地减少逻辑运算部件。应用Ouartus Ⅱ图形输入与Verilog HDL语言相结合设计实现了PID控制器,用Modelsim仿真验证了设计结果的正确性,用Synplify Pro进行电路综合,在Quaitus Ⅱ软件中实现布局布线,最后生成FPGA的编程文件。根据控制系统的要求,论文设计完成了12位模数AD转换器、数据显示器、按键等相关外围接口电路。 将一阶、纯滞后、大惯性电阻炉温作为控制对象,以EP1C3T144 FPGA为核心,构建PID控制系统。在采用Pt100温度传感器、分辨率为2℃、最大温度控制范围0~400℃的条件下,实验结果表明,达到无超调的稳定控制要求,为降低FPGA实现PID控制器的设计难度提供了有效的方法。
上传时间: 2013-06-13
上传用户:15071087253
随着通信产业的发展,尤其是今年3G牌照的发放,视频业务在移动多媒体方面将会有更加重要的地位,所以在移动终端上实现支持高效视频编码标准的解码功能就成为一项非常有实际意义的工作。 H.264作为新一代的高压缩率的视频标准,凭借其较高的压缩率和优秀图像质量,使得H.264只要利用较小的空间就能存储更多的视频数据,在更低的网络带宽条件下提供更优质量的视频。然而高度的压缩必然付出较高的硬件代价。如何能完成视频良好解码并能节约硬件资源成为研究热点。 考虑到H.264视频编解码的计算复杂度,在硬件选择上一般比较注重高性能处理器的选择。计算目前主流的实现方式包括ASIC的专用集成芯片实现或者是DSP的软件实现。ARM处理器伴随技术的进步,尤其是对支持数字信号处理的功能加强后,在视频编解码领域的应用也越来越广泛。 本文以WindowsCE5.0和S3C2440A嵌入式平台作为H.264解码器的载体,研究的代码版本是t264-src-0.14,主要进行了以下几个方面的工作: 研究了H.264视频压缩标准和它的体系结构,尤其是对解码器部分进行了硬件要求的分析。 深入研究了WINCE5.0和ARM结合的平台特性,根据实际的硬件平台需要,定制了相应的操作系统。 完成了基于T264代码的解码库在WINCE5.0下的移植,并进行了相应的代码和算法的优化并完成了基于WINCE5.0操作系统下播放程序的编写。 通过实验数据证明,在基于单核的ARM芯片中,主要靠软件进行QCIF格式的H.264视频解码从而获得良好播放效果的方法是有效的。
上传时间: 2013-07-24
上传用户:myworkpost
以电子计算机为中心,以最佳统计理论为方法,将载体上的某些或全部的导航设备综合在一起,形成一个有机的统一整体,提高导航信息精度,扩大单一导航设备或系统的功能,这样的系统通称为组合导航系统。 本文以某校研制的综导显控台为工程背景,在对综导显控台进行需求分析的基础上提出了基于ARM-Linux平台的综导显控台的设计方案。在对系统软硬件平台给出了详细分析的基础上阐述了系统应用软件设计的思想和基本原则,然后对应用软件的任务进行了详细的划分并完成了系统的相关软件设计。研究了基于ARM-Linux平台的综合导航显控台的CAN总线、串口通信、以太网接口通信技术并完成了相应的软件。 本文对嵌入式系统软硬件开发技术作了详细而深入的研究,介绍了嵌入式系统的组成原理及特点。深入研究了嵌入式实时操作系统Linux及linux环境下应用程序的开发,包括linux下设备驱动程序的开发、符合硬件环境的系统引导程序Bootloader和文件系统的、Linux内核的裁剪和移植、嵌入式GUI的开发。依照软件工程学的一般流程对综导显控台从分析、设计、实现进行完整的论述。最后从系统运行的情况来看本论文所设计的基于ARM-Linux的综导显控台基本上满足了用户系统的要求,提高了组合导航系统的实时性。
上传时间: 2013-07-05
上传用户:1406054127
随着Internet的发展和后PC时代的到来,嵌入式系统成为当前IT产业的焦点之一,呈现了巨大的市场需求。具有良好的网络支持和多任务处理能力的嵌入式系统为数据通信提供了新的解决方案。 本文的主要任务是实现接口模块的网络传输功能。该任务来自于某军事预研项目中的定位与指挥系统部分。为了提高终端和接口模块之间的数据传输速度,本文采用带有完整网络支持的嵌入式系统来实现数据传输。同时为了将本次的设计成果应用于以后的项目开发中,本课题还进行了文件系统,系统实时性等多方面的改进,实现了一个通用的功能完善的嵌入式软件平台。 本文选用某S3C4480开发板作为系统硬件平台,嵌入式操作系统选用了专门为无MMU的处理器设计的操作系统uClinux。 本文的主要工作有: ●分析系统功能需求,提出系统方案设计; ●构建网络传输功能所需的系统平台,完成uClinux,Blob的移植工作,并实现断电可保存的jffs2文件系统; ●为了实现网络传输功能,为网络设备RTL8019AS编写驱动;同时为了增强系统的人机交互性能,本文对4x4键盘编写了驱动程序; ● uClinux在实时性方面的缺陷对数据的实时传送有一定影响,所以做了基于RTLinux的外部扩展的实时性的改造,并对任务切换时间进行了测试; ●网络传输程序设计。首先完成了遵循定位与指挥系统中接口通信协议规定的通信数据的打包和解包。然后对比测试了TCP和UDP的传输速度。考虑到UDP协议传输的速度优势,在应用层做出了可靠性改造,经过对停等协议和滑动窗口协议的分析和比较,最终采用基于停等协议的改造方法,并完成了具体测试。
上传时间: 2013-04-24
上传用户:TI初学者
基于微处理器的数字PID控制器改变了传统模拟PID控制器参数整定不灵活的问题。但是常规微处理器容易在环境恶劣的情况下出现程序跑飞的问题,如果实现PID软算法的微处理器因为强干扰或其他原因而出现故障,会引起输出值的大幅度变化或停止响应。而FPGA的应用可以从本质上解决这个问题。因此,利用FPGA开发技术,实现智能控制器算法的芯片化,使之能够广泛的用于各种场合,具有很大的应用意义。 首先分析FPGA的内部结构特点,总结FPGA设计技术及开发流程,指出实现结构优化设计,降低设计难度,是扩展设计功能、提高芯片性能和产品性价比的关键。控制系统由四个模块组成,主要包括核心控制器模块、输入输出模块以及人机接口。其中控制器部分为系统的关键部件。在分析FPGA设计结构类型和特点的基础上,提出一种基于FPGA改进型并行结构的PID温度控制器设计方法。在PID算法与FPGA的运算器逻辑映像过程中,采用将补码的加法器代替减法器设计,增加整数运算结果的位扩展处理,进行不同数据类型的整数归一化等不同角度的处理方法融合为一体,可以有效地减少逻辑运算部件。应用Ouartus Ⅱ图形输入与Verilog HDL语言相结合设计实现了PID控制器,用Modelsim仿真验证了设计结果的正确性,用Synplify Pro进行电路综合,在Quaitus Ⅱ软件中实现布局布线,最后生成FPGA的编程文件。根据控制系统的要求,论文设计完成了12位模数AD转换器、数据显示器、按键等相关外围接口电路。 将一阶、纯滞后、大惯性电阻炉温作为控制对象,以EP1C3T144 FPGA为核心,构建PID控制系统。在采用Pt100温度传感器、分辨率为2℃、最大温度控制范围0~400℃的条件下,实验结果表明,达到无超调的稳定控制要求,为降低FPGA实现PID控制器的设计难度提供了有效的方法。
上传时间: 2013-05-24
上传用户:gyq
ICCAVR中文使用说明:ICCAVR 介绍1 ImageCraft 的ICCAVR 介绍ImageCraft 的ICCAVR 是一种使用符合ANSI 标准的C 语言来开发微控制器MCU程序的一个工具它有以下几个主要特点ICCAVR 是一个综合了编辑器和工程管理器的集成工作环境IDE 其可在WINDOWS9X/NT 下工作源文件全部被组织到工程之中文件的编辑和工程的构筑也在这个环境中完成编译错误显示在状态窗口中并且当你用鼠标单击编译错误时光标会自动跳转到编辑窗口中引起错误的那一行这个工程管理器还能直接产生您希望得到的可以直接使用的INTELHEX 格式文件INTEL HEX 格式文件可被大多数的编程器所支持用于下载程序到芯片中去ICCAVR 是一个32 位的程序支持长文件名出于篇幅考虑本说明书并不介绍通用的C 语言语法知识仅介绍使用ICC AVR 所必须具备的知识因此要求读者在阅读本说明书之前应对C 语言有了一定程度的理解2 ICCAVR 中的文件类型及其扩展名文件类型是由它们的扩展名决定的IDE 和编译器可以使用以下几种类型的文件输入文件.c 扩展名----表示是C 语言源文件.s 扩展名----表示是汇编语言源文件.h 扩展名----表示是C 语言的头文件.prj 扩展名----表示是工程文件这个文件保存由IDE 所创建和修改的一个工程的有关信息.a 扩展名----库文件它可以由几个库封装在一起libcavr.a 是一个包含了标准C 的库和AVR 特殊程序调用的基本库如果库被引用链接器会将其链接到您的模块或文件中您也可以创建或修改一个符合你需要的库输出文件.s 对应每个C 语言源文件由编译器在编译时产生的汇编输出文件.o 由汇编文件汇编产生的目标文件多个目标文件可以链接成一个可执行文件.hex INTEL HEX 格式文件其中包含了程序的机器代码.eep INTEL HEX 格式文件包含了EEPROM 的初始化数据.cof COFF 格式输出文件用于在ATMEL 的AvrStudio 环境下进行程序调试.lst 列表文件在这个文件中列举出了目标代码对应的最终地址.mp 内存映象文件它包含了您程序中有关符号及其所占内存大小的信息.cmd NoICE 2.xx 调试命令文件.noi NoICE 3.xx 调试命令文件.dbg ImageCraft 调试命令文件
上传时间: 2013-10-29
上传用户:truth12
C8051Fxxx 系列单片机是完全集成的混合信号系统级芯片,具有与8051 兼容的微控制器内核,与MCS-51 指令集完全兼容。除了具有标准8052 的数字外设部件之外,片内还集成了数据采集和控制系统中常用的模拟部件和其它数字外设及功能部件。参见表1.1 的产品选择指南可快速查看每个MCU 的特性。 MCU 中的外设或功能部件包括模拟多路选择器、可编程增益放大器、ADC、DAC、电压比较器、电压基准、温度传感器、SMBus/ I2C、UART、SPI、可编程计数器/定时器阵列(PCA)、定时器、数字I/O 端口、电源监视器、看门狗定时器(WDT)和时钟振荡器等。所有器件都有内置的FLASH 程序存储器和256 字节的内部RAM,有些器件内部还有位于外部数据存储器空间的RAM,即XRAM。C8051Fxxx 单片机采用流水线结构,机器周期由标准的12 个系统时钟周期降为1 个系统时钟周期,处理能力大大提高,峰值性能可达25MIPS。C8051Fxxx 单片机是真正能独立工作的片上系统(SOC)。每个MCU 都能有效地管理模拟和数字外设,可以关闭单个或全部外设以节省功耗。FLASH 存储器还具有在系统重新编程能力,可用于非易失性数据存储,并允许现场更新8051 固件。应用程序可以使用MOVC 和MOVX 指令对FLASH 进行读或改写,每次读或写一个字节。这一特性允许将程序存储器用于非易失性数据存储以及在软件控制下更新程序代码。片内JTAG 调试支持功能允许使用安装在最终应用系统上的产品MCU 进行非侵入式(不占用片内资源)、全速、在系统调试。该调试系统支持观察和修改存储器和寄存器,支持断点、单步、运行和停机命令。在使用JTAG 调试时,所有的模拟和数字外设都可全功能运行。每个MCU 都可在工业温度范围(-45℃到+85℃)内用2.7V-3.6V(F018/019 为2.8V-3.6V)的电压工作。端口I/O、/RST 和JTAG 引脚都容许5V 的输入信号电压。
上传时间: 2013-11-14
上传用户:jiangshandz
VxWorks是WindRiver(风河)公司开发的嵌入式实时操作系统(RTOS),由于它的高实时性,所以广泛地应用于军事、工业控制、通信等领域;分析了VxWorks下PCI总线多功能数据采集卡的实现方法;以ADLINK的PCI7396数据采集卡为例,介绍PCI总线设备的配置空间,包括它的结构及访问方法,重点介绍PCI总线设备在VxWorks下驱动程序的开发步骤及编程要点,并对开发过程中的关键部分给予代码说明;在某综合控制系统中,开发的驱动程序运行稳定、可靠。
上传时间: 2013-11-02
上传用户:masochism
注:1.这篇文章断断续续写了很久,画图技术也不精,难免错漏,大家凑合看.有问题可以留言. 2.论坛排版把我的代码缩进全弄没了,大家将代码粘贴到arduino编译器,然后按ctrl+T重新格式化代码格式即可看的舒服. 一、什么是PWM PWM 即Pulse Wavelength Modulation 脉宽调制波,通过调整输出信号占空比,从而达到改 变输出平均电压的目的。相信Arduino 的PWM 大家都不陌生,在Arduino Duemilanove 2009 中,有6 个8 位精度PWM 引脚,分别是3, 5, 6, 9, 10, 11 脚。我们可以使用analogWrite()控 制PWM 脚输出频率大概在500Hz 的左右的PWM 调制波。分辨率8 位即2 的8 次方等于 256 级精度。但是有时候我们会觉得6 个PWM 引脚不够用。比如我们做一个10 路灯调光, 就需要有10 个PWM 脚。Arduino Duemilanove 2009 有13 个数字输出脚,如果它们都可以 PWM 的话,就能满足条件了。于是本文介绍用软件模拟PWM。 二、Arduino 软件模拟PWM Arduino PWM 调压原理:PWM 有好几种方法。而Arduino 因为电源和实现难度限制,一般 使用周期恒定,占空比变化的单极性PWM。 通过调整一个周期里面输出脚高/低电平的时间比(即是占空比)去获得给一个用电器不同 的平均功率。 如图所示,假设PWM 波形周期1ms(即1kHz),分辨率1000 级。那么需要一个信号时间 精度1ms/1000=1us 的信号源,即1MHz。所以说,PWM 的实现难点在于需要使用很高频的 信号源,才能获得快速与高精度。下面先由一个简单的PWM 程序开始: const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { if((bright++) == 255) bright = 0; for(int i = 0; i < 255; i++) { if(i < bright) { digitalWrite(PWMPin, HIGH); delayMicroseconds(30); } else { digitalWrite(PWMPin, LOW); delayMicroseconds(30); } } } 这是一个软件PWM 控制Arduino D13 引脚的例子。只需要一块Arduino 即可测试此代码。 程序解析:由for 循环可以看出,完成一个PWM 周期,共循环255 次。 假设bright=100 时候,在第0~100 次循环中,i 等于1 到99 均小于bright,于是输出PWMPin 高电平; 然后第100 到255 次循环里面,i 等于100~255 大于bright,于是输出PWMPin 低电平。无 论输出高低电平都保持30us。 那么说,如果bright=100 的话,就有100 次循环是高电平,155 次循环是低电平。 如果忽略指令执行时间的话,这次的PWM 波形占空比为100/255,如果调整bright 的值, 就能改变接在D13 的LED 的亮度。 这里设置了每次for 循环之后,将bright 加一,并且当bright 加到255 时归0。所以,我们 看到的最终效果就是LED 慢慢变亮,到顶之后然后突然暗回去重新变亮。 这是最基本的PWM 方法,也应该是大家想的比较多的想法。 然后介绍一个简单一点的。思维风格完全不同。不过对于驱动一个LED 来说,效果与上面 的程序一样。 const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { digitalWrite(PWMPin, HIGH); delayMicroseconds(bright*30); digitalWrite(PWMPin, LOW); delayMicroseconds((255 - bright)*30); if((bright++) == 255) bright = 0; } 可以看出,这段代码少了一个For 循环。它先输出一个高电平,然后维持(bright*30)us。然 后输出一个低电平,维持时间((255-bright)*30)us。这样两次高低就能完成一个PWM 周期。 分辨率也是255。 三、多引脚PWM Arduino 本身已有PWM 引脚并且运行起来不占CPU 时间,所以软件模拟一个引脚的PWM 完全没有实用意义。我们软件模拟的价值在于:他能将任意的数字IO 口变成PWM 引脚。 当一片Arduino 要同时控制多个PWM,并且没有其他重任务的时候,就要用软件PWM 了。 多引脚PWM 有一种下面的方式: int brights[14] = {0}; //定义14个引脚的初始亮度,可以随意设置 int StartPWMPin = 0, EndPWMPin = 13; //设置D0~D13为PWM 引脚 int PWMResolution = 255; //设置PWM 占空比分辨率 void setup() { //定义所有IO 端输出 for(int i = StartPWMPin; i <= EndPWMPin; i++) { pinMode(i, OUTPUT); //随便定义个初始亮度,便于观察 brights[ i ] = random(0, 255); } } void loop() { //这for 循环是为14盏灯做渐亮的。每次Arduino loop()循环, //brights 自增一次。直到brights=255时候,将brights 置零重新计数。 for(int i = StartPWMPin; i <= EndPWMPin; i++) { if((brights[i]++) == PWMResolution) brights[i] = 0; } for(int i = 0; i <= PWMResolution; i++) //i 是计数一个PWM 周期 { for(int j = StartPWMPin; j <= EndPWMPin; j++) //每个PWM 周期均遍历所有引脚 { if(i < brights[j])\ 所以我们要更改PWM 周期的话,我们将精度(代码里面的变量:PWMResolution)降低就行,比如一般调整LED 亮度的话,我们用64 级精度就行。这样速度就是2x32x64=4ms。就不会闪了。
上传时间: 2013-10-08
上传用户:dingdingcandy
注:1.这篇文章断断续续写了很久,画图技术也不精,难免错漏,大家凑合看.有问题可以留言. 2.论坛排版把我的代码缩进全弄没了,大家将代码粘贴到arduino编译器,然后按ctrl+T重新格式化代码格式即可看的舒服. 一、什么是PWM PWM 即Pulse Wavelength Modulation 脉宽调制波,通过调整输出信号占空比,从而达到改 变输出平均电压的目的。相信Arduino 的PWM 大家都不陌生,在Arduino Duemilanove 2009 中,有6 个8 位精度PWM 引脚,分别是3, 5, 6, 9, 10, 11 脚。我们可以使用analogWrite()控 制PWM 脚输出频率大概在500Hz 的左右的PWM 调制波。分辨率8 位即2 的8 次方等于 256 级精度。但是有时候我们会觉得6 个PWM 引脚不够用。比如我们做一个10 路灯调光, 就需要有10 个PWM 脚。Arduino Duemilanove 2009 有13 个数字输出脚,如果它们都可以 PWM 的话,就能满足条件了。于是本文介绍用软件模拟PWM。 二、Arduino 软件模拟PWM Arduino PWM 调压原理:PWM 有好几种方法。而Arduino 因为电源和实现难度限制,一般 使用周期恒定,占空比变化的单极性PWM。 通过调整一个周期里面输出脚高/低电平的时间比(即是占空比)去获得给一个用电器不同 的平均功率。 如图所示,假设PWM 波形周期1ms(即1kHz),分辨率1000 级。那么需要一个信号时间 精度1ms/1000=1us 的信号源,即1MHz。所以说,PWM 的实现难点在于需要使用很高频的 信号源,才能获得快速与高精度。下面先由一个简单的PWM 程序开始: const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { if((bright++) == 255) bright = 0; for(int i = 0; i < 255; i++) { if(i < bright) { digitalWrite(PWMPin, HIGH); delayMicroseconds(30); } else { digitalWrite(PWMPin, LOW); delayMicroseconds(30); } } } 这是一个软件PWM 控制Arduino D13 引脚的例子。只需要一块Arduino 即可测试此代码。 程序解析:由for 循环可以看出,完成一个PWM 周期,共循环255 次。 假设bright=100 时候,在第0~100 次循环中,i 等于1 到99 均小于bright,于是输出PWMPin 高电平; 然后第100 到255 次循环里面,i 等于100~255 大于bright,于是输出PWMPin 低电平。无 论输出高低电平都保持30us。 那么说,如果bright=100 的话,就有100 次循环是高电平,155 次循环是低电平。 如果忽略指令执行时间的话,这次的PWM 波形占空比为100/255,如果调整bright 的值, 就能改变接在D13 的LED 的亮度。 这里设置了每次for 循环之后,将bright 加一,并且当bright 加到255 时归0。所以,我们 看到的最终效果就是LED 慢慢变亮,到顶之后然后突然暗回去重新变亮。 这是最基本的PWM 方法,也应该是大家想的比较多的想法。 然后介绍一个简单一点的。思维风格完全不同。不过对于驱动一个LED 来说,效果与上面 的程序一样。 const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { digitalWrite(PWMPin, HIGH); delayMicroseconds(bright*30); digitalWrite(PWMPin, LOW); delayMicroseconds((255 - bright)*30); if((bright++) == 255) bright = 0; } 可以看出,这段代码少了一个For 循环。它先输出一个高电平,然后维持(bright*30)us。然 后输出一个低电平,维持时间((255-bright)*30)us。这样两次高低就能完成一个PWM 周期。 分辨率也是255。 三、多引脚PWM Arduino 本身已有PWM 引脚并且运行起来不占CPU 时间,所以软件模拟一个引脚的PWM 完全没有实用意义。我们软件模拟的价值在于:他能将任意的数字IO 口变成PWM 引脚。 当一片Arduino 要同时控制多个PWM,并且没有其他重任务的时候,就要用软件PWM 了。 多引脚PWM 有一种下面的方式: int brights[14] = {0}; //定义14个引脚的初始亮度,可以随意设置 int StartPWMPin = 0, EndPWMPin = 13; //设置D0~D13为PWM 引脚 int PWMResolution = 255; //设置PWM 占空比分辨率 void setup() { //定义所有IO 端输出 for(int i = StartPWMPin; i <= EndPWMPin; i++) { pinMode(i, OUTPUT); //随便定义个初始亮度,便于观察 brights[ i ] = random(0, 255); } } void loop() { //这for 循环是为14盏灯做渐亮的。每次Arduino loop()循环, //brights 自增一次。直到brights=255时候,将brights 置零重新计数。 for(int i = StartPWMPin; i <= EndPWMPin; i++) { if((brights[i]++) == PWMResolution) brights[i] = 0; } for(int i = 0; i <= PWMResolution; i++) //i 是计数一个PWM 周期 { for(int j = StartPWMPin; j <= EndPWMPin; j++) //每个PWM 周期均遍历所有引脚 { if(i < brights[j])\ 所以我们要更改PWM 周期的话,我们将精度(代码里面的变量:PWMResolution)降低就行,比如一般调整LED 亮度的话,我们用64 级精度就行。这样速度就是2x32x64=4ms。就不会闪了。
上传时间: 2013-10-23
上传用户:mqien