Преобразования ШИМ в значения Val

Igoreck
Offline
Зарегистрирован: 01.03.2017

как библиотеку PID, заставить выдавать не ШИМ, а значения например - от 0 до 1024.

 


/*********************************/
#include <PID_v1.h>
double Setpoint, Input, Output;
double Kp=2, Ki=5, Kd=1;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

/*********************************/
#include <MCP4725.h>
MCP4725 dac(SDA, SCL);

/*********************************/
int potentenciometr = A0;
int val_r1;    // Потенциометр

/*********************************/
void setup(void) {
  
/*********************************/  
  dac.begin();
  
/*********************************/
Setpoint = 100;
myPID.SetMode(AUTOMATIC);

/*********************************/

}

void loop(void) {

/*********************************/
  val_r1 = analogRead(potentenciometr);    
  val_r1 = map(val_r1, 0, 1023, 0, 100);  
 
/*********************************/
Input = val_r1;
  myPID.Compute();
 // analogWrite(PIN_OUTPUT, Output);
  
/*********************************/

  dac.setValue(Output); 


}

 

nik182
Offline
Зарегистрирован: 04.05.2015

Поставить на ноге с ШИМ RC цепочку. Получим постоянное напряжение.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Дык он и выдает значение.

Попробуйте в 43 строке вставить Serial.print(Output) и подивитесь :)

Igoreck
Offline
Зарегистрирован: 01.03.2017

mykaida пишет:

Дык он и выдает значение.

Попробуйте в 43 строке вставить Serial.print(Output) и подивитесь :)

Да от 0 до 255, а мне надо до 1024!

А можно через  Output= map(Output, 0, 255, 0, 1024);?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Используй 

void SetOutputLimits(double, double); // * clamps the output to a specific range. 0-255 by default, but
	                              //   it's likely the user will want to change this depending on
		                      //   the application

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Igoreck пишет:

А можно через  Output= map(Output, 0, 255, 0, 1024);?

А что, просто умножить на четыре религия не позволяет? Будет тоже самое, что с мапом только вдвое быстрее.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

ЕвгенийП пишет:

А что, просто умножить на четыре религия не позволяет? Будет тоже самое, что с мапом только вдвое быстрее.

 

Зачем умножать если в библиотеке есть штатное средство - SetOutputLimits()

Igoreck
Offline
Зарегистрирован: 01.03.2017

asam пишет:

Используй 

void SetOutputLimits(double, double); // * clamps the output to a specific range. 0-255 by default, but
	                              //   it's likely the user will want to change this depending on
		                      //   the application

 

Отлично добрый человек, но очень медленно растет это значение, 

как ему дать понять, что мне хватает целочисленное, а не с плавающей точкой? 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Igoreck пишет:

Отлично добрый человек, но очень медленно растет это значение, 

как ему дать понять, что мне хватает целочисленное, а не с плавающей точкой? 

 

Дело не в целочисленности. Значение растет в зависимости от заданных коэффициентов. Можно делать динамическую подстройку. Здесь все хорошо описано, но, увы, на буржуйском языке - http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Если состояние вывода может принимать значения ШИМ скважностью 0-255, зачем нужно абстрактное значение 0-1023 ?
Оно во первых ложное, во вторых к коду никакого отношения не имеет

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Kakmyc пишет:
Если состояние вывода может принимать значения ШИМ скважностью 0-255, зачем нужно абстрактное значение 0-1023 ? Оно во первых ложное, во вторых к коду никакого отношения не имеет

 

Потому что здесь речь идет не о ШИМе а о ЦАПе MCP4725 который 12 разрядный. Так что, по-хорошему, надо говорить о 0-4096.

Igoreck
Offline
Зарегистрирован: 01.03.2017

asam пишет:

Kakmyc пишет:
Если состояние вывода может принимать значения ШИМ скважностью 0-255, зачем нужно абстрактное значение 0-1023 ? Оно во первых ложное, во вторых к коду никакого отношения не имеет

 

Потому что здесь речь идет не о ШИМе а о ЦАПе MCP4725 который 12 разрядный. Так что, по-хорошему, надо говорить о 0-4096.

ДА, ДА, именно так и есть!

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Цитата:
Потому что здесь речь идет не о ШИМе а о ЦАПе MCP4725 который 12 разрядный. Так что, по-хорошему, надо говорить о 0-4096.

Цитата:
ДА, ДА, именно так и есть!

 

А чем управляем?

Igoreck
Offline
Зарегистрирован: 01.03.2017

asam пишет:

Цитата:
Потому что здесь речь идет не о ШИМе а о ЦАПе MCP4725 который 12 разрядный. Так что, по-хорошему, надо говорить о 0-4096.

Цитата:
ДА, ДА, именно так и есть!

 

А чем управляем?

Тиристорный трехфазный привод  на 100 ампер!

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

100А приводами управляют недоучки, а как Вы, батенька, будете управлять 3-мя фазами от 0-1024?

Igoreck
Offline
Зарегистрирован: 01.03.2017

mykaida пишет:

100А приводами управляют недоучки, а как Вы, батенька, будете управлять 3-мя фазами от 0-1024?

ПИД - от 0 до 4095, ЦАП, опторазвязка, и на управления СИФУ, а он в свою очередь тиристорным мостом!

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Igoreck пишет:

ПИД - от 0 до 4095, ЦАП, опторазвязка, и на управления СИФУ, а он в свою очередь тиристорным мостом!

Пи..нц, а как Вы фазу отслеживать будете? Или по европейской привычке - превращая в постоянку, а потом импульно ШИМ?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Igoreck пишет:

Тиристорный трехфазный привод  на 100 ампер!

 

Тогда, возможно, будет лучше воспользоваться библиотекой FastPID, она требует примерно в 2 раза меньше времени на один цикл.

Igoreck
Offline
Зарегистрирован: 01.03.2017

mykaida пишет:

Igoreck пишет:

ПИД - от 0 до 4095, ЦАП, опторазвязка, и на управления СИФУ, а он в свою очередь тиристорным мостом!

Пи..нц, а как Вы фазу отслеживать будете? Или по европейской привычке - превращая в постоянку, а потом импульно ШИМ?

Это все уже есть и отлаженно работает! Задача только в "смесителе", тоесть - задатчик частоты, ОС, защита.

 

Igoreck
Offline
Зарегистрирован: 01.03.2017

asam пишет:

Igoreck пишет:

Тиристорный трехфазный привод  на 100 ампер!

 

Тогда, возможно, будет лучше воспользоваться библиотекой FastPID, она требует примерно в 2 раза меньше времени на один цикл.

Прошу Вас, поподробней!

Igoreck
Offline
Зарегистрирован: 01.03.2017

Еще вопрос, можно ли менять коефициеты ПИД, на ходу например из прикрученного меню?

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Igoreck пишет:

asam пишет:

Тогда, возможно, будет лучше воспользоваться библиотекой FastPID, она требует примерно в 2 раза меньше времени на один цикл.

Прошу Вас, поподробней!

https://github.com/mike-matera/FastPID

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Igoreck пишет:

Еще вопрос, можно ли менять коефициеты ПИД, на ходу например из прикрученного меню?

 

Можно.