图中,红色杜邦线一头连接树莓派的32 Pin脚(PWM0),一头连接示波器的探针;绿色杜邦线一头连接树莓派的12 Pin脚(PWM0),一头连接无源蜂鸣器的正极;黄色杜邦线一头连接树莓派的6 Pin脚(ground),一头连接无源蜂鸣器的负极,此外示波器探针的ground也连接到黄色杜邦线,结合bcm2835 C library来进行分析:
#下载bcm2835库
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.50.tar.gz
#解压
tar -zxvf bcm2835-1.50.tar.gz
#进入目录
cd bcm2835-1.35
#编译
。/configure && make
#安装
sudo make install
修改examples/pwm/pwm.c的内容如下:
63// pwm.c
//
// Example program for bcm2835 library
// Shows how to use PWM to control GPIO pins
//
// After installing bcm2835, you can build this
// with something like:
// gcc -o pwm pwm.c -l bcm2835
// sudo 。/pwm
//
// Or you can test it before installing with:
// gcc -o pwm -I 。./。./src 。./。./src/bcm2835.c pwm.c
// sudo 。/pwm
//
// Author: Mike McCauley
// Copyright (C) 2013 Mike McCauley
// $Id: RF22.h,v 1.21 2012/05/30 01:51:25 mikem Exp $
#include 《bcm2835.h》
#include 《stdio.h》
// PWM output on RPi Plug P1 pin 12 (which is GPIO pin 18)
// in alt fun 5.
// Note that this is the _only_ PWM pin available on the RPi IO headers
#define PIN RPI_GPIO_P1_12
// and it is controlled by PWM channel 0
#define PWM_CHANNEL 0
// This controls the max range of the PWM signal
#define RANGE 1024
#define PIN2 RPI_BPLUS_GPIO_J8_32
int main(int argc, char **argv)
{
if (!bcm2835_init())
return 1;
// Set the output pin to Alt Fun 5, to allow PWM channel 0 to be output there
bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_ALT5);
bcm2835_gpio_fsel(PIN2, BCM2835_GPIO_FSEL_ALT0); // 打开PI 32 Pin脚的PWM0输出功能
// Clock divider is set to 16.
// With a divider of 16 and a RANGE of 1024, in MARKSPACE mode,
// the pulse repetition frequency will be
// 1.2MHz/1024 = 1171.875Hz, suitable for driving a DC motor with PWM
bcm2835_pwm_set_clock(BCM2835_PWM_CLOCK_DIVIDER_16);
bcm2835_pwm_set_mode(PWM_CHANNEL, 0, 1);
bcm2835_pwm_set_range(PWM_CHANNEL, RANGE);
printf(“this is banlance mode, anykey will change to markspace moden”);
bcm2835_pwm_set_data(PWM_CHANNEL, RANGE/4);
getchar();
printf(“change to markspace mode, anykey to exitn”);
bcm2835_pwm_set_mode(PWM_CHANNEL, 1, 1);
bcm2835_pwm_set_range(PWM_CHANNEL, RANGE);
bcm2835_pwm_set_data(PWM_CHANNEL, RANGE/4);
getchar();
bcm2835_close();
return 0;
}
代码中首先设置PWM输出为平衡模式,之后按任意键切换为MS模式,编译:gcc -o pwm pwm.c -lbcm2835,运行:sudo 。/pwm,示波器分别捕获到如下波形图: