我想使用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%
2条答案
按热度按时间mi7gmzs61#
pigpio库本身似乎在生成PWM信号方面非常有效。
也许您自己的代码正在循环中连续运行?尝试在某个时候添加
usleep(10000);
以延迟一小段时间。根据您正在做的事情,可能有更好的方法来等待事件,但问题没有包含足够的信息。
aydmsdu92#
@jpa usleep(10000)帮不了我,它只产生100赫兹。目前,我的要求是使用5千赫到20千赫的频率对pwm。并且具有最高的CPU使用率。