Arduino中断

时间:2016-07-27 21:59:37

标签: c arduino interrupt firmware

我正在研究固件代码,我将中断时间设置为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;

}

2 个答案:

答案 0 :(得分:0)

注意Ardunio板无法快速运行。例如,对于analogRead,读取模拟输入大约需要100微秒(参见:https://www.arduino.cc/en/Reference/AnalogRead)。对于analogWrite,它会产生大约490 Hz(2ms)的波。而且,您在此处未显示的代码的其他部分可能会有更多延迟。

答案 1 :(得分:0)

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