第十二课:树莓驱动SG90派舵机

 一、PWM简介

脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法

PWM(Pulse Width Modulation):脉冲宽度调制

脉冲:方波,频率(freq)

宽度:高电平的宽度,占空比(duty)

周期:CYCLE

占空比:高电平的占比(100&中占百分几)

占空比静态示意图:

第十二课:树莓驱动SG90派舵机

占空比动态示意图:

第十二课:树莓驱动SG90派舵机  

二、树莓派如何输出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介绍

                第十二课:树莓驱动SG90派舵机

 (二)占空比与舵机旋转角度关系示意图

20ms脉冲周期 高电平时间 舵机旋转角度
 0.5ms 0度
1.0ms 45度
1.5ms 90度
2.0ms 135度
2.5ms 180度

                     动态示意图

第十二课:树莓驱动SG90派舵机

 四、树莓派与SG90舵机连接示意图

              第十二课:树莓驱动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 $ 

上一篇:LCD背光调节实验


下一篇:上位机,c#上位机 支持8通道AD采集电压显示 支持1通道PWM波形演示