问题描述
我正在开发与nema stepper motor
接口的arduino
驱动程序。我创建了一个课程。我将其命名为Axis
。我想为此类为每个电动机创建一个轴对象。但是,我无法从类中调用attachInterrupt
中的arduino.h
函数。它返回此错误:
In member function 'void Axis::setReverseInt()':
paRSStep.cpp:12:77: error: invalid use of non-static member function 'void Axis::revDirection()'
attachInterrupt(digitalPinToInterrupt(reverseDirPin),revDirection,RISING);
Axis::Axis()
{
}
Axis::~Axis()
{
}
void Axis::setReverseInt () {
attachInterrupt(digitalPinToInterrupt(reverseDirPin),RISING);
}
void Axis::setStopInt () {
//attachInterrupt(digitalPinToInterrupt(stopPin),stopMotor,RISING);
}
void Axis::revDirection()
{
dirMode = !dirMode;
}
void Axis::stopMotor()
{
moveMotor = !moveMotor;
}
void Axis::startMotor()
{
moveMotor = true;
}
void Axis::moveStep(int pulseRev,byte laps,boolean dir)
{
digitalWrite(dirPin,dir);
int totalpulse = pulseRev * laps;
for (int i = 0; i < totalpulse; i++)
{
speedValue = map((analogRead(speedPin)),1023,2000,10);
digitalWrite(pulsePin,HIGH);
delayMicroseconds(speedValue);
digitalWrite(pulsePin,LOW);
delayMicroseconds(speedValue);
}
}
解决方法
在为自己正在从事的一个大型项目编写自己的库时,我遇到了类似的问题。在方法内部配置中断时发生在我身上。我发现了一种解决方法,尽管它看起来似乎有些复杂,但却可以解决问题。就我而言,我用它来读取旋转编码器的开关。
我使用的是一个指向ISR处理程序的指针和一个调用它的方法。在设置功能上,您可以调用ISR服务的初始化。
首先,在您的.h文件中声明以下方法(除了您自己的方法之外):
void init();
static void ISRHandler();
void setupISRHandler(uint8_t pin,void (*ISR)(void),int state); // this will configure your ISR
和一个指针:
static Axis *_ISRPointer; // can be declared as private (like in here from the '_' prefix)
然后,在您的.cpp文件中按如下方式使用它:
#include "Axis.h"
Axis *Axis::_ISRPointer = nullptr;
您将在初始化期间使用init方法初始化ISR处理程序:
void Axis::init(){
setupISRHandler(reverseDirPin,Axis::ISRHandler,RISING);
}
设置方法如下:
void Axis::setupISRHandler(uint8_t pin,void (*ISRFunction)(void),int state){
attachInterrupt(digitalPinToInterrupt(pin),ISRFunction,state);
}
ISRHandler负责调用ISR例程:
void Axis::ISRHandler(){
_ISRPointer-> revDirection();
}
void Axis::revDirection(void){
// Do not forget to disable interrupts
cli();
// your routine goes here
dirMode= !dirMode;
sei();
}
因此,您将在主.ino文件中执行以下操作:
#include "Axis.h"
#include <whateverotherlibraryyouneed.h>
Axis ax = Axis(); // your new object
void setup(){
ax.init();
ax.startMotor();
}
void loop(){
if(day == SUNNY){
ax.moveStep(100,2,CLOCKWISE);
} else {
ax.stopMotor();
}
ax.someOtherMethodToControlTheMotor(anyArgumentYouWant);
}
我希望我的复杂解决方案对您有帮助
欢呼
博士丹尼尔