一、PWM简介
脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法
PWM(Pulse Width Modulation):脉冲宽度调制
脉冲:方波,频率(freq)
宽度:高电平的宽度,占空比(duty)
周期:CYCLE
占空比:高电平的占比(100&中占百分几)
占空比静态示意图:
占空比动态示意图:
二、树莓派如何输出PWM(主要介绍软件模拟PWM的方法)
wiringPi两种方式产生PWM
第一种:硬件PWM---------->(精确的PWM控制)
第二种:软件模拟PWM
(1)查看开发手册 树莓派wiringPi库详释(借鉴)
头文件:#include<softPwm.h> | ||
int softPwmCreate (int pin, int initialValue, int pwmRange) | pin:设置为软件PWM输出引脚 initalValue:引脚输出的初始值 pwmRange:PWM值的范围上限 建议使用100. 返回:0表示成功。 |
创建一个模拟的PWM输出引脚 |
void softPwmWrite (int pin, int value) | pin:PWM输出引脚 value:PWM引脚输出的值 |
输出的PWM值 |
(2)树莓派呼吸灯代码(软件模拟PWM)
#include <stdio.h>
#include <wiringPi.h>
#include <softPwm.h>
#define LED 29
int main(void)
{
int i = 0;
if(wiringPiSetup() == -1)
{
printf("gpio error!\n");
return -1;
}
softPwmCreate(LED, 0, 100); //创建一个模拟的PWM输出引脚
while (1)
{
for (i=0; i<100; i++)
{
softPwmWrite(LED, i);//输出的PWM值
delay(20);
}
for(i=100;i>0;i--)
{
softPwmWrite(LED,i);//输出的PWM值
delay(20);
}
}
return 0;
}
(3)编译(注意:链接库-lpthread -lwiringPi)
pi@raspberrypi:~/raspberry/SG90 $ ls
a.out LED.c
pi@raspberrypi:~/raspberry/SG90 $ gcc LED.c -lpthread -lwiringPi
pi@raspberrypi:~/raspberry/SG90 $
三、树莓派控制舵机旋转角度
(一)舵机SG90介绍
(二)占空比与舵机旋转角度关系示意图
20ms脉冲周期 | 高电平时间 | 舵机旋转角度 |
0.5ms | 0度 | |
1.0ms | 45度 | |
1.5ms | 90度 | |
2.0ms | 135度 | |
2.5ms | 180度 |
动态示意图
四、树莓派与SG90舵机连接示意图
五、软件代码
根据公式:PWMfreq = 1 x 10^6 / (100 x range)
,要得到PWM频率为50Hz,则range为200,即周期分为200步。
#include <wiringPi.h>
#include <softPwm.h>
#include <stdio.h>
#define PWM_PIN 29
int main(void)
{
if(wiringPiSetup() == -1)
{
printf("gpio error!\n");
return -1;
}
pinMode(PWM_PIN, OUTPUT);
softPwmCreate(PWM_PIN, 0, 200);
int num ;
while(1)
{
scanf("%d",&num);
switch()
{
case 45:
softPwmWrite(PWM_PIN, 20);
break;
case 90:
softPwmWrite(PWM_PIN, 25);
break;
defualt:
break;
}
}
return 0 ;
}
编译(注意:链接库-lpthread -lwiringPi)
pi@raspberrypi:~/raspberry/SG90 $ ls
a.out
pi@raspberrypi:~/raspberry/SG90 $ gcc LED.c -lpthread -lwiringPi
pi@raspberrypi:~/raspberry/SG90 $