PWM与时间片思想
改编自: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与时间片思想的更多相关文章
- (Mark)操作系统原理
Q:什么是中断?A:中断嘛,举个容易理解的例子吧. 比如莲莲和唐唐在下象棋,眼看莲莲就快招架不住了,正当此紧要关头,唐唐的女友来了,非要唐唐陪她上街买衣服不可(唐唐晕倒:-) ),于是唐唐不得不同 ...
- Linux哲学思想--基本法则
1.一切皆文件: 2.单一目的的小程序: 3.组合小程序完成复杂任务: 4.文本文件保存配置信息: 5.尽量避免捕获用户接口: 6.提供机制,而非策略. 自从Linux一诞生就注定了其成为经典的命运. ...
- Linux2.6内核进程调度系列--scheduler_tick()函数1.总体思想
参考的是ULK第三版,Linux2.6.11.12内核版本. 调度程序依靠几个函数来完成调度工作,其中最重要的第一个函数是scheduler_tick函数,主要步骤如下: /** * 维持当前最新的t ...
- linux内核调度算法(2)--CPU时间片如何分配 转!
http://blog.csdn.net/russell_tao/article/details/7103012 内核在微观上,把CPU的运行时间分成许多分,然后安排给各个进程轮流运行,造成宏观上所有 ...
- (原创)基于MCU的频率可调,占空比可调的PWM实现(MCU,MCS-51/MSP430)
1.Abstract 做这个是受朋友之邀,用在控制电机转动的方面.他刚好在一家好的单位实习,手头工作比较多,无暇分身,所以找我帮忙做个模型.要求很明晰,PWM的频率在0~1KHz范围内,占空比 ...
- 精准控制PWM脉冲的频率和数量
在一些项目中,我们经常要控制PWM脉冲的频率和数量,比如步进电机的控制等,下面分享一个程序是关于这方面的,程序的思想就是通过STM32的定时器来输出PWM波,并开启定时器中断,在中断里面计数脉冲的数量 ...
- 《Java编程思想》笔记 第二十一章 并发
1.定义任务 实现Runnable 接口的类就是任务类(任务类不一定是实现Runnable接口的类). 实现Runnable 接口,重写run()方法,run方法的返回值只能是 void 任务类就是表 ...
- Java编程思想 第21章 并发
这是在2013年的笔记整理.现在重新拿出来,放在网上,重新总结下. 两种基本的线程实现方式 以及中断 package thread; /** * * @author zjf * @create_tim ...
- Java编程思想 笔记
date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...
随机推荐
- 第3章 Java基本的程序设计结构
3.运算符 浅谈java中源码常见的几个关键字(native,strictfp,transient,volatile) 需要注意 , 整数被 0 除将会产生一个异常, 而浮点数被0 除将会得到无穷大或 ...
- vue 项目中的less
收先要在cmd中运行 npm install less less-loader --save 然后会在 moudules文件夹中生成less 和less-loader <style lang=& ...
- [ DLPytorch ] 循环神经网络进阶&拟合问题&梯度消失与爆炸
循环神经网络进阶 BPTT 反向传播过程中,训练模型通常需要模型参数的梯度. \[ \frac{\partial L}{\partial \boldsymbol{W}_{qh}} = \sum_{t= ...
- 设计模式课程 设计模式精讲 3-11 合成复用原则coding
1 课堂概念 1.0 继承关系的选择 1.1 起名 1.2 定义 1.3 组合聚合优缺点 1.4 继承优缺点 1.5 组合聚合区别 2 代码演练 2.1 反例 2.2 正例 3 疑问解答3.1 疑问解 ...
- Flask - flask-mail
flasky中git reset --hard 8e 问题 使用flask-mail通过163邮箱的smtp服务发送token认证邮件,要关闭TLS才能发送 原理 还在研究中 结果
- Sonic_cli常用命令
用户名:admin 密码:YourPaSsWoRd //change password1>admin@sonic:~$ passwdChanging password for admin.(cu ...
- Java基础 -3.2
逻辑运算符 三目(赋值)运算符 合理地利用三目运算可以避免一些大范围的程序编写 三目运算是一种所谓的赋值运算的处理 它是需要设置一个逻辑关系的判断之后才可以进行的赋值操作 基本语法: 关系运算?关系满 ...
- windows下svn post-commit的实现
前言: 好的!在结束了上一博客教程的Subversion安装之后.我们开始了下一项工作,windows版本下 svn post-commit的实现.说实话,这方面的知识网上的知识并不是很多~~~~~~ ...
- 一、log4j日志框架的理论和不同场景使用
1.日志框架: 工作中要进行Java输出日志时,你需要一个或者多个日志框架.框架能提供对象.方法和必要的配置来发送日志信息.Java语言本身有自带的日志实现包java.util.logging.还有很 ...
- jsp 防止表单多次提交
1:首先java 后台代码生成一个token,然后保存到jsp 页面的一个隐藏控件并且保存到set session中 */ @RequestMapping("/yuDengJi") ...