一、什么是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. Mac OS用minikube安装单节点kubernetes

    参考 https://kubernetes.io/docs/tasks/tools/install-minikube/ https://github.com/linianhui/code/blob/m ...

  2. sql建表,建索引注意事项

    建表注意 .建议字段定义为NOT NULL 搜索引擎 MyISAM InnoDB 区别 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基 ...

  3. ivy

    ivy https://ant.apache.org/ivy/ Apache Ivy™ is a popular dependency manager focusing on flexibility ...

  4. bzoj4103: [Thu Summer Camp 2015]异或运算

    对于每个询问暴力枚举x~y,然后在Trie去找第k大,开始我写了个二分答案然后算比当前答案大的个数,打了个第10个点的表就跑出19s+比bzoj垫底还慢4s+ 然而不用二分,直接1000个点一起在树上 ...

  5. BDB c++例子,从源码编译到运行

    第一步先下载源码,解压后 ./dist/configure --enable-cxx编译,然后make, make install --enable-cxx To build the Berkeley ...

  6. damon

    不管是否有-f参数,最终程序都会进入 fuse_loop_mt 循环中,在helper.c的fuse_main_common函数中. 1. 有-f参数.这种情况下fuse_setup_common函数 ...

  7. uuid.js

    // On creation of a UUID object, set it's initial valuefunction UUID(){    this.id = this.createUUID ...

  8. 【SDOI2012】 Longgue的问题

    [题目链接] 点击打开链接 [算法] gcd(i,n)是n的约数 不妨设gcd(i,n) = d 考虑枚举d和gcd(i,n) = d有多少个 gcd(i,n) = d gcd(i/d,n/d) = ...

  9. kubeadm安装Kubernetes13.1集群-三

    环境: master: 192.168.3.100 node01: 192.168.3.101 node02: 192.168.3.102 关闭所有主机防火墙,selinux: 配置主机互信: mas ...

  10. django上课笔记6-MVC,MTV架构-中间件-初识Form组件

    一.MVC,MTV架构 models(数据库,模型) views(html模板) controllers(业务逻辑处理) --> MVC models(数据库,模型) templates(htm ...