最大限度地减少Raspberry PI中软件PWM的CPU使用

c3frrgcw  于 2023-05-16  发布在  其他
关注(0)|答案(2)|浏览(184)

我想使用pigpio库(C语言)在Raspberry Pi 4B上的GPIO引脚(5,6,19和26)上生成一些4个软件PWM信号。我想生成8 kHz的PWM频率。我能够成功地移动和控制电机与可变占空比,但它消耗高CPU使用率,即使没有运动的控制器。当软件开始执行时,仅初始化gpioSetPWMfrequency和gpioSetPWMrange等函数。我在需要更改引脚占空比的循环中使用了gpiopwm函数。我有4个PWM通道来操作BTS7960 43A大功率电机驱动器模块,该模块连接到致动器。有没有什么方法可以减少使用?根据Pigpio文档,它使用DMA访问。我需要帮助。有没有人可以告诉我如何降低CPU的使用率,以及有没有更好的库来做这件事?我正在做的伪代码

#include <pigpio.h>
static const int kiShieldFwdPWMIOPin = 5;//21;     //Motor-1 Outputs
static const int kiShieldBackPWMPin = 6;//22;
static const int kiShieldENIOPin = 13;//23;

static const int kiColumnFwdPWMIOPin = 19;//24;     //Motor-2 Outputs
static const int kiColumnBackPWMIOPin = 26;//25;
static const int kiColumnENIOPin = 12;//26;

void setup(){
        //intialize PWM Freq
        gpioSetPWMfrequency(kiShieldFwdPWMIOPin,8000);
        gpioSetPWMfrequency(kiShieldBackPWMIOPin,8000);
        gpioSetPWMfrequency(kiColumnFwdPWMIOPin,8000);
        gpioSetPWMfrequency(kiColumnBackPWMIOPin,8000);
       
        // Setting pwm range
        gpioSetPWMrange(kiShieldFwdPWMIOPin, 100);
        gpioSetPWMrange(kiShieldBackPWMIOPin, 100);
        gpioSetPWMrange(kiColumnFwdPWMIOPin, 100);
        gpioSetPWMrange(kiColumnBackPWMIOPin, 100);
    }
  void BerryController::move(STATE state, DIRECTION direction, const int &pwmValue){
          switch (state)
    {
    case STATE::Shield:
        switch (direction)
        {
        case DIRECTION::Open:
            gpioPWM(kiShieldBackPWMIOPin,PI_LOW);
            gpioPWM(kiShieldFwdPWMIOPin,pwmValue);
            break;
        case DIRECTION::Close:
            gpioPWM(kiShieldBackPWMIOPin,pwmValue);
            gpioPWM(kiShieldFwdPWMIOPin,PI_LOW);
            break;
        case DIRECTION::Stop:        
            gpioPWM(kiShieldFwdPWMIOPin,PI_LOW);
            gpioPWM(kiShieldBackPWMIOPin,PI_LOW);
            break;
        default:
            break;
        }
        break;
    case STATE::Column:
        switch (direction)
        {
        case DIRECTION::Open:                     
            gpioPWM(kiColumnBackPWMIOPin,PI_LOW);
            gpioPWM(kiColumnFwdPWMIOPin, pwmValue);
            break;
        case DIRECTION::Close:                   
            gpioPWM(kiColumnFwdPWMIOPin,PI_LOW);
            gpioPWM(kiColumnBackPWMIOPin, pwmValue);
            break;
        case DIRECTION::Stop:
            gpioPWM(kiColumnFwdPWMIOPin,PI_LOW);
            gpioPWM(kiColumnBackPWMIOPin,PI_LOW);
            break;
        default:
            break;
        }
        break;
    default:
        break;
    }
}

My CPU usage is currently 107%
mi7gmzs6

mi7gmzs61#

pigpio库本身似乎在生成PWM信号方面非常有效。
也许您自己的代码正在循环中连续运行?尝试在某个时候添加usleep(10000);以延迟一小段时间。
根据您正在做的事情,可能有更好的方法来等待事件,但问题没有包含足够的信息。

aydmsdu9

aydmsdu92#

@jpa usleep(10000)帮不了我,它只产生100赫兹。目前,我的要求是使用5千赫到20千赫的频率对pwm。并且具有最高的CPU使用率。

相关问题