一、什么是PWM?

1、科普一下什么是PWM,嘿嘿,莫闲啰嗦,好好看看,可能大多数人听过,但可能没详细了解过,至此不妨花费几分钟,详细了解哈,PWM中文译名为:脉冲宽度调制,即控制电路在输出频率不变的情况下,通过微控制器控制电平在一个周期内输出高低电平的比例来等效出模拟电压的大小。举个“栗子”吧:

若电池9V,设9V工作时灯状态为全亮,1.8V工作时为微亮。

若开关持续20%时间通,80%时间断,则可近似为用一个1.8V(9V*20%)的电池持续供电,此时为半亮。当然,开关通断时间需要特别短,否则,比如20s通80s断,灯泡会20s全亮,80s灭,而达不到微亮的效果。

在上述例子中,即将持续通断高低电平代替模拟信号(1.8V)。

占空比为:正脉冲的持续时间与脉冲总周期的比值。此例中占空比即为20%。(尊重原创)

--------------------- 本文来自 HejaBVB 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/u013131866/article/details/36672671?utm_source=copy

二、软件如何模拟

1、上面已经解释了什么是脉宽调制PWM,我们使用单片机模拟的思路是,首先使用单片机定时器来定个最小分辨的时间t;

2、在定时器中断中,设置一个标志位(pwm_time),每次进中断,也就是每隔 t 时间加1,这就是我们要产生的PWM频率,则PWM周期为(100xt),频率为1/(100xt);

3、再设置在100个t中,需要n个高电平(1)则需要的低电平(0)为(100-n)个,其实这个就是调节占空比(高电平时间占整个周期时间的比值);

4、举个“栗子”,假如我要产生一个PWM频率是1Khz ,占空比为 20%的信号,则,需要首先计算出,最小分辨时间t,1Khz的频率,则周期为1ms=1000us,则t=1000us/100=10us;n呢,就是n/100%=20%,n=20;

三、程序示例

 unsigned char pwm_time=;
unsigned char pwm_r_data=;
unsigned char pwm_g_data=;
unsigned char pwm_b_data=;
/*
使用定时器T1,设定中断时间为10us,在中断函数面,设置一个标志位(pwm_time),来确定产生的PWM频率
因为这里我们是产生周期为1ms(1kHZ)的PWM,所以可设置中断的时间基准为0.01ms,,然后中断100次即为1ms。在中断子程序内,可设置一个变量如pwm_time,在中断子程序内,有三条重要的语句: 1、当time>=100时,time清零(此语句保证频率为1kHZ); 2、当time>n时(n应该在0-100之间变化开),让单片相应的I/O口输出低电平; 3、当time<=n时,让单片相应的I/O口输出高电平,此时占空比就为%n。 */ void IO_init() //设置P0.0口为上拉输入,(INT0),P0.1-P0.3为推挽输出
{
P0DPL=0XA9;
} void pwm_init()
{
TMOD=TMOD|0X20; //定时器T1设置为模式2 8位自动重载模式
TIMPRS=0X00; //定时器工作时钟位PCLK/2 2分频
TR1=; //开启定时器T1
TL1=; //约10us,示波器测得
TH1=TL1; //8位自动重载
ET1=; //允许定时器T1中断
EA=; //开总中断
}
void LED_PWM(unsigned char a,unsigned char b,unsigned char c) //三路PWM,R/G/B
{
pwm_r_data=a;
pwm_g_data=b;
pwm_b_data=c;
}
void main()
{
SPKEY=0X36; //打开写保护开关
CKDS=0X03; //4分频 MLCK=pclk=32mhz/4=8mhz 主时钟频率为8MHz
IO_init(); //I/O口初始化
pwm_init(); //定时器初始化
LED_PWM(,,);
while();
}
void timer1(void) interrupt //定时器T1中断函数入口 //10us进一次中断 10usX100=1000us=1ms f=1/1ms=1Khz
{
pwm_time++;
if(pwm_time>=) pwm_time=; if(pwm_time<=pwm_r_data) R=;
else R=; if(pwm_time<=pwm_g_data) G=;
else G=; if(pwm_time<=pwm_b_data) B=;
else B=;
}

分享一个实用任意路数PWM函数的更多相关文章

  1. 分享一个彻底冻结对象的函数——来自阮一峰老师的《ECMAScript 6 入门》

    var constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( (key, i) => { if ( ...

  2. 分享一个PHP调用RestFul接口的函数

    php越来越前端化,大型系统中的php经常是调用后端服务的接口,这里分享一个函数.希望对大家有用. /** * [http 调用接口函数] * @Date 2016-07-11 * @Author G ...

  3. 分享一个获取代理ip的python函数

    分享一个获取代理ip的python函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #coding:utf-8 from bs4 import Beaut ...

  4. C# PDF Page操作——设置页面切换按钮 C# 添加、读取Word脚注尾注 C#为什么不能像C/C++一样的支持函数只读传参 web 给大家分享一个好玩的东西,也许你那块就用的到

    C# PDF Page操作——设置页面切换按钮   概述 在以下示例中,将介绍在PDF文档页面设置页面切换按钮的方法.示例中将页面切换按钮的添加分为了两种情况,一种是设置按钮跳转到首页.下页.上页或者 ...

  5. 非常实用的PHP常用函数汇总

    这篇文章主要介绍了非常实用的PHP常用函数,汇总了加密解密.字符串操作.文件操作.SQL注入等函数的实例与用法说明,在PHP项目开发中非常具有实用价值,需要的朋友可以参考下 本文实例总结了一些在php ...

  6. “makefile”写法详解,一步一步写一个实用的makefile,详解 sed 's,$∗\.o[ :]*,\1.o $@ : ,g' < $@.

    目的:编写一个实用的makefile,能自动编译当前目录下所有.c/.cpp源文件,支持二者混合编译.并且当某个.c/.cpp..h或依赖的源文件被修改后,仅重编涉及到的源文件,未涉及的不编译. 二要 ...

  7. 分享一个MySQL分库分表备份脚本(原)

    分享一个MySQL分库备份脚本(原) 开发思路: 1.路径:规定备份到什么位置,把路径(先判断是否存在,不存在创建一个目录)先定义好,我的路径:/mysql/backup,每个备份用压缩提升效率,带上 ...

  8. [Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手"

    [Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手" 我在学Unity3D,TankSniper(坦克狙击手)这个项目是用来练手的.游戏玩法来自这里(http://ww ...

  9. 分享一个强大的采集类,还可以模拟php多进程

    做采集的时候,可以使用file_get_contents()去获取网页源代码,但是使用file_get_contents采集,速度慢,而且超时时间,不好控制.如果采集的页面不存在,需要等待的时间很长. ...

随机推荐

  1. Wordpress播客网站搭建

  2. C++文件IO操作的简单示例

    CppIODemo1.cpp #include <iostream> #include <fstream> #include <chrono> #define IN ...

  3. poj 2228 Naptime(DP的后效性处理)

    \(Naptime\) \(solution:\) 这道题不做多讲,它和很多区间DP的套路一致,但是这一道题它不允许断环成链,会超时.但是我们发现如果这只奶牛跨夜休息那么它在不跨夜的二十四个小时里一定 ...

  4. Codeforces Round #254 (Div. 2):B. DZY Loves Chemistry

    B. DZY Loves Chemistry time limit per test 1 second memory limit per test 256 megabytes input standa ...

  5. nodejs的request模块

    request模块让http请求变的更加简单.(作为客户端,去请求.抓取另一个网站的信息) request的GitHub主页: https://github.com/request/request 最 ...

  6. goroutine pool,WaitGroup,chan 示例

    服务端高并发编程经常需要写很多goroutine来服务每一个连接,如何正确使用goroutine池是又拍云的工程师们需要考虑的问题,今天这篇文章,分享给同样需要使用go语言的小伙伴们. 文/陶克路 本 ...

  7. POJ3259 Wormholes —— spfa求负环

    题目链接:http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submis ...

  8. dede摘要长度,dedecms摘要限制,dedecms摘要字数

    dede摘要长度,dedecms摘要限制,dedecms摘要字数 如果可以有效控制文章摘要的字数,那么就可以使得页面布局很灵活. 在Dedecms中,在列表页调用文章摘要的方法主要有: 1:[fiel ...

  9. iOS 编程之使用Precompile Prefix Header

    一:为什么Xcode6没有自动创建Precompile Prefix Header 我们在写项目的时候,大部分宏定义,头文件导入都在Precompile Prefix Header文件里面.在Xcod ...

  10. python(二):使用multiprocessing中的常见问题

    简介在python的解释器中,CPython是应用范围最广的一种,其具有丰富的扩展包,方便了开发者的使用.当然CPython也不是完美的,由于全局解释锁(GIL)的存在,python的多线程可以近似看 ...