Ошибка исходит из указанного кода

Ошибка

Arduino: 1.8.19 (Windows 10), Board: "Arduino Uno"

AnalogInOutSerial:8:56: error: no matching function for call to 'PID::PID(int*, int*, double*, double&, double&, double&, int)'
 PID pid(&Rawval, &Rawval, &setpoint, kp, ki, kd, DIRECT);
                                                        ^
In file included from C:\Users\USER\AppData\Local\Temp\arduino_modified_sketch_407168\AnalogInOutSerial.ino:1:0:
C:\Users\USER\Documents\Arduino\libraries\Arduino-PID-Library-master/PID_v1.h:24:5: note: candidate: PID::PID(double*, double*, double*, double, double, double, int)
     PID(double*, double*, double*,        // * constructor.  links the PID to the Input, Output, and
     ^~~
C:\Users\USER\Documents\Arduino\libraries\Arduino-PID-Library-master/PID_v1.h:24:5: note:   no known conversion for argument 1 from 'int*' to 'double*'
C:\Users\USER\Documents\Arduino\libraries\Arduino-PID-Library-master/PID_v1.h:20:5: note: candidate: PID::PID(double*, double*, double*, double, double, double, int, int)
     PID(double*, double*, double*,        // * constructor.  links the PID to the Input, Output, and
     ^~~
C:\Users\USER\Documents\Arduino\libraries\Arduino-PID-Library-master/PID_v1.h:20:5: note:   candidate expects 8 arguments, 7 provided
C:\Users\USER\Documents\Arduino\libraries\Arduino-PID-Library-master/PID_v1.h:5:7: note: candidate: constexpr PID::PID(const PID&)
 class PID
       ^~~
C:\Users\USER\Documents\Arduino\libraries\Arduino-PID-Library-master/PID_v1.h:5:7: note:   candidate expects 1 argument, 7 provided
C:\Users\USER\Documents\Arduino\libraries\Arduino-PID-Library-master/PID_v1.h:5:7: note: candidate: constexpr PID::PID(PID&&)
C:\Users\USER\Documents\Arduino\libraries\Arduino-PID-Library-master/PID_v1.h:5:7: note:   candidate expects 1 argument, 7 provided
exit status 1
no matching function for call to 'PID::PID(int*, int*, double*, double&, double&, double&, int)'


This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Действительный код

#include <PID_v1.h>

int analogPin = A3; 
int Rawval ;  // переменная для хранения прочитанного значения
double setpoint = 169; // целевое значение для системы установлено на 169
double kp = 1, ki = 0.1, kd = 0.01; // ПИД-константы
int RELAY_pin = 10;    // Реле подключено к контакту D10
PID pid(&Rawval, &Rawval, &setpoint, kp, ki, kd, DIRECT);

void setup()
{
  Serial.begin(9600);           // установить серийный номер
  pinMode(RELAY_pin, OUTPUT);
  pid.SetMode(AUTOMATIC);
}

void loop()
{
  Rawval = analogRead(analogPin);
  Serial.print("Rawvalue from Analog input  =");
  Serial.println(Rawval);
  pid.Compute();
  digitalWrite(RELAY_pin, Rawval < setpoint ? HIGH : LOW); 
}

, 👍-2


2 ответа


1

Первые два параметра должны быть типа double.

PID pid(&Rawval, &Rawval, &setpoint, kp, ki, kd, DIRECT);
        ^^^^^^^  ^^^^^^^

Кроме того, вероятно, не имеет смысла подключать и вход, и выход к &Rawval.

Посмотрите на этот пример.

,

Не могли бы вы изменить часть и предоставить ее здесь соответствующим образом, чтобы я мог выполнить ее без дальнейших ошибок. Заранее спасибо., @Rocky

Нет, извините, учиться на практике. Попробуй, увидишь :-), @Tarabas


2

Сообщение об ошибке довольно ясно описывает проблему (извлечено и отформатировано для ясности):

нет соответствующей функции для вызова
PID::PID(int*, int*, double*, double&, double&, double&, int)
[...]
кандидат:
PID::PID(double*, double*, double*, double, double, double, int)
[...]
неизвестное преобразование для аргумента 1 из 'int*' в 'double*'
[другие кандидаты исключены из-за несоответствия количества аргументов]

Вам нужно предоставить указатели на double в качестве первых двух аргументов, и кандидат будет соответствовать.


ОБНОВЛЕНИЕ:

Я долго не решался предоставить вам это, потому что вы гораздо лучше учитесь, делая это самостоятельно. В любом случае, вот оно.

Исходное объявление переменной:

int Rawval ;  // переменная для хранения прочитанного значения

Замените тип данных int на double, как ожидает вызываемый конструктор:

double Rawval ;  // переменная для хранения прочитанного значения

Теперь есть эта строка, присваивающая int double:

Rawval = analogRead(analogPin);

Вы можете спросить себя, нормально ли это? Ну попробуйте. Вы обнаружите, что компилятор неявно преобразует значение. Если вы хотите сделать это явно, измените строку на:

Rawval = static_cast<double>(analogRead(analogPin));

И последнее, как утверждает Датенхейм: прочтите и узнайте больше о PID. Использование одной и той же переменной для ввода и вывода является ошибкой.

,

Не могли бы вы изменить часть и предоставить ее здесь соответствующим образом, чтобы я мог выполнить ее без дальнейших ошибок. Заранее спасибо., @Rocky

Мой код в порядке?? Я интегрирую ваш в соответствии с модификацией. Пока он не выдаст ошибку? Код состоит в том, чтобы интегрировать PID в Arduino с аналогичным датчиком на основе порогового значения, такого как 169 для необработанного значения. Если значение меньше реле будет работать. Целевое необработанное значение = 169 Целевой масштаб = 5 Уставка также Какими будут значения ka, kp, ki для полного функционирования, как описано. Пожалуйста, направляйте. Спасибо!, @Rocky

@Rocky, этот сайт работает не так. Ваш код принадлежит вам. Вы получили достаточно информации, чтобы исправить ошибку в вашем коде, и теперь вам нужно интегрировать решение и исправить свой код, чтобы он работал так, как вы хотите., @StarCat

Я понимаю важность. Очень признателен, но для меня было бы здорово, если бы вы любезно указали значения для kp, ka, ki, @Rocky

@ Рокки, я понятия не имею. Это совсем другой вопрос, и уж точно не о программировании. Поскольку ваш курс, похоже, связан с техникой управления, вам следует повторить пройденный материал., @the busybee

Установленное значение или целевое значение составляет 169 в исходном виде и 5% в качестве масштабированного значения. Текущее значение -4&8 .Соответственно..Кп,ка,ки?, @Rocky

@Rocky, это не имеет смысла, и этот сайт не является бесплатной службой домашних заданий., @StarCat