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 ...
随机推荐
- 蓝牙/zigbee/nrr24xx
目前使用的短距离无线通信技术及标准主要有Bluetooth.WIFI.ZigBee.UWB.NRF24XX系列产品等.Nordic公司生产的单片集成射频无线收发器NRF24XX系列芯片具有低功耗.支持 ...
- 李彦宏AI大会现场:3秒钟事故30分钟专注
编辑 | 于斌 出品 | 于见(mpyujian) 很多人只看到了舞台上3秒钟的事故,却没有看到李彦宏在台上30分钟的专注. 7月3号,百度AI开发者大会上,李彦宏遭遇了3秒钟的突然袭击,他表现的沉着 ...
- js中字符串转json对象时报错: Uncaught SyntaxError: Unexpected token s in JSON at position 2
解决方法: js中获取jsp的返回值 var json='${channels}' var channels = JSON.parse(json);就报上面的错. json的值最终会转成这种json格 ...
- jsp分割字符串并遍历
1.先引入JSTL库 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> ...
- Python 爬取 热词并进行分类数据分析-[JSP演示+页面跳转]
日期:2020.02.03 博客期:142 星期一 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入] c.[拓扑 ...
- MySQL(window10)加载配置文件的顺序
mysql加载配置的顺序为:(mysql --help中有详细的说明) C:\WINDOWS\my.ini C:\WINDOWS\my.cnf C:\my.ini C:\my.cnf D:***\my ...
- 五 Action访问方法,method配置,通配符(常用),动态
1 通过method配置(有点low) 建立前端JSP:demo4.jsp <%@ page language="java" contentType="text/h ...
- 【剑指Offer面试编程题】题目1507:不用加减乘除做加法--九度OJ
题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为两个整数m和n(1<=m,n<=10 ...
- k短路算法
k短路算法 求解k短路用到了A* 算法,A* ( A star )算法,又称启发式搜索算法,与之相对的,dfs与bfs都成为盲目型搜索:即为带有估价函数的优先队列BFS称为A*算法. 该算法的核心思想 ...
- python3 引入selenium库报错ModuleNotFoundError: No module named 'selenium'
解决方法: pip install -U selenium