一个定时器生成多路PWM波形的原理和方法
2018-03-30 21:12
316 查看
在很多工程应用中,需要使用到PWM波(脉宽调制),例如电机调速、温度控制调整功率等。本文讲述怎么利用单片机的一个定时器生成多路PWM波形。
一般的,PWM的周期t1是一个固定值,如1ms,10ms,100ms等,在一个周期中包含了高电平t2和低电平t3,它们的关系是t2+t3=t1。改变一个周期中高电平的时间,就能达到速度或者功率调整的目的。PWM适用于高速开关器件的控制,不适合于继电器等低速开关元件的控制,因为继电器等低速元件达不到如此快的开关速度。
PWM控制的关键是控制改变PWM的高电平时间t2,这个时间在其他子程序中由控制算法中进行修改,如PID控制算法。
![](https://img-blog.csdn.net/20180330211103995)
图 1
在微处理器,如单片机中,实现一个定时器生成多路PWM的方法如下。
首先来看看用一个定时器实现一路PWM输出的方法:
>>定义一个时间基准刻度t,这个也是计时器中断周期,一般在程序中t不改变。PWM的周期、高低电平时间由若干个基准时间t组成;
>>定义一个全局计时变量n,n表示这段时间经过了多少个基准时间t;
>>定义一个全局计时变量n1,n1表示一个PWM的周期包含多少个基准时间t,n1=t1/t。一般在程序中n1,t1不改变。
>>定义一个全局计时变量n2,n2表示一个PWM周期中高电平包含多少个基准时间t,n2=t2/t。由于高电平的时间受其他算法控制改变的,n2也是随时在改变。
程序的流程如下:
①初始化定时器,定时器中断时间设置为t,如设置t为1ms或其他;
②初始化变量:n=0;//计时变量n清零
n1=t1/t;//一个PWM的周期t1包含了多少个基准时间t.
//假如设PWM周期为100ms,则n1=100;
n2=t2/t;//计算一个PWM中高电平时间t2由多少个基准时间//t组成。t2由其他控制算法改变。
③ 开始计时,打开定时器中断。定时器中断程序中n++;
当n<n2&& n<n1时,IO口输出高电平;
当n>=n2&& n<n1时,IO口输出低电平;
当n>n1时,返回步骤①进行下一个周期的PWM.
程序流程图如下:
![](https://img-blog.csdn.net/20180330211113585)
图2
如果在同一个定时器中需要多路PWM,再定义多组类似的变量,按照图2 中流程处理即可。
更多精彩内容,尽在微信公众号“永珂在线”
一般的,PWM的周期t1是一个固定值,如1ms,10ms,100ms等,在一个周期中包含了高电平t2和低电平t3,它们的关系是t2+t3=t1。改变一个周期中高电平的时间,就能达到速度或者功率调整的目的。PWM适用于高速开关器件的控制,不适合于继电器等低速开关元件的控制,因为继电器等低速元件达不到如此快的开关速度。
PWM控制的关键是控制改变PWM的高电平时间t2,这个时间在其他子程序中由控制算法中进行修改,如PID控制算法。
图 1
在微处理器,如单片机中,实现一个定时器生成多路PWM的方法如下。
首先来看看用一个定时器实现一路PWM输出的方法:
>>定义一个时间基准刻度t,这个也是计时器中断周期,一般在程序中t不改变。PWM的周期、高低电平时间由若干个基准时间t组成;
>>定义一个全局计时变量n,n表示这段时间经过了多少个基准时间t;
>>定义一个全局计时变量n1,n1表示一个PWM的周期包含多少个基准时间t,n1=t1/t。一般在程序中n1,t1不改变。
>>定义一个全局计时变量n2,n2表示一个PWM周期中高电平包含多少个基准时间t,n2=t2/t。由于高电平的时间受其他算法控制改变的,n2也是随时在改变。
程序的流程如下:
①初始化定时器,定时器中断时间设置为t,如设置t为1ms或其他;
②初始化变量:n=0;//计时变量n清零
n1=t1/t;//一个PWM的周期t1包含了多少个基准时间t.
//假如设PWM周期为100ms,则n1=100;
n2=t2/t;//计算一个PWM中高电平时间t2由多少个基准时间//t组成。t2由其他控制算法改变。
③ 开始计时,打开定时器中断。定时器中断程序中n++;
当n<n2&& n<n1时,IO口输出高电平;
当n>=n2&& n<n1时,IO口输出低电平;
当n>n1时,返回步骤①进行下一个周期的PWM.
程序流程图如下:
图2
如果在同一个定时器中需要多路PWM,再定义多组类似的变量,按照图2 中流程处理即可。
更多精彩内容,尽在微信公众号“永珂在线”
相关文章推荐
- 使用timer方法生成一个定时器,每隔一段时间输出一个随机数
- AVRmega16通过一个定时器实现多路IO口输出多路可调的PWM
- 一个简单的 动态页面 生成 静页面的方法
- 禁止在弹出窗口上做任何操作均生成一个相同新页面的方法
- Asp.net 2.0 中将网站首页生成静态页的一个比较好的方法
- readLine原理及自定义一个类中包含一个和readLine一致的方法功能来模拟BufferedReader
- PHP一个方法调整图像大小(生成缩略图)
- 旧文备份:利用一个定时器实现多个虚拟定时器的两种方法
- [导入]Asp.net 2.0 中将网站首页生成静态页的一个比较好的方法
- 各种波形文件vcd,vpd,shm,fsdb生成的方法(zz)
- Asp.net 2.0 中将网站首页生成静态页的一个比较好的方法
- 一个用ASP生成html的新方法
- 送写毕业设计同学一个自动生成数据字典的方法
- jsp生成html(方法简单,只用使用一个serlvet)
- 一个简单的执行程序的GNU automake自动生成Makefile的方法及案例
- 多个图片文件夹生成一个大css文件的方法
- 不用模板,只用ASP+FSO生成静态HTML页的一个方法(对于内容密集型页面特别适用) 选择自 goaler 的 Blog
- Python3基础 生成一个可以使用for循环可迭代的类,具有__iter__和__next__的方法的类
- 从dataset(其中有可有多个不同的表)中生成一个新表的方法
- 一个重要的图像分割方法:MST最小生成树分割方法Boundary Preserving Dense Local Regions