分享一个实用任意路数PWM函数
一、什么是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函数的更多相关文章
- 分享一个彻底冻结对象的函数——来自阮一峰老师的《ECMAScript 6 入门》
var constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( (key, i) => { if ( ...
- 分享一个PHP调用RestFul接口的函数
php越来越前端化,大型系统中的php经常是调用后端服务的接口,这里分享一个函数.希望对大家有用. /** * [http 调用接口函数] * @Date 2016-07-11 * @Author G ...
- 分享一个获取代理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 ...
- C# PDF Page操作——设置页面切换按钮 C# 添加、读取Word脚注尾注 C#为什么不能像C/C++一样的支持函数只读传参 web 给大家分享一个好玩的东西,也许你那块就用的到
C# PDF Page操作——设置页面切换按钮 概述 在以下示例中,将介绍在PDF文档页面设置页面切换按钮的方法.示例中将页面切换按钮的添加分为了两种情况,一种是设置按钮跳转到首页.下页.上页或者 ...
- 非常实用的PHP常用函数汇总
这篇文章主要介绍了非常实用的PHP常用函数,汇总了加密解密.字符串操作.文件操作.SQL注入等函数的实例与用法说明,在PHP项目开发中非常具有实用价值,需要的朋友可以参考下 本文实例总结了一些在php ...
- “makefile”写法详解,一步一步写一个实用的makefile,详解 sed 's,$∗\.o[ :]*,\1.o $@ : ,g' < $@.
目的:编写一个实用的makefile,能自动编译当前目录下所有.c/.cpp源文件,支持二者混合编译.并且当某个.c/.cpp..h或依赖的源文件被修改后,仅重编涉及到的源文件,未涉及的不编译. 二要 ...
- 分享一个MySQL分库分表备份脚本(原)
分享一个MySQL分库备份脚本(原) 开发思路: 1.路径:规定备份到什么位置,把路径(先判断是否存在,不存在创建一个目录)先定义好,我的路径:/mysql/backup,每个备份用压缩提升效率,带上 ...
- [Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手"
[Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手" 我在学Unity3D,TankSniper(坦克狙击手)这个项目是用来练手的.游戏玩法来自这里(http://ww ...
- 分享一个强大的采集类,还可以模拟php多进程
做采集的时候,可以使用file_get_contents()去获取网页源代码,但是使用file_get_contents采集,速度慢,而且超时时间,不好控制.如果采集的页面不存在,需要等待的时间很长. ...
随机推荐
- Django 之ORM操作
1.什么是ORM? 全称关系对象映射Object Relational Mapping(简称ORM),是通过描述面向对象与数据库之间的对应的元数据,将对象持久化的更新到数据库中. 有了ORM,就不需要 ...
- zTree async 动态参数处理
async:{ enable: true,//开启异步机制 url: opts.url,//异步地址 otherParam: { 'plateNo': function(){ return $('# ...
- MTK平台下Battery驱动分析
主要涉及代码: Kernel: kernel-3.10\drivers\power\mediatek\ kernel-3.10\drivers\misc\mediatek\mach\mt6580\&l ...
- 使用Mock.js进行独立于后端的前端开发
Mockjs能做什么? 基于 数据模板 生成模拟数据. 基于 HTML模板 生成模拟数据. 拦截并模拟 ajax 请求. 能解决的问题 开发时,前后端进度不同步,后端还没完成数据输出,前端只好写静态模 ...
- 「翻译」Unity中的AssetBundle详解(二)
为AssetBundles准备资源 使用AssetBundles时,您可以随意将任何Asset分配给所需的任何Bundle.但是,在设置Bundles时,需要考虑一些策略.这些分组策略可以使用到任何你 ...
- org.eclipse.swt.SWTError: No more handles的解决办法
今天装了JBoss Tools 3.1 插件后,eclipse 打开jsp文件老是报错,或者要我关闭: org.eclipse.swt.SWTError: No more handles 网上找了两个 ...
- atomic_cmpxchg()/Atomic_read()/Atomic_set()/Atomic_add()/Atomic_sub()/atomi
[ 1.atomic_read与atomic_set函数是原子变量的操作,就是原子读和原子设置的作用.2.原子操作,就是执行操作的时候,其数值不会被其它线程或者中断所影响3.原子操作是linux内核中 ...
- AndroidStudio——Android SDK
前言 安卓的SDK包,跨过长城下载好的,分享出来一下~ Android Studio版本 | 3.4.1 下载地址 微云下载地址 | 链接:https://share.weiyun.com/5rm6l ...
- ExtJS常用代码集合
ExtJS常用代码集合,包括弹出提示框,登陆框,树状结构等等.1. [代码]弹出提示框 <html> <head> <title>Ge ...
- golang defer使用——资源关闭时候多用
defer Go语言中有种不错的设计,即延迟(defer)语句,你可以在函数中添加多个defer语句.当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回.特别是当你在进行一些打开资源 ...