树莓派 PWM输出

学习记录

树莓派 PWM输出是一个重要的应用。

硬件PWM

树莓派提供的硬件PWM只有一个管脚
只有wiringPi 引脚编号下的1脚(BCM下的18脚) 支持PWM输出

void pwmWrite (int pin, int value)

pin:引脚
value:写入到PWM寄存器的值,范围在0~1024之间。
输出一个值到PWM寄存器,控制PWM输出。
pin只能是wiringPi 引脚编号下的1脚(BCM下的18脚)

pwmSetMode、pwmSetRange、pwmSetClock 函数应该都是硬件PWM的函数。

硬件PWM学习

暂时还没有。后续将软硬件分为两篇文章。

软件PWM库

wiringPi 中包含了一个软件驱动的 PWM 处理库,可以在任意的树莓派 GPIO 上输出
PWM 信号。

为了维护较低的 CPU 使用率,最小的脉冲宽度是 100 微秒(100us),结合默认的建议值为 100,那么最小的 PWM 频率是 100Hz。如果需要更高的频率,可以使用更低的数值。

也就是说脉冲宽度应该大于100us。默认值是什么?这在功能部分得到解释。点击跳转

如果看脉冲宽度的驱动代码,你会发现低于 100 微秒,wiringPi 是在软件循环中实现的,返就意味着 CPU 使用率将会动态增加,从而使得控制其他管脚成为不可能。

需要注意的是,当其他程序运行在更高的实时的优先级,Linux 可能会影响产生信号的
精度。

注意点

  • 使用前,需要包含相应的文件:
#include <wiringPi.h>
#include <softPwm.h>
  • 当编译程序时,必须加上 pthread 库
  • 必须使用 wiringPiSetup()、wiringPiSetupGpio()或者 wiringPiSetupPhys()函数来初始化 wiringPi

softPwmCreate 函数

该函数的原型为:int softPwmCreate(int pin, int initialValue, int pwmRange);
该函数将会创建一个软件控制的 PWM 管脚。可以使用任何一个 GPIO 管脚,
返回值为 0,代表成功,其他值,代表失败。
pin 是指GPIO管脚
initialValue为引脚输出的初始值
pwmRange 参数可以为 0(关)~100(全开)。PWM值的范围上限建议使用100.
实测pwmRange(200) > 100也可以。

softPwmWrite 函数

该函数的原型为:void softPwmWrite(int pin, int value);
该函数将会更新指定管脚的 PWM 值。value 参数的范围将会被检查,如果指定的管脚
之前没有通过 softPwmCreate 初始化,将会被忽略。
value:PWM引脚输出的值

程序

/*************************************************************************
    > File Name: sopwm.c
    > Author: admin
    > Mail: 
    > Created Time: 2020年01月03日 星期五 18时43分25秒
    > Modified Time:2020年01月03日 星期五 19时30分14秒
 ************************************************************************/

#include <wiringPi.h>
#include <softPwm.h>

#define pwm_pin 1    

int main (void)
{
    wiringPiSetup ();

    softPwmCreate (pwm_pin, 0, 100) ;

    softPwmWrite(pwm_pin,50);

    while(1)
    {
                                                                                                                                         
    }

    return 0 ;
}

功能

产生频率为100Hz,占空比为50的方波。
频率由函数int softPwmCreate(int pin, int initialValue, int pwmRange)决定。当pwmRange为100时,频率为100,当pwmRange为50时,频率为200,当pwmRange为2时,频率为5000。
总结如下表所示。

pwmRangef(Hz)
100100
50200
25000

所以猜测pwmRange*f = 10K
10KHz对应于100ms,即最小脉冲宽度为100ms。
占空比主要由void softPwmWrite(int pin, int value);函数控制。占空比 = value/pwmRange
使用的时候可以认为 周期 = pwmRange/10(ms)

问题

我想产生周期为20ms的方波,但是软件PWM最大的周期仅为10ms。于是我决定试一下。
实测pwmRange(200) > 100也可以。

  • 7
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值