不说废话,代码如下
pwm.h
#ifndef PWM_H
#define PWM_H
#define pwm_pin 5 //这里我插的是5引脚
#include <QObject>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include "wiringPiI2C.h"
#include "wiringPi.h"
#include <softPwm.h>
class PWM : public QObject
{
Q_OBJECT
public:
explicit PWM(QObject *parent = nullptr);
qint32 i;
bool flag,isOk;
void sleep(unsigned int msec);
[[noreturn]]void PwmStart();
void PwmStop();
signals:
public slots:
};
#endif // PWM_H
pwm.cpp
#include "pwm.h"
#include <QTime>
#include <QApplication>
#include <QEventLoop>
PWM::PWM(QObject *parent) : QObject(parent)
{
wiringPiSetup();//初始化树莓派
}
void PWM::PwmStart()
{
softPwmCreate (pwm_pin, 0, 200) ; // 设置pwm_pin为PWM输出
i = 10;
flag = true;
isOk = true;
while(isOk)
{
if(flag)
{
i++;
softPwmWrite(pwm_pin,i);
sleep(200);
}
else
{
i--;
softPwmWrite(pwm_pin,i);
sleep(200);
}
if(i < 10)
{
i = 10;
flag = true;
}
else if (i > 20) {
i = 20;
flag = false;
}
}
}
void PWM::PwmStop()
{
isOk = false;
softPwmWrite(pwm_pin,10);
softPwmStop(pwm_pin);
}
void PWM::sleep(unsigned int msec)
{
//currnentTime 返回当前时间 用当前时间加上我们要延时的时间msec得到一个新的时刻
QTime reachTime = QTime::currentTime().addMSecs(msec);
//用while循环不断比对当前时间与我们设定的时间
while(QTime::currentTime()<reachTime){
//如果当前的系统时间尚未达到我们设定的时刻,就让Qt的应用程序类执行默认的处理,
//以使程序仍处于响应状态。一旦到达了我们设定的时刻,就跳出该循环,继续执行后面的语句。
QApplication::processEvents(QEventLoop::AllEvents,100);
}
}