51单片机产生pwm波程序波

单片机、电路板
连接器、接插件
其他元器件
51系列单片机输出PWM的两种方法
51系列单片机输出PWM的两种方法
MCS-51系列 单片机 无PWM输出功能,可以采用定时器配合软件的方法实现,对精度要求不高的场合是非常实用的。电路图见图1,采用高速光隔6N137输出,并将PWM的信号倒相。   一、&工作原理(原理图如图1所示)   二、PWM输出   1.&固定脉宽PWM输出 &&&&用T0定时器完成PWM输出,脉宽固定为65536us。T0定时器
MCS-51系列 单片机 无PWM输出功能,可以采用定时器配合软件的方法实现,对精度要求不高的场合是非常实用的。电路图见图1,采用高速光隔6N137输出,并将PWM的信号倒相。   一、&工作原理(原理图如图1所示)   二、PWM输出   1.&固定脉宽PWM输出 &&&&用T0定时器完成PWM输出,脉宽固定为65536us。T0定时器设置成16位定时器,PWM波形如图2所示。
  程序清单:(12MHz)   PwmData0;T0定时t1的初值(字)   PwmData1;T0定时t2的初值(字)   PwmF&&&&;PWM输出标志 ??;***************************   setb&tr0;启动T0&&&&&&&&&&&&……   &&&&&&&&;T0中断服务程序 &&&&T0Int:JB,PwmF,PWMOUT&;PWM输出未完成返回 &&&&MOV&&&TH0,HIGH(PwmData0) &&&&MOV&&&TL0,LOW&(PwmData1) &&&&SETB&TRO&&&&&&&& & &&&&SETB&PwmF&&&&& &&&&CLR&&P1.0&&;PWM输出脚   RETI&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&PWMOUT:SETB&P1.0&CLR&&TR0 &&&&MOV&TH0,HIGH(PWMDATA1) &&&&MOV&TL0,LOW(PWMDATA1) &&&&SETB&TR0 &&&&CLR&&&&PWMF&&&&&&&&&&&&&&& &&&&RETI &&&&说明:在主程序中计算PWMDATA0、PWMDATA1的值。&&&&&&&&   2.&可变脉宽PWM输出   用T0定时器控制PWM的占空比,T1定时器控制脉宽(最大65536us。)   T0、T1定时器设置成16位定时器。PWM输出波形如图3所示。   程序清单:(12MHz)     PwmData0;T0定时t1的初值(字)   &&&&PwmData1;T0定时t2的初值(字) ??;***************************???????????? &&&&&&&&SETB&TR0;启动T0   &&&&SETB&TR1   ...... &&&&&&&&T0INT:CLR&TR0;T0中断服务程序 &&&&&  SETB&P1.0&;PWM输出脚     &RETI &&&&&&&&&T1INT:CLR&&P1.0&&&;T1中断服务程序 &&    CLR&&TR0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&     &&&&&&& &&&&&&&&&&&&&&&&&CLR&TR1      MOV&TH0,HIGH(PWMDATA0)      MOV&TL0,LOW(PWMDATA0)      MOV&TH1,HIGH(PWMDATA1)      MOV&TL1,LOW(PWMDATA1)      SETB&TR1     & &&&&&&&&&SETB&TR0&&&&&&&&&&& &&&&&&&&&RETI   说明:在主程序中计算PWMDATA0、PWMDATA1的值。
型号/产品名
深圳市二中科技股份有限公司
杭州华意微电子技术有限公司
深圳市艾尔迅科技有限公司两种方法教你如何有效地利用51单片机产生PWM波
89C51芯片没有自带PWM发生器,如果要用51来产生PWM波就必须要用软件编程的方法来模拟。方法大概可以分为软件延时和定时器产生两种方法。下面将逐一介绍。
1 软件延时法
利用软件延时函数,控制电平持续的时间,达到模拟pwm的效果。
程序如下:
#include&reg52.h& sbit pwm=P1^0; main() { while(1) { pwm=1; delayus(60);//置高电平后延时60us,占空比60% pwm=0; delayus(40); } } void delayus(uint x) { while(x--); }
proteus软件仿真结果如下:
可见,用这种延时函数的方法就能简单地模拟出pwm输出。但是这种方法的缺点也相当明显。当程序除了要输出pwm波还要执行其他操作比如键盘扫描、显示等操作时,需要占用CPU一定的机器周期,这样就会影响pwm的准确度。现在很少会用到这种方法,接下来要介绍的是比较常用的方法。
2 定时器产生pwm
这种方法利用了定时器溢出中断,在中断服务程序改变电平的高低,在程序较复杂、多操作时仍能输出较准确的pwm波形。
2.1 注意事项
2.2.1中断服务程序的内容。
一般来说中断服务程序只完成改变标志位、转换高低电平的功能,如果中断服务程序中有太多的操作会影响pwm波的输出,尤其是除法、取余、浮点数运算会占用大量的机器周期,应在中断外完成运算。2.2.2定时器装入初值的问题。
装入初值不能太接近于定时器的溢出值。如我们使用定时器方式1,最多能计65536个数,假设我们转入的初值为65534,那么定时器计两个数就会进入中断,这样会使程序紊乱而其他功能无法正常地执行,所以一般要留50-100个数的裕量。
2.2 定时器工作方式
在定时器工作方式的选择上,可以选择定时器的工作方式0、1、2都可以,本文采用的是工作方式1,即16位定时器,这样可以获得较宽的调频范围。
2.3 定时器初值的计算
设占空比为&,频率为f
产生高电平时装入定时器高8位的值应为
产生高电平时装入定时器低8位的值应为
显然,产生低电平时的公式只要把&换成(1-&)就行了。
然而在51单片机中,浮点数运算需要消耗cpu很长的时间,为了提高程序效率,通常用100倍的占空比来计算。同时,要注意数据类型,避免超出范围,影响计算结果。关于C51的乘除法问题,可以看以下这篇文章:http://blog.163.com/ssou_1985/blog/static//
修改后的公式如下:a为100倍占空比,fr为0.01倍频率TH0 = (65535-a*100/fr)/256; //高位初值TL0 = (65535-a*100/fr)%256;同样,低电平的公式只需把a换成(100-a)即可。
本例程采用定时器T0在工作方式1下产生一路PWM,用独立键盘控制频率、占空比的加减,频率可调范围100Hz-10kHz,占空比0-100%(均为理论值,实际值略低)部分代码如下:
注:T0_H , T0_L , T1_H , T1_L 均用于暂时存储初值,进入中断服务程序后直接给寄存器TH0、TL0赋值,避免了在中断中计算。
注:flag为pwm输出标志,flag=1输出高电平,flag=0输出低电平
2.5 软件仿真结果
2.5.1 频率为100Hz
a.占空比约15%
b.占空比95%
2.5.2 频率为10KHz
a.占空比15%
b.占空比90%
原文标题:51单片机产生PWM方法
文章出处:【微信号:mcugeek,微信公众号:MCU开发加油站】欢迎添加关注!文章转载请注明出处。
发布评论请先
本文档介绍了如何将 MCP1640 单节 4A 电池升压转换器参考设计用作开发工具,在目标板上仿真和....
MCP1640 是一款紧凑的高效率固定频率步升直流 / 直流转换器。它为通过一节、两节或三节碱性电池....
单片机控制交通灯,单片机具有简单的结构、编程方便、经济、易于连接等优点,特别是其内部定时器计数器、中....
本文档的主要内容详细介绍的是三菱梯形图pmw文件转51单片机运行的hex文件的应用程序和使用说明还包....
51单片机是可以输出PWM的,比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用....
EAT8120是一种宽输入范围,高效率和高频率的直流调速系统降压开关稳压器,能够提供高达2A的输出电....
本人设计一款基于蓝牙的51单片机蓝牙小车,小车控制上位机为手机,控制软件由易安卓编写,小车可实现前进....
C51的一些误区和注意事项 1)C忌讳绝对定位。常看见初学者要求使用_at_,这是一种谬误,把C当作....
脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信....
本文档介绍了如何安装MCP19114 ——反激式独立评估板,以及如何操作此评估板。
MCP1911....
用AVR单片机来产生正弦波信号 使用AVR定时/计数器的PWM功能设计要点 一、定时/计数器PWM设....
基于51单片机的激光雕刻机c语言程序设计及相应电路图的设计详细资料概述
本文主要介绍了dsPIC33F/PIC24H系列参考手册之电机控制PWM
DS1302是低功耗实时时钟芯片,它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功....
 本章介绍高速脉宽调制器(Pulse-Width Modulator,PWM)模块及其相关的工作模式....
AltiumDesigner51单片机最小系统STC89C51的介绍和绘制实例教程中文资料详细概述
心形流水灯,顾名思义,成品肯定是一个心形?。随着程序的改变,通过单片机控制单个灯的亮灭达到不同的流动....
本文档的主要内容是QX-MCS 51单片机开发板V3.0的详细原理图
本文档的主要内容的介绍的是51单片机Keil STC库的详细资料(免费下载)
51单片机流水灯不同情况,不同P口,各种程序。P0 P1 P2 P3 跑马灯 if while 数组....
脉宽调制(PWM)是一项功能强大的技术,它是一种对模拟信号电平进行数字化编码的 方法。在脉宽调制中使....
一个二极管点亮一般需流经的电流值为3mA~10mA,二极管两边的压降为1.6V~1.7V。
事件管理器(EV)模块提供了在运动控制和电机控制应用中特别有用的广泛功能和特征。EV模块包括通用(G....
AC电机的工作原理可以在许多书籍中找到,包括HundMsSH(1985)、VAS(1990)、伦纳德....
提出了三相PWM(NSPWND)降低三相共模电压的方法。确定了最优电压矢量及其序列。研究了电压线性、....
意法半导体的三相工业辅助SMPS同样不容小觑,它具有卓越性能,在工业领域广泛使用,并提供高性能解决方....
采用 TI 公司新一代移相 PWM 控制芯片 UCC3895, 针对大功率全桥 PWM2ZVS 开关....
针对零电压零电流开关 (ZVZCS) 全桥变换器在轻载情况下 , 超前臂零电压开关 (ZVS) 效果....
为了实现全桥软开关变换器能在很宽的负载变化范围内实现零电压零电流变换,提出了一种改进的电路拓扑结构,....
本文研究了一种新型全桥电路的零电压零电流开关(zvzcs)变换器,分析了电路的原理和设计原则。
提出一种新的移相全桥 PWM DC/DC变频器,它采用两个变压器代替输出电感。
讨论了一种零电压零电流开关的全桥DC - DC PWM变换器。
PWM DC-DC变换器中开关损耗是限制进一步提高开关频率的重要因素。
目前,对全桥变换器的研究大多集中在移相控制领域,而移相控制不能解决输出侧同步整流管的软开关问题。
介绍了一种零电压零电流开关 (ZVZCS) 全桥 DC/ DC PWM 变换器。通过设计宽幅压直流变....
提出了一种零电压零电流开关PWM DC/DC全桥变换器,该变换器实现了超前桥臂的零电压开关和滞后桥臂....
本文介绍了移相谐振控制器 UC3875 的电气特性与基本功能, 详细分析了以 UC3875 作为控制....
通过数学的方法,把小功率开关电源系统表示成数学模型和非线性控制模型,建立一种开关电源全系统的仿真模型....
介绍了一种采用FA13844 电流型PWM 控制芯片实现的多路输出单端反激式开关电源,根据设计要求给....
提出了一种改进型的具有有源钳位的全桥零电压零电流开关 PWM DC/DC 变换器。
采用了一种将峰值电流控制模式与移相软开关技术相结合的移相控制全桥 (FB) ZVS -PWM 变换器....
ZVZCS 移相全桥 PWM 变换器实现了超前桥臂的零电压开关( ZVS) 与滞后桥臂的零电流开关(....
分析了移相零电压( ZVS) 软开关功率变换器的工作原理、电路特性以及一些常见的电力改进措施。在此基....
本文介绍了 10kW 全桥移相 ZVS PWM 直流整流模块主电路和控制电路的设计,给出了主变压器和....
本文给出了一个离线开关电源的设计实例,讨论了不连续反激拓扑选择的因素。
dsPIC33/PIC24系列中文参考手册——高速PWM模块
PIC32系列中文参考手册—第44章 电机控制PWM
LM2710和LM2711包含电流模式、脉宽调制(PWM)DC/DC升压调节器,具有1.6A开关。
开关电源的设计一直被认为是一种魔术和艺术,对于所有第一次设计的工程师来说。
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司
电信与信息服务业务经营许可证:粤B2-&>&51单片机产生PWM波
51单片机产生PWM波
上传大小:175KB
51单片机产生PWM波
综合评分:0
10积分/C币
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有0条
综合评分:
积分/C币:3
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
51单片机产生PWM波
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
举报的资源分:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*详细原因:
51单片机产生PWM波一篇关于PWM波频率与占空可调的好代码 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
一篇关于PWM波频率与占空可调的好代码
15:01:31  
前日看到一篇很好的代码。有好代码就要拿出来与坛友分享嘛
程序可以利用51单片机输出频率和占空比可调的PWM波程序。作者写的很详细,程序写的很漂亮!!!但我还是有地方不明白
现在咱们大家来探讨探讨吧!!!
我有三个问题,恳求网友不吝赐教。
1.&&频率计算函数,当频率变化,计算出定时器0初值;& && &
2.&&脉宽计算函数,脉宽变化时,计算出定时器1初值;
3.&&关定时器1,一定要这一步,因为定时器1的定时短于定时器0;
//------------------------------------------------------------------------------------
//程序功能简介:本程序产生15HZ~~~50KHZ的方波,并且实现频率和脉宽的独立调制,即可
//在改变频率的同时不改变脉宽,再改变脉宽的同时不改变频率;同时设置
//两个调节步长------在KEY键按下时,粗调,没有按下时,细调;
//程序思路: 本程序用到两个定时器------定时器0和定时器1,其中定时器0工作在定时方式下,
//决定方波的频率;定时器1,同样工作在定时方式下,用于设定脉宽;
//------------------------------------------------------------------------------------
#include &reg52.h&
#include &math.h&
#define&&uchar unsigned char
#define&&uint unsigned int
#define&&ALL&&65536& &&&//定时器工作方式1时,最大基数长度 65536;
#define&&F_osc & & //晶振频率12M;
sbit KEY_F_UP=P0^2;& &&&//频率上调按钮;
sbit KEY_F_DOWN=P0^3;& &//频率下调按钮;
sbit KEY_W_UP=P0^4;& &&&//脉宽上调按钮;
sbit KEY_W_DOWN=P0^5;& &//脉宽下调按钮;
sbit KEY=P0^6;& && && & //粗细调节按钮-----按下为粗调,否则为细调;
sbit OUTPUT=P1^0;& && & //波形输出;
uchar TIMER0_H,TIMER0_L,TIMER1_H,TIMER1_L;& && & //定时器0和定时器1的初值设置;
uchar PERCENT=50;& && && && && && && && && && && && && && && && & //初始占空比;
uchar FLAG_F=0,FLAG_W=0;& && && && && && && && && && && && &//频率调节标志和脉宽调制标志;
uint&&FREQ=50000;& && && && && && && && && && && && && && && && && &//初始频率;
& && && && && && && && && && && && && && && && && && && && &&&//临时全局变量,用于数据传递;
void delay(uchar t);& && && && && && && && && && && && && && && && &&&//延时函数,用于按键去抖;
void init();& && && && && && && && && && && && && && && && && && && && && &//初始化函数,用于定时器的初始化;
void calculate_F();& && && && && && && && && && && && && && && && && &//频率计算函数,当频率变化,计算出定时器0初值;
void calculate_W();& && && && && && && && && && && && && && && && &&&//脉宽计算函数,脉宽变化时,计算出定时器1初值;
void key_scan();& && && && && && && && && && && && && && && && && && &//按键扫描函数;
void timer0();& && && && && && && && && && && && && && && && && && && & //定时器0中断函数;
void timer1();& && && && && && && && && && && && && && && && && && && &//定时器1中断函数;
void delay(uchar t)
& &&&uchar i,j;
& &&&while(t--)& && && && & //每个脉冲为1us
& && & for(i=0;i&100;i++)
& && &&&for(j=0;j&100;j++);
void calculate_F()
& &&&temp = ALL - F_osc/12.0/FREQ;
& &&&TIMER0_H = (uint)temp/256;
& &&&TIMER0_L = (uint)temp%256;
void calculate_W()
& &&&float TEMP;
& &&&TEMP = (1 - PERCENT/100.0)*ALL + temp*PERCENT/100.0;
& &&&TIMER1_H = (uint)TEMP/256;
& &&&TIMER1_L = (uint)TEMP%256;
& &void key_scan()
& &&&delay(4);
& &&&if(!KEY_F_UP)& &&&//频率上调键按下;
& && & FLAG_F=1;& & //置标志位;
& && & if(!KEY)
& && && &FREQ+=10;
& && & else
& && && &FREQ++;
& && & if(FREQ&50000)
& && && &FREQ=1;
& &&&else if(!KEY_F_DOWN)& &//频率下调键按下;
& && & FLAG_F=1;& & //置标志位;
& && & if(!KEY)
& && && &FREQ-=10;
& && & else
& && && &FREQ--;
& && & if(FREQ&1)
& && && &FREQ=50000;
& && &else if(!KEY_W_UP)& & //脉宽上调键按下;
& && &&&FLAG_W=1;& & //置标志位;
& && &&&if(!KEY)
& && && & PERCENT+=5;
& && &&&else
& && && & PERCENT++;
& && &&&if(PERCENT&49)
& && && & PERCENT=1;
& && &else if(!KEY_W_DOWN)& &//脉宽下调键按下;
& && &&&FLAG_W=1;& & //置标志位;
& && &&&if(!KEY)
& && && & PERCENT-=5;
& && &&&else
& && && & PERCENT--;
& && &&&if(PERCENT&1)
& && && &&&PERCENT=49;
& &void timer0() interrupt 1& && &//决定频率
& && &TH0=TIMER0_H;
& && &TL0=TIMER0_L;
& && &TR1=1;& && && &&&//开定时器1;
& && &OUTPUT=1;
& & void timer1() interrupt 3& &&&//决定脉宽
& && &TH1=TIMER1_H;
& && &TL1=TIMER1_L;
& && &TR1=0;& && && & //关定时器1,一定要这一步,因为定时器1的定时短于定时器0;
& && &OUTPUT=0;
& & void init()
& && &TMOD=0x11;& && &//定时器0和定时器1都工作在方式1,16位计数器;
& && &calculate_F();&&//初始为1KHZ,占空比为50%;
& && &calculate_W();
& && &TH0=TIMER0_H;
& && &TL0=TIMER0_L;
& && &TH1=TIMER1_H;
& && &TL1=TIMER1_L;
& && &ET0=1;
& && &ET1=1;
& && &EA=1;
& && &TR0=1;
& && &TR1=1;
& &&&init();
& &&&while(1)
& && &&&key_scan();
& && &&&if(FLAG_F)& &&&//改变频率时要注意要进行脉宽的重新设置;
& && && & calculate_F();
& && && & calculate_W();
& && && & FLAG_F=0;
& && &&&if(FLAG_W)& &&&// 脉宽改变,频率不改变;
& && && & calculate_W();
& && && & FLAG_W=0;
本帖最后由 傻大个牌纯碱 于
22:23 编辑
偶然间看到这段代码,我解释下面这段代码:========================================================
void calculate_F()
& &&&temp = ALL - F_osc/12.0/FREQ;
// 理解这段程序的关键点,在于理解时钟周期和机器周期;
// 从程序上看,这个单片机的时钟周期(即外部晶振周期)是1/(12 MHz)=1/F_osc ,而机器周期是12个时钟周期,即12/F_osc。
// 所以,如果要得到频率=FREQ的方波,必须赋予计数器一个初始值temp,然后计数器进行自加(ALL-temp)次,就有如下等式:
// (ALL-temp)*(12/F_osc)=1/FREQ,做等式变换,把temp做变量就可以得到:
//&&temp = ALL - F_osc/12.0/FREQ
& &&&TIMER0_H = (uint)temp/256;
& &&&TIMER0_L = (uint)temp%256;
void calculate_W()
& &&&float TEMP;
& &&&TEMP = (1 - PERCENT/100.0)*ALL + temp*PERCENT/100.0;
// 如果你理解了上面那段,这段我相信你也理解了;
& &&&TIMER1_H = (uint)TEMP/256;
& &&&TIMER1_L = (uint)TEMP%256;
=====================================================================
15:01:32  
本帖最后由 傻大个牌纯碱 于
22:23 编辑
偶然间看到这段代码,我解释下面这段代码:========================================================
void calculate_F()
& &&&temp = ALL - F_osc/12.0/FREQ;
// 理解这段程序的关键点,在于理解时钟周期和机器周期;
// 从程序上看,这个单片机的时钟周期(即外部晶振周期)是1/(12 MHz)=1/F_osc ,而机器周期是12个时钟周期,即12/F_osc。
// 所以,如果要得到频率=FREQ的方波,必须赋予计数器一个初始值temp,然后计数器进行自加(ALL-temp)次,就有如下等式:
// (ALL-temp)*(12/F_osc)=1/FREQ,做等式变换,把temp做变量就可以得到:
//&&temp = ALL - F_osc/12.0/FREQ
& &&&TIMER0_H = (uint)temp/256;
& &&&TIMER0_L = (uint)temp%256;
void calculate_W()
& &&&float TEMP;
& &&&TEMP = (1 - PERCENT/100.0)*ALL + temp*PERCENT/100.0;
// 如果你理解了上面那段,这段我相信你也理解了;
& &&&TIMER1_H = (uint)TEMP/256;
& &&&TIMER1_L = (uint)TEMP%256;
=====================================================================
为你点赞!!!
20:35:54  
有具体的资料和线路吗 求分享一下
21:46:55  
有具体的资料和线路吗 求分享一下
这就是存粹的用51单片机产生PWM波代码,我觉得代码很经典,就分享出来与大家一起讨论了。
朋友我遇到了一些问题,请您赐教
21:54:17  
这就是存粹的用51单片机产生PWM波代码,我觉得代码很经典,就分享出来与大家一起讨论了。
朋友我遇到了一些问题,请您赐教
我对单片不了解&&这个正好我最近要用到&&希望楼主能够将全套资料分享一下 谢谢
高级工程师
08:22:54  
有什么问题啊?你理解的已经很清楚了啊
23:46:21  
有什么问题啊?你理解的已经很清楚了啊
这条代码(红字)不太明白,请您赐教!
//关定时器1,一定要这一步,因为定时器1的定时短于定时器0;
18:04:21  
偶然间看到这段代码,我解释下面这段代码:========================================================
void calculate_F()
上面的推导看懂了,下面的推导还真没想明白,是利用占空比的定义进行推导的吗?指示指示,学习一下,谢谢
TEMP = (1 - PERCENT/100.0)*ALL + temp*PERCENT/100.0;
18:44:22  
使用stm32系列的单片机做起来就简单多了
17:51:58  
偶然间看到这段代码,我解释下面这段代码:========================================================
void calculate_F()
不明白这条代码意思,请您赐教!
//关定时器1,一定要这一步,因为定时器1的定时短于定时器0;
23:23:01  
上面的推导看懂了,下面的推导还真没想明白,是利用占空比的定义进行推导的吗?指示指示,学习一下,谢谢
TEMP = (1 - PERCENT/100.0)*ALL + temp*PERCENT/100.0;
//不明白有两个原因
1. 没理解晶振频率与机器周期的关系
2. 没理解占空比(高电平占整个周期的时间)计算方法
void calculate_F()
& &&&temp = ALL - F_osc/12.0/FREQ;
// 理解这段程序的关键点,在于理解时钟周期和机器周期;
// 从程序上看,这个单片机的时钟周期(即外部晶振周期)是1/(12 MHz)=1/F_osc ,而机器周期是12个时钟周期,即12/F_osc。
// 所以,如果要得到频率=FREQ的方波,必须赋予计数器一个初始值temp,然后计数器进行自加(ALL-temp)次,就有如下等式:
// (ALL-temp)*(12/F_osc)=1/FREQ,做等式变换,把temp做变量就可以得到:
//&&temp = ALL - F_osc/12.0/FREQ
TIMER0_H = (uint)temp/256;
& &&&TIMER0_L = (uint)temp%256;
void calculate_W()
& &&&float TEMP;
& &&&TEMP = (1 - PERCENT/100.0)*ALL + temp*PERCENT/100.0;
//计算占空比就是计算一个周期中的高电平时间(占空比*周期)(PERCENT/100)1/FREQ
// 这个单片机的时钟周期(即外部晶振周期)是1/(12 MHz)=1/F_osc ,而机器周期是12个时钟&&周期,即12/F_osc。
// 所以,如果要得到频率=FREQ,占空比为PERCENT/100方波,必须赋予计数器一个初始值TEMP,然后计数器进行自加(ALL-TEMP)次,就有如下等式:
// (ALL-TEMP)*(12/F_osc)=(PERCENT/100)1/FREQ,做等式变换(把temp带入替换)可得
//TEMP = (1 - PERCENT/100.0)*ALL + temp*PERCENT/100.0;(完全可以不用temp替换,以上等式即可)
& &&&TIMER1_H = (uint)TEMP/256;
& &&&TIMER1_L = (uint)TEMP%256;
15:02:46  
//不明白有两个原因
1. 没理解晶振频率与机器周期的关系
2. 没理解占空比(高电平占整个周期的时间)计算方法
clever Boy or Girl!
22:44:42  
在这借鉴 一些经验
21:18:12  
硬件开销有点大,不过单个定时器做的话做很难做到50k
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司

我要回帖

更多关于 51单片机pwm知 的文章

 

随机推荐