DDS在现在运用月来越广泛,在相对带宽、频率转换时间、相位连续性、正交输出、高分辨力以及集成化等方面都远远超过了传统频率合成技术所能达到的水平,为系统提供了优于模拟信号源的性能。利用DDS技术可以很方便地实现多种信号。在FPGA上实现的DDS
标签: DDS
上传时间: 2013-09-05
上传用户:qwer0574
DDS在现在运用月来越广泛,在相对带宽、频率转换时间、相位连续性、正交输出、高分辨力以及集成化等方面都远远超过了传统频率合成技术所能达到的水平,为系统提供了优于模拟信号源的性能。利用DDS技术可以很方便地实现多种信号。在FPGA上实现的DDS
标签: DDS
上传时间: 2013-12-18
上传用户:
随着海洋勘测技术的发展,研制高性能的海洋测流仪器越来越重要。多普勒声学海流剖面仪就是一种非常重要的用来测量海流速度的仪器。在调试多普勒声学海流剖面仪的过程中,多普勒声学海流剖面仪信号模拟器是很重要的设备,它是数字模拟技术与多普勒声学技术相结合的产物,它通过模拟的方法产生声学海流剖面仪回波信号,以便在不具备实际海洋情况的条件下,可以在实验室环境中对声学海流剖面仪的样机进行系统调试。在此情况下,本文研制了一种声学海流剖面仪信号模拟器,并对声学海流剖面仪回波信号接收过程中使用的算法进行了研究。 本文首先比较了多普勒声学海流剖面仪的发射信号与接收信号之间的关系,分析了产生多普勒频移的原因。选用直接数字频率合成技术(DDS)生成多普勒声学海流剖面仪调试所需要的回波信号o DDS技术克服了传统信号源的频率精度不高和频率不稳等问题。本文选用专用DDS芯片AD9833来实现回波信号的产生,利用ARM嵌入式技术对输出信号进行控制。 信号模拟器以S3C2410处理器为核心构建了硬件平台,采用核心板与扩展板相结合的硬件结构。核心板主要包括了存储系统、网络接口和各种通讯接口。其主要功能是存储大量数据信号和通讯功能;扩展电路包括了16路DDS信号输出及信号调理电路,可以通过软件来配置16路信号相应的工作状态及选择信号输出形式。硬件设计预留了一定数量的I/O接口以备将来扩展之用。 建立嵌入式Linux开发环境;并分析BootLoader启动机制,移植VIVI;通过配置内核相关文件,移植Linux2.4.18内核到模拟器系统;编写16路DDS的驱动程序;设计了模拟器的上位机通讯程序及用应程序;对系统进行了软硬件调试,调试结果表明模拟器完全能够模拟声学海流剖面仪的回波信号。 最后,结合回波信号形式,采用基带解调、复相关等技术对接收回波信号所使用的算法进行了研究,估算出多普勒频移,配合了调试海流剖面仪样机工作的进行。该模拟器不但可以模拟回波信号,还可以作为发射信号来用,大大提高了模拟器的实用性。关键词:声学海流剖面仪;S3C2410; AD9833;嵌入式Linux;回波信号
上传时间: 2013-04-24
上传用户:prczsf
随着频率合成理论和高速大规模集成电路的发展,信号发生器作为一类重要的仪器,在通信、检测、导航等领域有着广泛的应用。特别是在高压电力系统的检测领域,常常需要模拟电网谐波的标准信号源对检测设备的性能进行校验,例如高压电力线路的相位检测,避雷器的性能检测,用户电能表的性能校验等。为此,本文围绕一种新型的参数可调谐波信号发生器进行了研究和设计,课题得到了常州市科技攻关项目的资助。 本文首先论述了频率合成技术的发展,并将直接数字频率合成技术与传统的频率合成技术进行了比较。然后深入研究了DDS的工作原理和基本结构,从频域角度分析了理想参数和实际参数两种情况下DDS的输出频谱。在此基础上,详细分析了引起输出杂散的三个主要因素,并对DDS的杂散抑制方法进行了仿真研究。最后对参数可调谐波信号发生器进行了软硬件设计。 在系统设计的过程中,本文以Altera公司的FPGA芯片EPF10K70RC240-2为核心,利用开发工具MAX+PLUSⅡ并结合硬件描述语言VHDL设计了一种频率、相位、幅度、谐波比例可调的谐波信号发生器。详细阐述了该信号发生器的体系结构,并进行了软硬件的设计和具体电路的实现。实验结果表明,系统的性能指标均达到了设计要求,且具有使用简单、集成度高等特点。
上传时间: 2013-05-20
上传用户:qulele
近年来,随着集成电路工艺技术的进步,电子系统的构成发生了两个重要的变化: 一个是数字信号处理和数字电路成为系统的核心,一个是整个电子系统可以集成在一个芯片上(称为片上系统)。这些变化改变了模拟电路在电子系统中的作用,并且影响着模拟集成电路的发展。 数字电路不仅具有远远超过模拟电路的集成规模,而且具有可编程、灵活、易于附加功能、设计周期短、对噪声和制造工艺误差的抗扰性强等优点,因而大多数复杂系统以数字信号处理和数字电路为核心已成为必然的趋势。虽然如此,模拟电路仍然是电子系统中非常重要的组成部分。这是因为我们接触到的外部世界的物理量主要都是模拟量,比如图像、声音、压力、温度、湿度、重量等,要将它们变换为数字信号,需要模拟信号处理和数据转换电路,如果这些电路性能不够高,将会影响整个系统的性能。其次,系统中的许多功能不可能或很难用数字电路完成,如微弱信号放大,很高频率和宽频带信号的实时处理等。因此,虽然模拟电路在系统中不再是核心,但作为固有的模拟世界与数字系统的接口,其地位和作用仍然十分重要。 片上系统要求将数字电路和模拟电路集成在一个芯片上,这希望模拟电路使用与数字电路相同的制造工艺。随着MOS器件的线宽不断减小,使MOS器件的性能不断提高,MOS数字电路成为数字集成电路的主流,并因此促进了MOS模拟集成电路的迅速发展。为了适应电子系统功能的不断扩展和性能的不断提高,对模拟电路在降低电源电压、提高工作频率、扩大线性工作范围和提高性能指标的精度和稳定度等方面提出更高要求,促进了新电路技术的发展。 作为研究生课程的教材,本书内容是在本科相关课程基础上的深化和扩展,同时涉及实际设计中需要考虑的一些问题,重点介绍具有高工作频率、低电源电压和高工作稳定性的新电路技术和在电子系统中占有重要地位的功能电路及其中的新技术。全书共7章,大致可分为三个部分。第一部分包括第1章和第7章。第1章为MOS模拟集成电路基础,比较全面地介绍MOS器件的工作原理和特性以及由MOS器件构成的基本单元电路,为学习本教材其他内容提供必要的知识。由于版图设计与工艺参数对模拟集成电路性能的影响很大,因此第7章简单介绍制造MOS模拟集成电路的CMOS工艺过程和版图设计技术,读者可以通过对该章所介绍的相关背景知识的了解,更深入地理解MOS器件和电路的特性,有助于更好地完成模拟集成电路的可实现性设计。第二部分为新电路技术,由第2章、第3章和第5章的部分组成,包括近年来逐步获得广泛应用的电流模电路、抽样数据电路和对数域电路,它们在提高工作频率、降低电源电压、扩大线性工作范围和提高性能指标的精度和稳定度方面具有明显的潜力,同时它们也引入了一些模拟电路的新概念。这些内容有助于读者开拓提高电路性能方面的思路。第2章介绍电流模电路的工作原理、特点和典型电路。与传统的以电压作为信号载体的电路不同,这是一种以电流作为信号载体的电路,虽然在电路中电压和电流总是共同存在并相互作用的,但由于信号载体不同,不仅电路性能不同而且电路结构也不同。第3章介绍抽样数据电路的特点和开关电容与开关电流电路的工作原理、分析方法与典型电路。抽样数据电路类似于数字电路,处理的是时间离散信号,又类似于模拟电路,处理的是幅度连续信号,它比模拟电路具有稳定准确的时间常数,解决了模拟电路实际应用中的一大障碍。对数域电路在第5章中结合其在滤波器中的应用介绍,这类电路除具有良好的电性能外,还提出了一种利用器件的非线性特性实现线性电路的新思路。第三部分介绍几个模拟电路的功能模块,它们是电子系统中的关键组成部分,并且与信号和信号处理联系密切,有助于在信号和电路间形成整体观念。这部分包括第4章至第6章。第4章介绍数据转换电路的技术指标和高精度与高速度转换电路的构成、工作原理、特点和典型电路。第5章介绍模拟集成滤波器的设计方法和主要类型,包括连续时间滤波器、对数域滤波器和抽样数据滤波器。第6章介绍通信系统中的收发器与射频前端电路,包括收信器、发信器的技术指标、结构和典型电路。因为载波通信系统传输的是模拟信号,射频前端电路的性能对整个通信系统有直接的影响,所以射频集成电路已成为重要的研究课题。 〖〗高等模拟集成电路〖〗〖〗前言〖〗〖〗本书是在为研究生开设的“高等模拟集成电路”课程讲义的基础上整理而成,由董在望主编,第1、4、7章由李冬梅编写,第6章由王志华编写,第5章由李永明和董在望编写,第2、3章由董在望编写,李国林参加了部分章节的校核工作。 本书可作为信息与通信工程和电子科学与技术学科相关课程的研究生教材或教学参考书,也可作为本科教学参考书或选修课教材和供相关专业的工程技术人员参考。 清华大学出版社多位编辑为本书的出版做了卓有成效的工作,深致谢意。 限于编者水平,难免有错误和疏漏之处,欢迎批评指正。 目录 1.1MOS器件基础及器件模型 1.1.1结构及工作原理 1.1.2衬底调制效应 1.1.3小信号模型 1.1.4亚阈区效应 1.1.5短沟效应 1.1.6SPICE模型 1.2基本放大电路 1.2.1共源(CS)放大电路 1.2.2共漏(CD)放大电路 1.2.3共栅(CG)放大电路 1.2.4共源共栅(CSCG)放大电路 1.2.5差分放大电路 1.3电流源电路 1.3.1二极管连接的MOS器件 1.3.2基本镜像电流源 1.3.3威尔逊电流源 1.3.4共源共栅电流源 1.3.5有源负载放大电路 1.4运算放大器 1.4.1运算放大器的主要参数 1.4.2单级运算放大器 1.4.3两级运算放大器 1.4.4共模反馈(CMFB) 1.4.5运算放大器的频率补偿 1.5模拟开关 1.5.1导通电阻 1.5.2电荷注入与时钟馈通 1.6带隙基准电压源 1.6.1工作原理 1.6.2与CMOS工艺兼容的带隙基准电压源 思考题 2电流模电路 2.1概述 2.1.1电流模电路的概念 2.1.2电流模电路的特点 2.2基本电流模电路 2.2.1电流镜电路 2.2.2电流放大器 2.2.3电流模积分器 2.3电流模功能电路 2.3.1跨导线性电路 2.3.2电流传输器 2.4从电压模电路变换到电流模电路 2.5电流模电路中的非理想效应 2.5.1MOSFET之间的失配 2.5.2寄生电容对频率特性的影响 思考题 3抽样数据电路 3.1开关电容电路和开关电流电路的基本分析方法 3.1.1开关电容电路的时域分析 3.1.2开关电流电路的时域分析 3.1.3抽样数据电路的频域分析 3.2开关电容电路 3.2.1开关电容单元电路 3.2.2开关电容电路的特点 3.2.3非理想因素的影响 3.3开关电流电路 3.3.1开关电流单元电路 3.3.2开关电流电路的特点 3.3.3非理想因素的影响 思考题 4A/D转换器与D/A转换器 4.1概述 4.1.1电子系统中的A/D与D/A转换 4.1.2A/D与D/A转换器的基本原理 4.1.3A/D与D/A转换器的性能指标 4.1.4A/D与D/A转换器的分类 4.1.5A/D与D/A转换器中常用的数码类型 4.2高速A/D转换器 4.2.1全并行结构A/D转换器 4.2.2两步结构A/D转换器 4.2.3插值与折叠结构A/D转换器 4.2.4流水线结构A/D转换器 4.2.5交织结构A/D转换器 4.3高精度A/D转换器 4.3.1逐次逼近型A/D转换器 4.3.2双斜率积分型A/D转换器 4.3.3过采样ΣΔA/D转换器 4.4D/A转换器 4.4.1电阻型D/A转换器 4.4.2电流型D/A转换器 4.4.3电容型D/A转换器 思考题 5集成滤波器 5.1引言 5.1.1滤波器的数学描述 5.1.2滤波器的频率特性 5.1.3滤波器设计的逼近方法 5.2连续时间滤波器 5.2.1连续时间滤波器的设计方法 5.2.2跨导电容(GmC)连续时间滤波器 5.2.3连续时间滤波器的片上自动调节电路 5.3对数域滤波器 5.3.1对数域电路概念及其特点 5.3.2对数域电路基本单元 5.3.3对数域滤波器 5.4抽样数据滤波器 5.4.1设计方法 5.4.2SZ域映射 5.4.3开关电容电路转换为开关电流电路的方法 思考题 6收发器与射频前端电路 6.1通信系统中的射频收发器 6.2集成收信器 6.2.1外差式接收与镜像信号 6.2.2复数信号处理 6.2.3收信器前端结构 6.3集成发信器 6.3.1上变换器 6.3.2发信器结构 6.4收发器的技术指标 6.4.1噪声性能 6.4.2灵敏度 6.4.3失真特性与线性度 6.4.4动态范围 6.5射频电路设计 6.5.1晶体管模型与参数 6.5.2噪声 6.5.3集成无源器件 6.5.4低噪声放大器 6.5.5混频器 6.5.6频率综合器 6.5.7功率放大器 思考题 7CMOS集成电路制造工艺及版图设计 7.1集成电路制造工艺简介 7.1.1单晶生长与衬底制备 7.1.2光刻 7.1.3氧化 7.1.4扩散及离子注入 7.1.5化学气相淀积(CVD) 7.1.6接触与互连 7.2CMOS工艺流程与集成电路中的元件 7.2.1硅栅CMOS工艺流程 7.2.2CMOS集成电路中的无源元件 7.2.3CMOS集成电路中的寄生效应 7.3版图设计 7.3.1硅栅CMOS集成电路的版图构成 7.3.2版图设计规则 7.3.3CMOS版图设计技术 思考题
标签: 模拟集成电路
上传时间: 2013-11-13
上传用户:chengxin
系统是基于AT89S52单片机的数字式低频信号发生器。采用AT89S52 单片机作为控制核心,外围采用数字/模拟转换电路(DAC0832)、稳压电路(MC1403)、运放电路(LM324)、按键和LED显示灯电路等。通过按键控制可产生方波、锯齿波、三角波、正弦波等,同时用LED显示灯指示对应的波形。其设计简单、性能优良,可用于多种需要低频信号源的场所,具有一定的实用性。
上传时间: 2013-11-06
上传用户:fhjdliu
德州仪器 (TI) 处理器几乎能满足您所能想到的各种应用需求。我们阵营强大的处理器系列拥有各种价位、性能及功耗的产品可供选择,能满足几乎任何数字电子设计的要求。利用 TI 广博的系统专业知识、针对外设设计的全方位支持以及随时可方便获得的全套软件与配套模拟组件,您能够实现无穷无尽的设计方案。德州仪器 2008 年第二季度 数字信号处理选择指南TI 数字信号处理技术介绍1Ô数字媒体处理器OMAP应用处理器C6000数字信号处理器C5000数字信号处理器C2000数字信号处理器MSP430微控制器音频汽车通信工业医疗安全监控视频无线主要特性完整的定制型视频解决方案低功耗与高性能高性能低功耗与高性能结合高性能与高集成度可实现更环保的工业应用超低功耗达芬奇数字媒体处理器:针对数字视频而精心优化达芬奇 (DaVinci) 技术包括可扩展的可编程信号处理片上系统 (SoC)、加速器与外设,专为满足各种视频终端设备在性价比与特性方面的要求进行了优化。最新的 OMAP™ 应用处理器:最佳的通用多媒体与图形功能TI 高度可扩展的 OMAP 平台能够以任何单芯片组合实现业界通用多媒体与图形处理功能的最佳组合。最新推出的四款 OMAP35x 器件的目标应用非常广泛,其中包括便携式导航设备、因特网设备、便携式媒体播放器以及个人医疗设备等。最高性能:TMS320C6000™ DSP平台C6000™ DSP 平台可提供业界最高性能的定点与浮点 DSP,理想适用于视频、影像、宽带基础局端以及高性能音频等应用领域。低功耗与高性能相结合:TMS320C5000™ DSP 平台C5000™ DSP 平台不仅可提供业界最低的待机功耗,同时还支持高级自动化电源管理,能够充分满足诸如数字音乐播放器、VoIP、免提终端附件、GPS 接收机以及便携式医疗设备等个人及便携式产品的需求。结合类似 MCU 的控制功能与DSP 的高性能:TMS320C2000™数字信号控制器C2000™ 数字信号控制器 (DSC) 平台融合了控制外设的集成功能与微控制器 (MCU) 的易用性,以及 TI 先进DSP 技术的处理能力和 C 语言编程效率。C2000 DSC 理想适用于嵌入式工业应用,如数字马达控制、数字电源以及智能传感器等。MSP430 超低功耗微控制器平台TI MSP430 系列超低功耗 16 位 RISC 混合信号处理器可为电池供电的测量应用提供具有终极性能的解决方案。TI充分发挥自身在混合信号与数字技术领域卓越的领先优势, 推出的MSP430 使系统设计人员不仅能够同时实现与模拟信号、传感器与数字组件的接口相连,而且还能实现无与伦比的低功耗。轻松易用的软件与开发工具对于加速 DSP 产品开发而言,TMS320™ DSP 获得了 eXpressDSP™ 软件与开发工具的支持,其中包括Code Composer Studio™ IDE、DSP/BIOS™内核、TMS320 DSP 算法标准以及众多可重复使用的模块化软件等,均来自业界最大规模开发商网络。配套模拟产品TI 可提供各种配套的数据转换器、电源管理、放大器、接口与逻辑产品,能够充分满足您设计的整体需求。
上传时间: 2013-10-14
上传用户:jasson5678
单输入单输出(DIN 1X1)无源信号隔离变送器 主要特性 精度等级:0.1级、0.2级、0.5级。产品出厂前已检验校正,用户可以直接使用。 国际标准信号输入: 0-10mA/0-20mA/4-20mA等电流信号。 输出标准信号: 0-10mA/0-20mA/4-20mA等电流信号。 全量程范围内极高的线性度(非线性度
上传时间: 2014-03-31
上传用户:1417818867
注: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