我手里面的是树莓派3,系统是Raspbian官方操作系统,已经安装好了wiringPi。

  PWM简介:脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法。wiringpi有两种方式产生PWM,第一种为树莓派硬件PWM,如果需要精确的PWM控制的话,最好使用硬件PWM。第二种为wiringpi软件模拟的pwm,我们一种一种的介绍。
  首先是电路连接,准备做一个LED呼吸灯程序。所以电路很简单,一个LED,一个100Ω的电阻。电阻串联在LED正极,然后连接到树莓派12号引脚。LED负极接地。
一、硬件PWM。
硬件PWM IO口为物理的12号端口(当然,这个也作为软件PWM使用)。如下图所示:

 
1、使用C语言编写硬件PWM程序
 
 
pi@Raspi:~ $ sudo nano hardware_pwd.c

2、写入以下程序

 #include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <wiringPi.h> #define LED 1 int main(void)
{
int bright;
printf("Raspberry Pi wiringPi PWM test program\n");
if (wiringPiSetup() == -)
{
printf("GPIO setup error!\n");
exit();
}
pinMode(LED,PWM_OUTPUT);
while()
{
for (bright = ; bright < ; ++bright)
{
pwmWrite(LED,bright);
delay();
}
for (bright = ; bright >= ; --bright)
{
pwmWrite(LED,bright);
delay();
}
}
return ;
}

3、编译

pi@Raspi:~ $ gcc -o hardware_pwd hardware_pwd.c -lwiringPi

4、运行

pi@Raspi:~ $ sudo ./hardware_pwd

现在应该可以看到你的LED有呼吸灯效果了。

二、软件模拟PWM

 /*
============================================================================
Name : software_pwm.c
Author : Cheetah
Version :
Copyright : Geeiot
Description : PWM in C, Ansi-style
============================================================================
*/ #include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <wiringPi.h>
#include <softPwm.h> #define LED 1 //同样使用1号IO口 int main(void)
{
int i = ;
if (wiringPiSetup() == -) //初始化wiringpi
{
printf("Setup GPIO error!\n");
return -;
}
softPwmCreate(LED, , ); //创建软PWM
while ()
{
for (i = ; i < ; i++)
{
softPwmWrite(LED, i);
delay();
}
for (i = ; i > ; i--)
{
softPwmWrite(LED, i);
delay();
}
}
return ;
}

  wiringPi 中包含了一个软件驱劢的 PWM 处理库,可以在任意的树莓派 GPIO 上输出PWM 信号。但是软件模拟的PWM有一些限制。因为PWM的频率越高,所需要的CPU资源越多,所以在这之间有一些平衡。
步骤同上,我这里就直接贴出代码了。特别注意编译的时候会多一个-lpthread选项。

编译

pi@Raspi:~ $ gcc -o software_pwm software_pwm.c -lwiringPi -lpthread

运行之后会有同样的效果!

特别注意:必须使用 wiringPiSetup()、 wiringPiSetupGpio()或者 wiringPiSetupPhys()函数来初始化 wiringPi。wiringPiSetupSys()是需要要调用底层资源,因此,必须使用 sudo 命令来运行程序。
附上wiringpi用户手册的下载:https://www.geeiot.net/forum.php ... 1121&extra=page%3D1

转载:https://www.geeiot.net/forum.php?mod=viewthread&tid=1122&extra=page%3D1

 

树莓派进阶之路 (013) - 树莓派2/3 C语言使用PWM的更多相关文章

  1. 树莓派进阶之路 (012) - 树莓派配置文档 config.txt 说明

    原文连接:http://elinux.org/RPi_config.txt 由于树莓派并没有传统意义上的BIOS, 所以现在各种系统配置参数通常被存在”config.txt”这个文本文件中. 树莓派的 ...

  2. 树莓派进阶之路 (028) - 树莓派SQLite3的安装

    MySQL占用内存太大,而SQLite是一款轻量级零配置数据库,非常适合在树莓派和其他嵌入式系统中使用.SQLite文档详细资料丰富,本文不会详细解释SQLite数据库操作的方方面面,只能结合具体场景 ...

  3. 树莓派进阶之路 (019) - 树莓派通过filezilla,samba与PC文件共享(转)

    虽然我们可以很方便的通过ssh譬如putty或者vnc连接操控树莓派,但是毕竟树莓派资源没那么高,在上面编程,调试要吃力的多.所以还是想在pc上编程上传到树莓派或者最好,文件共享,可以直接读写共同的文 ...

  4. 树莓派进阶之路 (015) - 树莓派使用DS18B20模块测量温度

    参考:http://shumeipai.nxez.com/2013/10/03/raspberry-pi-temperature-sensor-monitors.html 第一步,允许单总线接口 su ...

  5. 树莓派进阶之路 (010) - 树莓派raspi-config配置(转)

    经过前面两步我们的树莓派已经正常的工作起来了,但是在真正用它开发之前还需要进行一些列的配置以及软件的安装,这样开发起来才会得心应手,下面我们介绍一下常用的软件和服务 1.配置选项: 树莓派第一次使用的 ...

  6. 树莓派进阶之路 (008) - 树莓派安装ftp服务器(转)

    vsftpd是开源的轻量级的常用ftp服务器.   1,安装vsftpd服务器 (约400KB) sudo apt-get install vsftpd     2,启动ftp服务 sudo serv ...

  7. 树莓派进阶之路 (006) - 树莓派安装wiringPi

    安装git-core sudo apt-get install git-core 下载winringPi库 git clone git://git.drogon.net/wiringPi 编译和安装库 ...

  8. 树莓派进阶之路 (009) - 树莓派ftp脚本(原创)

    FTP.sh #!/bin/sh cd echo "彻底卸载原有的ftp" sudo apt-get remove --purge vsftpd #(--purge 选项表示彻底删 ...

  9. 树莓派进阶之路 (005) - 树莓派Zsh安装脚本(原创)

    zsh.sh #!/bin/bash cd #安装zsh sudo apt-get install zsh #查看zsh cat /etc/shells #更改zsh chsh -s /bin/zsh ...

随机推荐

  1. Spark 以及 spark streaming 核心原理及实践

    收录待用,修改转载已取得腾讯云授权 作者 | 蒋专 蒋专,现CDG事业群社交与效果广告部微信广告中心业务逻辑组员工,负责广告系统后台开发,2012年上海同济大学软件学院本科毕业,曾在百度凤巢工作三年, ...

  2. 个基于TensorFlow的简单故事生成案例:带你了解LSTM

    https://medium.com/towards-data-science/lstm-by-example-using-tensorflow-feb0c1968537 在深度学习中,循环神经网络( ...

  3. (转)【风宇冲】Unity3D教程宝典之Blur

    原创文章如需转载请注明:转载自风宇冲Unity3D教程学院                   BlurBlur模糊其实理解了以后非常简单.核心原理就是 1个点的颜色 并不用该点的颜色,而是用该点周围 ...

  4. "Value does not fall within the expected range" with managed metadata fields

      From: http://geekswithblogs.net/claraoscura/archive/2011/01/21/143569.aspx The problem: I have an ...

  5. oauth2-server-php-docs 授权控制器

    授权控制器 概观 对于授权端点,要求用户使用authorization code(授权码授权类型)或access token(隐式授权类型)对客户端进行认证和重定向. 方法 handleAuthori ...

  6. 一些常用&实用的Linux命令

    这些指令还是很常用的,最起码有些我每天都要用.当然,很多东西还是写成shell脚本用起来更方便. man 命令(查看一个命令的详细帮助信息) 命令 --help(显示一个命令的简单帮助信息) 命令 | ...

  7. Rust 的安装和使用举例

    一.环境 二.安装 $curl -sSf https://static.rust-lang.org/rustup.sh | sh Welcome to Rust. This script will d ...

  8. ArcEngine应用程序中无法实现TOC图层多选

    在ArcMap的内容列表中,Ctrl和Shift多选.反选等操作图层非常方便. 然而遗憾的是:经测试,查证在ArcEngine应用程序中无法使用此接口,只能通过在Desktop中来使用IContent ...

  9. var, object, dynamic的区别以及使用

    var, object, dynamic的区别以及使用 阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 拿这三者比较的原因 ...

  10. tar 使用总结

    今天需要备份数据,使用tar命令,总结一下. 压缩命令: tar -zvvf ticket-data-intgration.tar.gz ticket-data-intgration 压缩但是不包含某 ...