【问题标题】:Interrupt in ArduinoArduino中的中断
【发布时间】:2016-12-02 02:38:48
【问题描述】:

我正在编写固件代码,我将中断时间设置为 10us,但现在循环每 5ms 运行一次,这要慢得多。任何关于如何加速循环的想法都非常感谢!

unsigned long lastTime;
double BAT_I_FB, Output, Setpoint= 8 ;
double errSum=0, lastErr,error=99;
double kp=0.1, ki=15, kd=0;
double KdVal,KpVal,KiVal,PID,BUS_V;
double SampleTime = 10;

void loop() {

unsigned long now = micros();

int timeChange = (now-lastTime);

if(timeChange >= SampleTime)
{
/*Compute all the working error variables*/
BAT_I_FB = analogRead(pins[15].arduinoPinNumber);
BAT_I_FB = float(BAT_I_FB * (5.0/1024)) * pins[15].multiplier;


error = Setpoint - BAT_I_FB;
errSum += error;
double dErr = (error - lastErr);

BUS_V = analogRead(pins[18].arduinoPinNumber);
BUS_V = float(BUS_V * (5.0/1024)) * pins[18].multiplier;

/*compute PID Output*/

PID = kp * error +ki/10000 * errSum + kd * 1000 * dErr;

Output = (PID-100) * (-2.5);

analogWrite(2, Output);


/*Remember some variable for next time*/
lastErr = error;
lastTime = now;

}

【问题讨论】:

  • 这个处理器有多快,中断处理程序中有多少代码?您可能只能在 10 微秒内执行少量指令 - 在这种情况下,解决方案是“少做事或获得更快的处理器”。

标签: c arduino interrupt firmware


【解决方案1】:

请注意,Ardunio 板不能运行得那么快。例如,对于模拟读取,读取模拟输入大约需要 100 微秒(请参阅:https://www.arduino.cc/en/Reference/AnalogRead)。对于模拟写入,它会生成大约 490 赫兹(2 毫秒)的波。并且您未在此处显示的代码的其他部分可能会出现更多延迟。

【讨论】:

  • 我尝试将频率提高到 31khz,但由于某种原因它不起作用,知道为什么吗? int myEraser=7; TCCR3B &=~myEraser; int myPrescaler=1; TCCR3B |= myPrescaler;
【解决方案2】:

一般来说,最好不要在中断中做太多工作,你没有在这里显示你的中断代码,但是在 10uS 的速率下,你无论如何也做不了太多。你用的是哪个板子?一种解决方案可能是在您的中断中设置一个标志,然后在您的主循环中处理中断,但事实仍然是,如果您需要每 10uS 完成的工作超过了您的处理器在这段时间内可以完成的工作,则需要付出一些努力。考虑一下在发生时序冲突的情况下应该推迟代码的哪一部分,并以这种方式构建代码,中断优先于其他所有内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2011-07-03
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多