注: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
太原理工大学硕 士 学 位 论 文 摘 要 派送调度问题是物流管理领域中一个重要的课题,是大型 超市集团、大型零售连锁店、物流派送中心及工业生产企业共 同存在的问题。随着跨地区、跨地域的经济活动日益加强,迫 切要求解决物资流通当中合理调度运输工具的问题来有效实现 企业生产计划、减少物资库存,从而提高工商企业的生产效率。 目前对于派送调度问题的研究主要集中在对运输工具的配置和 静态调度领域,这些研究工作已经取得了丰富的成果,并且研 究结果也主要应用于决策和管理方面。但是对于运输工具运行 情况变化和派送任务动态产生和调整关注较少,同时,在线派 送调度的计算机系统产品也较少
上传时间: 2015-03-17
上传用户:cjl42111
IC卡操作软件:AT88SCl604芯片的操作模式有五种。它们是通过配PGM、RST、CLK等引脚信号及内部地址计数器(IAC)的状态组合来实现。 (1) 芯片复位操作: AT88SCl604有两种复位方式:上电复位和控制复位。 上电复位: 上电复位是当芯片加电时的最初状态。上电复位属于芯片 内部复位。它将使芯片内部所有的隐含标志复位到"0"状态。并使地址计数器复位到0位。 控制复位: 当CLK为低时,在RST脚上的一个下降沿将便芯片产生复位操作。 控制复位是将地址计数器复位到0位,而不影响任何内部标志的状态。
上传时间: 2015-03-27
上传用户:我们的船长
8位相 加乘法器,具有高速,占用资源较少的优点
上传时间: 2014-08-06
上传用户:zhangjinzj
详细介绍了MICROCHIP公司推出的16位的,具有哈佛结构的,更大存储空间的,存储器分段管理的PIC18系列单片机的C语言编程指南
上传时间: 2014-10-31
上传用户:leixinzhuo
大学vhdl语言实验大全,基于max-plus2平台,内有8-3译码器,8位加法器,数字钟,数码显示,74ls138,8,4位计数器,d,rs触发器,加法器,交通灯等,此原码基于长江大学可编程器件实验箱,如要运行在其他平台上需要重新定义管脚
上传时间: 2013-12-23
上传用户:qiaoyue
实现pc机键盘(p/s2接口)与8位单片机连接使用 原理:键盘时钟接在p3.2口,既8051的外部中断int0上,键盘数据接到p1.0上 每次按键,键盘会向单片机发脉冲使单片机发生外部中断,数据有p1.0口一位一位传进来 传回的数据格式为:1位开始位(0),8位数据位(所按按键的通码,用来识别按键),1位校验位(奇校验) 1位结束位(1) 实现:将键盘发回的数据放到一个缓冲区里(数组),当按键结束后发生内部中断来处理所按的按键 缺点:由于51单片机的容量有限所以缓冲区不可以开的太大,这就导致可以记录键盘的按键次数过少, 也就是容错性一般。不过如果正常使用键盘是不会出错的
上传时间: 2013-12-05
上传用户:清风冷雨
这次自已做的美工,可能很难看,但主要是为提高效率,这次全部生成了静态,只有一个链接查看最新文章的列表没有生成,因为我觉得没必要生成,浪费空间大小,那是一个很少用到的功能!这次去掉了很多功能,这个版本主要是面向那些需要做文章站,或者教程站,当然你也可以做娱乐站,呵,把公司的那部分出掉了,体现出来的是更多的文章部分,这个系统是属于我的一个整站系统中的一个子系统,整站系统中包括下载部分,会员部分,供求,留言,论坛,当然,论坛会用别人的,我自已去写也写不了别人那么好!说了这么久的费话了,来说说他的功能吧! 续继是整站生成静态,让一些经常变动的东西通过JS调用后可以直接显示最新的,不需要再经常去后台更新 比上一个版本中多的功能基本上全在前台
上传时间: 2015-05-19
上传用户:思琦琦
/* shiyan.c 第四组数据结构实验作业。Author:zhg 功能:本程序用于验证函数 LocateElem(L,e,compare()) 。即求出现行表中元素的位序。 程序中的线性表采用顺序存储,以更方便于该操作的实现。 */
标签: LocateElem compare shiyan Author
上传时间: 2015-08-04
上传用户:stampede
可以将以bit为单位进行处理的算法扩展到8位,即以Byte为单位进行处理。由于有8个bit,所以有2^8种选择。这样明显会使运行时 间大为减少,速度明显更快,但是也有它的缺点,即,占用资源太大,所以综合考虑速度和 资源两点,采用半字节查表法。即以半 Byte为单位进行处理。由于有4个bit,所以有2^4种选择。
上传时间: 2014-12-20
上传用户:小宝爱考拉