не работает PID

Set
Offline
Зарегистрирован: 07.02.2017

Здравствуйте, столкнулся с проблемкой. Arduino занимаюсь около месяца, не судите строго за вопрос.

плата mega 2560 R3. Не удаётся запустить PID.

Скетч:

#include <PID_v1.h>
#include <UTFT.h>
UTFT    myGLCD(ILI9341_16, 38,39,40,41);
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint,1,4,3, DIRECT);
extern uint8_t SevenSegNumFont[];
double Thermister (int RawADC)
  {double Temp;
  Temp = log(((10240000/RawADC) - 10000));
  Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
  Temp = Temp - 273.15;
  return Temp;} 
void setup()
{
Setpoint = 27;
myPID.SetMode(AUTOMATIC);
}
void loop()
{
myGLCD.clrScr();
delay (10000);
myGLCD.fillScr (255, 0, 0);
delay (10000);
Input = (Thermister (analogRead(0)));
myPID.Compute();
myGLCD.setBackColor(0, 0, 0);
myGLCD.setColor (255, 255, 255);
myGLCD.setFont (SevenSegNumFont);
myGLCD.printNumI (Output, 217, 5, 8, '0');
}
 
Он не только не выводит значение Output, но даже не меняет цвет фона, хотя компилируется без ошибок и заливается.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. Обязательно - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

Ну, раз уж Вы этого не сделали, то читайте как получится:

Скорее всего она всё выводит. Просто в строке №ХЗ Вы зачем-то стираете экран ("myGLCD.clrScr();") и показываете его чистым в течение 10 секунд. Затем, в строке №ХЗ Вы выводите на экран свой Output ("myGLCD.printNumI (Output, 217, 5, 8, '0');") и не подождав ни одной миллисекунды, заканчиваете loop, чтобы тут же начать его сначала и ... стереть только что выведенную информацию, а потом снова показывать пустой экран в течение 10 сек.

 

Igor23
Offline
Зарегистрирован: 04.02.2017

По ходу вы где-то брали код и там подключается экран - может с подключением проблема?

Можете подключить порт и посмотреть что выдаёт монитор порта:

#include <PID_v1.h>
#include <UTFT.h>
UTFT    myGLCD(ILI9341_16, 38,39,40,41);
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint,1,4,3, DIRECT);
extern uint8_t SevenSegNumFont[];
double Thermister (int RawADC)
  {double Temp;
  Temp = log(((10240000/RawADC) - 10000));
  Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
  Temp = Temp - 273.15;
  return Temp;} 
void setup()
{
	Serial.begin(9600);
Setpoint = 27;
myPID.SetMode(AUTOMATIC);
}
void loop()
{
	Serial.println(analogRead(A0));
	Serial.println(Temp(analogRead(A0)));
	Serial.println(Thermister (analogRead(0)));
	
myGLCD.clrScr();
delay (10000);
myGLCD.fillScr (255, 0, 0);
delay (10000);
Input = (Thermister (analogRead(0)));
myPID.Compute();
myGLCD.setBackColor(0, 0, 0);
myGLCD.setColor (255, 255, 255);
myGLCD.setFont (SevenSegNumFont);
myGLCD.printNumI (Output, 217, 5, 8, '0');
delay (10000);

}

 

Igor23
Offline
Зарегистрирован: 04.02.2017

Да точно - наш гуру вам уже ответил.

Set
Offline
Зарегистрирован: 07.02.2017

Спасибо за ответ, но экран уже протестирован, и написан небольшой проектик с регулированием по порогам. Сейчас планировал прикрутить ПИД т.к. привода с аналоговым управлением.

Ошибку нашёл, она заключалась в том, что я забыл про инициализацию экрана, типа:

myGLCD.InitLCD();

Ещё раз спасибо за ответ.

Set
Offline
Зарегистрирован: 07.02.2017

Если интересно, такой код работает.

#include <PID_v1.h>
#include <UTFT.h>
UTFT    myGLCD(ILI9341_16, 38,39,40,41);
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint,1,4,3, REVERSE);
extern uint8_t SevenSegNumFont[];
double Thermister (int RawADC)
  {double Temp;
  Temp = log(((10240000/RawADC) - 10000));
  Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
  Temp = Temp - 273.15;
  return Temp;} 
void setup()
{
myGLCD.InitLCD();
Setpoint = 36;
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits(0, 255);
}
void loop()
{myGLCD.clrScr();
delay (1000);
myGLCD.fillScr (255, 0, 0);
delay (1000);
Input = (Thermister (analogRead(0)));
myPID.Compute();
myGLCD.setBackColor(0, 0, 0);
myGLCD.setColor (255, 255, 255);
myGLCD.setFont (SevenSegNumFont);
myGLCD.printNumI (((Thermister (analogRead(0)))), 210, 100, 3, '0');
myGLCD.printNumI (Output, 210, 5, 3, '0');
delay (1000);
}