一、什么是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. axis、xfire、CXF 、JWS

    1.JWS是Java语言对WebService服务的一种实现,用来开发和发布服务.而从服务本身的角度来看JWS服务是没有语言界限的.但是Java语言为Java开发者提供便捷发布和调用WebServic ...

  2. 织梦DEDE后台定时分时段自动更新发布文章插件

    定时审核插件使用说明 一.立信CPA培训注册会计师考试网站 以超级管理员身份登录后台,依次选择[核心]à [定时审核管理],输入定时审核的时间段,如下图所示: 功能说明: 1. 可以设置若干时间段,在 ...

  3. hdu 1514 Free Candies 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1514 题目意思:有4堆糖果,每堆糖果有n个,从上到下排好,取糖果只能从上往下取,取完的糖果放在篮子里, ...

  4. 前端CSS规范整理

    一.文件规范 1.文件均归档至约定的目录中. 具体要求通过豆瓣的CSS规范进行讲解: 所有的CSS分为两大类:通用类和业务类.通用的CSS文件,放在如下目录中: 基本样式库 /css/core 通用U ...

  5. PostgreSQL新手教程

    自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选. 本文介绍PostgreSQL的安装和基本用法,供初次使用者上手.以下内容基于Debian操作系统,其他操作系 ...

  6. 给jenkins设置管理员

    1.点击jenkins web 页的Manage Jenkins,然后点击 Configre Global Security,进行安全配置: 2.启用安全设置,使用Jenkins 自带数据库,只允许登 ...

  7. Java递归应用:输出树形菜单

    转自:https://blog.csdn.net/zhangzeyuaaa/article/details/24574769

  8. 泛型Class<T>和 T. <T>

    private T product; private Class<T> product; 这两个有什么区别呢,查了资料才知道,单独的T 代表一个类型 而 Class<T>代表这 ...

  9. hadoop中的序列化

    此文已由作者肖凡授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 最近在学习hadoop,发现hadoop的序列化过程和jdk的序列化有很大的区别,下面就来说说这两者的区别都有 ...

  10. 考拉定时任务框架kSchedule

    此文已由作者杨凯明授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.背景 目前项目中使用的定时任务框架存在下面这些问题 没有统一的定时任务管理平台 目前项目中使用定时任务的 ...