PIC单片机之PWM原理
1,什么是PWM
什么是PWM,专业点说脉宽调制,通俗点说 就是不断的输出高低电平。 比如 单片机 40ms的时间 输出高电平然后60ms的时间 输出低电平接着一直不断周期性的交替输出高低电平 这就是典型的PWM波。高电平输出的时间40ms就是传说中的脉宽,40ms+60ms=100ms 便是PWM的周期。假定我们把周期定为100ms.我们可以根据我们的需要 把高电平的时间加大或者减小,比如 高电平输出时间加大为80ms.那么低电平的时间就变为20ms. 也可以 高电平输出时间减小为20ms.那么低电平的时间就变为80ms.这即是脉宽调制 调的便是这高电平的时间。 而高电平(脉宽)在周期中,所占用的时间比例 就被称为占空比。用数学公式表示 高电平的时间/周期的时间=占空比。
2,PWM的实现方式
我们如何让单片机输出PWM波。有两种方式 一种是直接用I/O输出,另一种方式利用模块。
2.1利用I/O口输出PWM
如果你的单片机没有带有PWM输出功能模块,那么你可以自己写个程序输出PWM波。因为PWM不就是高低电平。一个I/O在加上一个定时器,对于任何单片机来说都是很容易做到的。
2.2利用模块输出PWM
对于PIC单片机而言就带有输出PWM的功能模块。利用模块输出PWM其实比利用I/O输出PWM更加简单便捷精确。
3,PWM的作用
PWM能用来做什么PWM比较典型的应用就是对LED调光和电机调速。那PWM是如何进行调光和调速的呢,其实也很好理解。以给LED调光为例。给LED一直通电LED是最亮的。不给LED断电LED是不亮的。那要是在极短的时间内给LED不断的通电断电。那给人眼的感觉就是LED虽然是亮的,但亮度较低。
如果单片机高平输出时LED是亮的。那么在PWM波中高电平输出的时间越长LED就越亮,反之则越暗。
单片机之定时器模拟PWM
PWM-脉冲宽度调制,在实际应用中非常广泛,如灯光效果调制、开关电源、电机控制等。一般单片机都会带有PWM模块,单片机自带的PWM模块的优点是控制精度高,使用方便,只需要配置相关寄存器就可以,缺点是IO口固定,能同时输出PWM的路数少。当实际应用时的PWM的精度和频率要求不高,但要同时输出3路以上PWM时,就可以用单片机的定时器来模拟PWM了。本次主要介绍定时器模拟PWM来控制4色(红绿蓝白)LED的灯光效果。
PWM的调制最关键的是控制占空比与周期,本次介绍的PWM的周期固定,在什么时候改变占空比这个很关键。定时器中断时间为50us,PWM周期是50us*200 = 10ms。对于灯光的控制,频率大于50Hz即可,如果想要手机拍摄时没有明显的闪烁,频率最好在100Hz以上,下面来看程序:
void timer0_isr(void) interrupt ISRTimer0 //50us,中断函数
{
TH0 = 249;
TL0 = 254;
//red_led = ~red_led;
timer0_50us_flag = 1;
test_water_50us_flag = 1;
red_led_pwm();
green_led_pwm();
blue_led_pwm();
white_led_pwm();
//control_mist_pwm();
}
void red_led_pwm(void)//红色LED PWM输出函数,在定时器0中调用
{
red_led_count++;//计数用
if(red_led_count > red_led_duty)计数值与占空比比较大小
{
red_led = 0;//如果计数值比占空比数值大,就输出低电平,否则就输出高电平
}
else
{
red_led = 1;
}
if(red_led_count >= red_led_duty_cycle)//判断计数值是否到达周期值
{
red_led_count = 0;//计数值清零
if(goto_step3_flag)
red_led_cycle_times++;//PWM满一个周期后记录当前PWM输出了几个
}
}
其他三种颜色灯的PWM输出函数与红色LED的PWM输出函数一样,在此不做详述。PWM的输出函数非常简单,但是要控制这几种LED显示不同的效果,改变占空比就非常重要了。以下是红色LED占空比控制的程序,在主循环中调用
void red_led_duty_process()
{
if(red_led_cycle_times < 2)
return;
red_led_cycle_times = 0;
if(red_duty_zero_flag)
return;
if(red_begin_decr_flag)
{
red_led_duty--;
if(red_led_duty == 0)
{
red_duty_zero_flag = 1;
red_arrive_half_duty_flag = 0;
blue_duty_zero_flag = 0;
}
return;
}
if(red_duty_full_flag)
return;
if(red_duty_half_flag)
{
red_duty_half_count++;
if(red_duty_half_count < 100)
return;
red_duty_half_count = 0;
red_duty_half_flag = 0;
red_arrive_half_duty_flag = 1;
}
red_led_duty++;
if(red_arrive_half_duty_flag == 0)
{
if(red_led_duty >= 100)
{
red_duty_half_flag = 1;
}
}
if(red_led_duty >= 200)
{
red_duty_full_flag = 1;
green_duty_zero_flag = 0;
blue_duty_full_flag = 0;
}
}
由于在控制占空比的过程中,需要控制每个灯的占空比的变化,在不同的阶段,占空比的变化不一样。这个产品本来只是一个产品的一个功能,看着效果不错就单独拿出来做一个产品,还有汇编版本的。篇幅有限,需要完整的程序代码可以留下邮箱。欢迎大家提问。
相关问答
stm32输出的 pwm 有什么用?stm32单片机的PWM模块就是产生方波的,一般式通过设置其相关定时器来实现产生不同频率,不同占空比的方波信号;同时PWM可以是脉冲宽度调制器,通过改变输入PWM的...
单片机 是怎么通过 pwm 波来控制电机运转的,工作原理是什么?PWM的英文全称是PulseWidthModulation的缩写,翻译成中文就是脉冲宽度调制,PWM是一种利用数字输出来对模拟电路进行控制的技术,它的实质就是使用数字信号...
单片机PWM的 概念是什么?(PWM),是英文“PulseWidthModulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效...分两点讨论:1.PWM脉冲宽度调...
单片机 如何产生 PWM 信号?单片机通过控制IO口的高低电平来产生PWM信号。首先,设置IO口为输出模式,并根据PWM波形要求设定IO口输出高电平和低电平的时间比,通常使用定时器产生周期性中断...
单片机pwm 是什么原理 - 131****4864 的回答 - 懂得模拟控制方式,其根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的...这种方...
51 单片机pwm 程序详解?51单片机的pwm调速频率主要通过一个定时器和一个IO口来实现PWM的输出。在一个周期里面,首先让IO口输出高电平,并定时一定的时间然后再将IO口输出低电平,定时一...
现在的 单片机 可以稳定地实现一些小功能吗?例如稳定输出1mhz的 pwm ?1MHz的PWM波,如果用10位最小时间片,定时中断就要10M的刷新速度。也就是说10M时钟频率以上的单片机都可满足要求。专门的PWM通道控制,轻松实现1M方波输出。S...
单片机的 数字端口、模拟端口和 PWM 口各是什么意思,麻烦通俗点回答,谢谢?1、单片机的数字端口是指该端口只有通常的逻辑电平只有高电平或者低电平,用数字来表示高电平就是1,低电平就是0。以51单片机为例,如果说IO口P1.0为高电平,...
单片机PwM 1P和1N有什么区别?PWM1P和1N是两种不同的单片机引脚配置,它们的主要区别在于引脚功能和使用的PWM通道不同。PWM1P表示将PWM信号输出配置为高电平有效,即当PWM信号为高电平时,会...
关于 单片机PWM 输出的问题?Pwm输出一般指的是脉冲宽度调制,这个一般是在电流控制的时候需要用到的,一般是是稳压的作用,至于具体的问题的话要具体的分析Pwm输出一般指的是脉冲宽度调...