Ошибка исходит из указанного кода
Ошибка
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);
}
@Rocky, 👍-2
2 ответа
Первые два параметра должны быть типа double.
PID pid(&Rawval, &Rawval, &setpoint, kp, ki, kd, DIRECT);
^^^^^^^ ^^^^^^^
Кроме того, вероятно, не имеет смысла подключать и вход, и выход к &Rawval.
Посмотрите на этот пример.
Сообщение об ошибке довольно ясно описывает проблему (извлечено и отформатировано для ясности):
нет соответствующей функции для вызова
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
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- ПИД-регулятор для управления скоростью двигателя
- MPU 6050 застрял на тех же значениях
- Попытка контролировать скорость двигателя постоянного тока с помощью ПИД
- Помощь с ускорением ПИД-двигателя постоянного тока
- Как стабилизировать систему магнитной левитации?
- Глупый вопрос PID с использованием библиотеки PID
- Переключение управления между двумя разными методами
Не могли бы вы изменить часть и предоставить ее здесь соответствующим образом, чтобы я мог выполнить ее без дальнейших ошибок. Заранее спасибо., @Rocky
Нет, извините, учиться на практике. Попробуй, увидишь :-), @Tarabas