改编自:http://www.moz8.com/thread-79049-1-1.html

什么是PWM?

PWM:脉冲宽度调制,由于在数字电路(或者单片机)输出模拟信号的成本高昂,换句话说,受制于只能输出数字信号,无法正常输出模拟量,如果需要使用数字电路输出模拟量,那么便需要考虑等效的概念。举个例子,单片机只能输出高低电平(5V,0V),如何答案输出2.5V显然是不可能的,但是我们却可以利用等效的概念:

  假设在1秒钟内,前半秒是高电平(5V),后半秒是低电平(0V),那一秒内的平均电压是多少?平均电压就可以当成2.5V。

同理,适用于灯的亮度,电机的转速,甚至是蜂鸣器的响度。

如何产生PWM信号:

#include<reg51.h>

sbit LED_R=P3^;//定义红灯
sbit LED_G=P3^;//定义绿灯
sbit LED_B=P3^;//定义蓝灯 sbit Key1=P3^;//定义按键 unsigned char count; //定义一个数据,记录循环次数 void Delay1ms() //@12.000MHz
{
unsigned char i, j; i = ;
j = ;
do
{
while (--j);
} while (--i);
} void delay_n_ms(unsigned int n) //自己定义的延时n毫秒函数
{
while(n)
{
Delay1ms();
n=n-;//每循环一次n减小1
}
} main()
{
while()
{
count=count+; //每过1ms计数+1
if(count>) //计数大于9重新开始计数,0~9十毫秒周期
{
count=;
} if(>count) //在count 0~9变化中,2大于count的次数是2次。改变2就可以改变占空比
{
LED_R=;
LED_G=;
LED_B=; //2次高电平,LED亮白色
}
else
{
LED_R=;
LED_G=;
LED_B=; //8次低电平,LED熄灭,亮度20%
}
delay_n_ms(); //每循环一次1ms
}
}

PWM与时间片思想

时间片:

CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。

如何设计一个时间片程序:

1.求最小时间片
多个程序对时间的需求是不一样的,要想组合两个程序,就要找到他们的最小时间片。
现在我们有两个程序,按键程序每10ms执行一次,PWM程序每1ms执行一次,所以最小时间片就是1ms!

2.确认系统循环周期
while(1)每循环一次,所有程序执行一遍,相当于系统的一个循环,循环周期就是最小时间片1ms。

3.多程序共用最小时间片
很简单的数学问题,按键程序10ms一次,PWM 1ms一次,只要每执行10次PWM后执行一次按键检测即可。

#include<reg51.h>

sbit LED_R=P3^;//定义红灯
sbit LED_G=P3^;//定义绿灯
sbit LED_B=P3^;//定义蓝灯 sbit Key1=P3^;//定义按键 unsigned char Key1_old; //定义一个数据,记录过去出现低电平
unsigned char time; //定义一个数据,记录时间 unsigned char duty; //定义一个数据,代表占空比
unsigned char count; //定义一个数据,PWM循环次数 void Delay1ms() //@12.000MHz
{
unsigned char i, j; i = ;
j = ;
do
{
while (--j);
} while (--i);
} void delay_n_ms(unsigned int n) //自己定义的延时n毫秒函数
{
while(n)
{
Delay1ms();
n=n-;//每循环一次n减小1
}
} main()
{
Key1_old=; //进入循环前,先初始化标志位。按键还没按下,old是高电平 while()
{
delay_n_ms(); //系统周期,每循环一次1ms count=count+; //每过1ms计数+1
if(count>)
{
count=; //计数大于9后又变成0!,0~9十毫秒PWM周期
} if(duty>count) //在count 0~9变化中,duty大于count的次数就是占空比
{
LED_R=;
LED_G=;
LED_B=; //改变duty改变高电平时间,亮度变化
}
else
{
LED_R=;
LED_G=;
LED_B=;
} time=time+; //1ms计数
if(time>) //time加到10ms,从0开始
{
time=;
if(Key1==)
{
if(Key1_old==) //如果本次是高电平,上次是低电平,检测到按键
{
duty=duty+; //每次按键改变一次亮度
if(duty>)
{
duty=; //10级亮度调节
}
}
} Key1_old=Key1; //保存高低电平
} } }

PWM与时间片思想的更多相关文章

  1. (Mark)操作系统原理

    Q:什么是中断?A:中断嘛,举个容易理解的例子吧.   比如莲莲和唐唐在下象棋,眼看莲莲就快招架不住了,正当此紧要关头,唐唐的女友来了,非要唐唐陪她上街买衣服不可(唐唐晕倒:-) ),于是唐唐不得不同 ...

  2. Linux哲学思想--基本法则

    1.一切皆文件: 2.单一目的的小程序: 3.组合小程序完成复杂任务: 4.文本文件保存配置信息: 5.尽量避免捕获用户接口: 6.提供机制,而非策略. 自从Linux一诞生就注定了其成为经典的命运. ...

  3. Linux2.6内核进程调度系列--scheduler_tick()函数1.总体思想

    参考的是ULK第三版,Linux2.6.11.12内核版本. 调度程序依靠几个函数来完成调度工作,其中最重要的第一个函数是scheduler_tick函数,主要步骤如下: /** * 维持当前最新的t ...

  4. linux内核调度算法(2)--CPU时间片如何分配 转!

    http://blog.csdn.net/russell_tao/article/details/7103012 内核在微观上,把CPU的运行时间分成许多分,然后安排给各个进程轮流运行,造成宏观上所有 ...

  5. (原创)基于MCU的频率可调,占空比可调的PWM实现(MCU,MCS-51/MSP430)

    1.Abstract     做这个是受朋友之邀,用在控制电机转动的方面.他刚好在一家好的单位实习,手头工作比较多,无暇分身,所以找我帮忙做个模型.要求很明晰,PWM的频率在0~1KHz范围内,占空比 ...

  6. 精准控制PWM脉冲的频率和数量

    在一些项目中,我们经常要控制PWM脉冲的频率和数量,比如步进电机的控制等,下面分享一个程序是关于这方面的,程序的思想就是通过STM32的定时器来输出PWM波,并开启定时器中断,在中断里面计数脉冲的数量 ...

  7. 《Java编程思想》笔记 第二十一章 并发

    1.定义任务 实现Runnable 接口的类就是任务类(任务类不一定是实现Runnable接口的类). 实现Runnable 接口,重写run()方法,run方法的返回值只能是 void 任务类就是表 ...

  8. Java编程思想 第21章 并发

    这是在2013年的笔记整理.现在重新拿出来,放在网上,重新总结下. 两种基本的线程实现方式 以及中断 package thread; /** * * @author zjf * @create_tim ...

  9. Java编程思想 笔记

    date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...

随机推荐

  1. Update(Stage4):sparksql:第5节 SparkSQL_出租车利用率分析案例

    目录: 1. 业务2. 流程分析3. 数据读取5. 数据清洗6. 行政区信息 6.1. 需求介绍 6.2. 工具介绍 6.3. 具体实现7. 会话统计 导读 本项目是 SparkSQL 阶段的练习项目 ...

  2. SAM(后缀自动机)总结

    “写sam是肯定会去写的,这样才学的了字符串,后缀数组又不会用 >ω<, sam套上数据结构的感觉就像回家一样! 里面又能剖分又能线段树合并,调试又好调,我爱死这种写法了 !qwq” SA ...

  3. 单元测试及框架简介 --junit、jmock、mockito、powermock的简单使用

    转 单元测试及框架简介 --junit.jmock.mockito.powermock的简单使用 2013年08月28日 14:33:06 luvinahlc 阅读数:6413 标签: 测试工具单元测 ...

  4. scrapy 和 scrapy-redis

    1.scrapy 是一个 Python 爬虫框架,爬取效率极高,但是不支持分布式.而 scrapy-redis 时一套基于 redis 数据库.运行在 scrapy 框架之上的组件,可以让 scrap ...

  5. Java基础 -1.4

    标识符与关键字 对于标识符的组成在Java之中的定义如下:由字母.数字._.$ 组成 其中不能使用Java的保留字(关键字) 其中 $ 一般都有特殊的含义 不建议出现在自己所编写的代码上 关键字 是系 ...

  6. java_3:JVM、JRE、JDK区别和联系

    首先 三者之间存在包含关系JVM + 核心类库 = JREJRE + java开发工具(javac.exe/jar.exe) = JDK 什么是JVM? 我们知道Java语言有一个独特的优点就是可以跨 ...

  7. Linux命令:top命令

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法.top是一个动态显示过程,即可以通过用户按键来不断刷新 ...

  8. PullToRefreshScrollView刷新图标和字体的设定

    首先添加pullrefresh的libaraly 设置下拉刷新上拉加载时的文本和图片,直接在java代码中添加 mPullToRefreshScrollView.getLoadingLayoutPro ...

  9. 丰田开放混动专利后,真能PK赢纯电动汽车吗?

    特斯拉已成为美国汽车市场增速最快的厂商,且在中国建设工厂后又巩固了自身的地位:蔚来.小鹏等互联网造车企业迅速崛起,吸引着风投的强烈关注:全球范围内,纯电动汽车的销量节节攀升--从多个维度看,纯电动汽车 ...

  10. [经验] Unity3D 里怎么制作天空盒(skybox)

    记载一个简单的  天空盒子  的制作方法 第一步: 在 assets 文件夹下新建一个文件夹, 随便取个名字, 不过最好是用来专门管理场景游戏对象的文件夹,    例如放在这个 Skybox 里:  ...