PWM在51单片机的使用和分析
2018-01-08 20:04
232 查看
1.什么是PWM?
PWM在百度的解释是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
我对百度的解释比较认同,但是由于我是实用派,还是觉得有些复杂,不是很好理解。众所周知,我们国家的交流电是50HZ,代表着一秒内有50次的变化——从低电平到高电平、高电平到低电平,周而复始。而直流电却是单一的高电平。我就简单的认为PWM就是将直流电的波形频率变成类似交流电波形频率,同时还能控制脉宽(脉冲宽度)的技术。
2.怎么编写PWM程序?
上文我简单的给PWM下了一个定义——PWM就是将直流电的波形频率变成类似交流电波形频率,同时还能控制脉宽(脉冲宽度)的技术。那么我们现在就只需要分析交流电的波形是怎么样的,然后通过编程让单片机发出类似交流电的波形并控制每个波形的宽度就行了。
首先交流电的波形是没有方向的,所以这一点我们是不可能做到的,毕竟正负极摆在这里,我们能做到的是和交流电一样的频率。交流电一秒钟的频率是50HZ,也就是在一秒内变化50次,那我们同样让直流电变化50次,并控制变化的时间不就达到了和交流电一样的频率。
理清楚了思路,我们就可以开始编程了。
本段程序,我使用了两个定时器,定时器0定时0.5毫秒用来控制直流电在一秒内变化的周期,定时器1定时50毫秒用来控制直流电在每一个周期内高电平占用周期的时间,也即是控制脉宽。
通过计算,1秒内产生50次变化,即20毫秒产生一个变化,定时器0每0.5毫秒产生一次中断,产生中断达到40次时刚好一个周期结束。而脉宽我用定时器1来调节,通过改变临界值num的值,让高电平在一个周期内的时间做出不同的变化。
3.PWM的使用和分析
由于条件有限,不能用示波器来测量单片机发出的直流电的频率是多少,但是我相信即使有错误,误差也不会很大,产生误差的原因大致与晶振的频率有关。
虽然没有测得频率是多少,但我还是用万用表测量了它的电压,测得电压用0V慢慢的升到了4.5V。外在表现为LED灯呈现了呼吸灯的效果,从暗到亮,从亮到暗。
通过本次实验可以知道,PWM可以改变电压的大小,从而可以用这电压控制一个元件的目的。
程序下载地址 http://download.csdn.net/download/m0_37277616/10195051
新人发博客 ——有什么解释
823d
的不对的地方请多多指教。
PWM在百度的解释是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
我对百度的解释比较认同,但是由于我是实用派,还是觉得有些复杂,不是很好理解。众所周知,我们国家的交流电是50HZ,代表着一秒内有50次的变化——从低电平到高电平、高电平到低电平,周而复始。而直流电却是单一的高电平。我就简单的认为PWM就是将直流电的波形频率变成类似交流电波形频率,同时还能控制脉宽(脉冲宽度)的技术。
2.怎么编写PWM程序?
上文我简单的给PWM下了一个定义——PWM就是将直流电的波形频率变成类似交流电波形频率,同时还能控制脉宽(脉冲宽度)的技术。那么我们现在就只需要分析交流电的波形是怎么样的,然后通过编程让单片机发出类似交流电的波形并控制每个波形的宽度就行了。
首先交流电的波形是没有方向的,所以这一点我们是不可能做到的,毕竟正负极摆在这里,我们能做到的是和交流电一样的频率。交流电一秒钟的频率是50HZ,也就是在一秒内变化50次,那我们同样让直流电变化50次,并控制变化的时间不就达到了和交流电一样的频率。
理清楚了思路,我们就可以开始编程了。
#include<reg52.h> /* 实验 STC89C52 PWM波的使用与分析 2018-1-8 */ //宏定义 #define uchar unsigned char #define uint unsigned int //定义IO口 sbit led = P1^0; //定义变量 uchar num = 50; bit bz = 1; //函数声明 void init(); //定时器0 初始化 void main() { init(); //调用初始化函数 while(1) { } } void init(void) { TMOD = 0x11; //设置定时器的工作模式 EA = 1; //开总中断 //开定时器0 TH0 = (65535-500)/256; //装初值 TL0 = (65535-500)%256; ET0 = 1; //开定时器0中断 TR0 = 1; //启动定时器0 //开定时器1 TH1 = (65535-45872)/256; //装初值 TL1 = (65535-45872)%256; ET1 = 1; //开定时器1中断 TR1 = 1; //启动定时器1 } void T0_time(void) interrupt 1 { static uchar t0_cnt=0; TH0=(65535-500)/256; //0.5ms TL0=(65536-500)%256; t0_cnt++; if(t0_cnt < num) //当小于临界值时 灯灭 { led = 1; } if(t0_cnt > num) //当高于临界值时 灯亮 { led = 0; } if(t0_cnt > 40) //当亮了一个周期以后 复位 { t0_cnt = 0; } } void T1_time(void) interrupt 3 { static uchar t1_cnt=0; TH1=(65535-45872)/256; //50ms TL1=(65536-45872)%256; t1_cnt++; if(t1_cnt == 5) { t1_cnt = 0; if(bz == 1) { num--; } if(bz == 0) { num++; } if(num == 0) { bz = 0; } if(num == 41) { bz = 1; } } }
本段程序,我使用了两个定时器,定时器0定时0.5毫秒用来控制直流电在一秒内变化的周期,定时器1定时50毫秒用来控制直流电在每一个周期内高电平占用周期的时间,也即是控制脉宽。
通过计算,1秒内产生50次变化,即20毫秒产生一个变化,定时器0每0.5毫秒产生一次中断,产生中断达到40次时刚好一个周期结束。而脉宽我用定时器1来调节,通过改变临界值num的值,让高电平在一个周期内的时间做出不同的变化。
3.PWM的使用和分析
由于条件有限,不能用示波器来测量单片机发出的直流电的频率是多少,但是我相信即使有错误,误差也不会很大,产生误差的原因大致与晶振的频率有关。
虽然没有测得频率是多少,但我还是用万用表测量了它的电压,测得电压用0V慢慢的升到了4.5V。外在表现为LED灯呈现了呼吸灯的效果,从暗到亮,从亮到暗。
通过本次实验可以知道,PWM可以改变电压的大小,从而可以用这电压控制一个元件的目的。
程序下载地址 http://download.csdn.net/download/m0_37277616/10195051
新人发博客 ——有什么解释
823d
的不对的地方请多多指教。
相关文章推荐
- 使用51单片机驱动舵机程序分析
- STC单片机硬件PWM的使用分析
- 使用51单片机输出PWM控制舵机
- 【HTTP】Fiddler(二)- 使用Fiddler做抓包分析
- 【转】Oracle分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法
- 分析Android应用使用的技术框架和开源库
- Java程序内存分析:使用mat工具分析内存占用
- NSURLSession简介(NSURLSession使用说明及后台工作流程分析)
- Java JDK 动态代理(AOP)使用及实现原理分析
- 使用Spring AOP实现MySQL数据库读写分离案例分析
- 使用英特尔® 图形性能分析器分析实际游戏性能
- hcitool 使用与分析
- Volley的使用以及源码分析(一)
- HC-05蓝牙模块调试笔记以及使用正点原子例程无法检测到蓝牙模块原因分析
- Java多线程同步Synchronized使用分析
- RunLoop源码分析、基本使用场景和常见问题
- 通过分析nginx log 后使用iptables来防ddos攻击
- 使用strace+pstack利器分析程序性能
- Android中使用Handler造成内存泄露的分析和解决
- realloc 使用详解(分析realloc invalid pointer、指针无效等错误)