脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法
PWM(Pulse Width Modulation):脉冲宽度调制
脉冲:方波,频率(freq)
宽度:高电平的宽度,占空比(duty)
周期:CYCLE
占空比:高电平的占比(100&中占百分几)
wiringPi两种方式产生PWM
第一种:硬件PWM---------->(精确的PWM控制)
第二种:软件模拟PWM
头文件:#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值 |
#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; }
pi@raspberrypi:~/raspberry/SG90 $ ls a.out LED.c pi@raspberrypi:~/raspberry/SG90 $ gcc LED.c -lpthread -lwiringPi pi@raspberrypi:~/raspberry/SG90 $
20ms脉冲周期 | 高电平时间 | 舵机旋转角度 |
0.5ms | 0度 | |
1.0ms | 45度 | |
1.5ms | 90度 | |
2.0ms | 135度 | |
2.5ms | 180度 |
动态示意图
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 $