初识PWM

Carmi

PWM的定义

PWM,(Pulse Width Modulation),脉冲宽度调制。 是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简而言之就是用数字信号模拟模拟电压信号。广泛应用在从测量、通信到功率控制与变换的许多领域中。
在HI3861V100芯片中,共有6个PWM端口。每个GPIO都可以复用成其中一种PWM端口。如图所示:
pAyFM0U.png

PWM的原理

  • 首先,要知道等效电压的概念:一个电路中可以用一个电压源来替代其他电压源的电压值,能够在另一点上产生相同的电势差。可以用微分的思想理解。如图,上图为等效电压,下图为方波电压。
    pAykPjx.png

  • 因此,PWM就是通过变化的数字信号实现控制模拟电压信号的效果。
    pAyFfHS.png

  • PWM输出的数字信号通常是方波。信号从高电平到低电平,再回到高电平为一个周期。而一秒钟内有多少个这样的周期就是PWM的频率。

  • 一个脉冲周期内,高电平与整个周期时间的比例为占空比,而高电平的时间为脉宽时间。每个周期的占空比可以不同。假设PWM的电压为+5V,即高电平电压为+5V,并且PWM的每个周期占空比为20%,脉冲信号的频率为20Hz,那么PWM在1秒钟内输出了20次脉冲信号,且PWM的输出的电压是根据占空比输出的,即在一个输出周期内,某段时间等效直流电压为5*20%=1V。而实际上,PWM在某段时间输出高电平,某段时间输出低电平。由此,占空比越大,等效电压越大。另外,只有方波每个周期的占空比一样时,才能输出等效直流电压;同时,也可以调整每个周期占空比,实现等效正弦电压。

  • 数字信号向模拟电压信号的转变是通过阻容变换电路实现的。PWM通过输出0/1,传递信息,实现高低电平的输出,这一过程叫做数字信号输出。而模拟电信号则直接通过电压值来传递信息。但是,模拟信号容易收到电磁的干扰,导致电压值改变,使传输的信息出现错误。由于数字信号只有两种状态,只要不是太强的干扰,都不会影响对电平的判断。因而,数字信号传输数据也就更快更稳。这也让数字信号在现代通信中占据了主导地位。数字电视逐渐淘汰模拟电视,告别“雪花屏时代”。

PWM的实际应用

  1. 呼吸灯
    常见的LED灯,当它的频率大于50Hz时,人眼就会产生视觉暂留效果,基本就看不到LED的亮灭,而是常亮(亮度可能会减少,但不会灭)的LED。因此,可以在50Hz以下,用不同的暂空比改变LED灯的亮度,实现呼吸灯的效果。

  2. 控制电机转速
    占空比可以实现对电机转速的调节,我们知道,占空比是高电平在一个周期之中的比值,高电平的所占的比值越大,占空比就越大,对于直流电机来讲,电机输出端引脚是高电平电机就可以转动,当输出端高电平时,电机会转动,但是是一点一点的提速,在高电平突然转向低电平时,电机由于电感有防止电流突变的作用是不会停止的,会保持这原有的转速,以此往复,电机的转速就是周期内输出的平均电压值,所以实质上我们调速是将电机处于一种,似停非停,似全速转动又非全速转动的状态,那么在一个周期的平均速度就是我们占空比调出来的速度了。

在电机控制中,电压越大,电机转速越快,而通过PWM输出不同的模拟电压,便可以使电机达到不同的输出转速。

当然,在电机控制中,不同的电机都有其适应的频率 频率太低会导致运动不稳定,如果频率刚好在人耳听觉范围,有时还会听到呼啸声。频率太高的电机可能反应不过来。

  1. 控制舵机
    舵机的控制就是通过一个固定的频率,给其不同的占空比的,来控制舵机不同的转角。

舵机的频率一般为频率为50HZ,也就是一个20ms左右的时基脉冲,而脉冲的高电平部分一般为0.5ms-2.5ms范围。来控制舵机不同的转角。
 
500-2500us的PWM高电平部分对应控制180度舵机的0-180度。

以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
即不同的占空比对应不同的转动角度。

与PWM相关的语句

  • hi_io_set_func()
    将某一GPIO复用成PWM,具体如图:
    pAyFM0U.png
    第一个参数示例:HI_IO_NAME_GPIO_0
    第二个参数示例:HI_IO_FUNC_GPIO_11_PWM2_OUT

  • hi_pwm_init()
    初识化某一PWM

  • IoTPwmStart()
    开始输出PWM信号,共三个参数,分别是,要使用的PWM,占空比(单位是%,取值范围是(0,100)),分频倍率

分频倍率是指在PWM信号生成过程中,用来降低主时钟频率的一个数值,由此可以计算/设置PWM的输出频率=主时钟频率/分频倍率。因此,PWM的输出频率不能大于主时钟频率。分频倍率的作用在于,它允许我们在一个固定的主频下,通过分频得到不同频率的PWM信号,这样可以更灵活地控制各种需要PWM信号的设备,如调节LED亮度、控制电机速度等。通过设置不同的分频倍率,我们可以得到不同频率的PWM波形,以适应不同的应用场景。

那么高电平的时间=(占空比/100)*(1/PWM的输出频率)

  • IoTPwmStop()
    结束输出某一PWM信号

  • usleep()
    设定输出PWM信号的时间,单位是微秒,理论上应该是PWM输出周期的整数倍

  • hi_pwm_set_clock()
    设置PWM时钟源,即主时钟频率。相关枚举如下:

typedef enum {
    PWM_CLK_160M, /**< 160M APB clock.CNcomment:160M 工作时钟 CNend */
    PWM_CLK_XTAL, /**< 24M/40M crystal clock.CNcomment:24M或40M 晶体时钟 CNend */
    PWM_CLK_MAX   /**< Maximum value, which cannot be used.CNcomment:最大值,不可使用CNend */
} hi_pwm_clk_source;
Logo

海思 HiSpark 开发者社区是上海海思为开发者搭建的内容和交流平台,依托完备芯片解决方案、专业开发环境、开源/开放的软件资源与社区技术内容,构建完整服务生态开发者的闭环体系。

更多推荐