Считывание n-Раз сигнала AnalogRead за такт ШИМ.

Vasiliy_Pavlov
Offline
Зарегистрирован: 20.04.2017

Приветствую! Опишу задачу: необходимо сдлеать обратную связь по току в системе управления. По сути все сводится к к снятию показаний тока через АЦП Arduino Uno  несколько раз (минимум 10) за такт сигнала ШИМ. Зная постоянное сопротивление и максимальный ток проходящий через катушку, можно по напряжению получить значение тока. 

Что думаю сам: Снимать показания  AnalogRead в массив значений с неопределенным размером (увеличивать размер на еденицу после каждого измерения и вести счетчик количества измерений). Организовать прерывание по окончанию такта ШИМ сигнала, где в функции прерывания обнулять счетчик и сбрасывать значения массива. Тем временем в основном теле цикла обрабатывать полученные значения, например усреднять. 

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

PS. Можно ли организовать прерывание таким образом: attachInterrupt(1, Sbros, RISING);(ШИМ сигнал формируется на третьем пине, в функции Sbros реализуется сброс счетчика и значений массива)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Стесняюсь спросить, но что именно Вы называете "тактом сигнала ШИМ"?

Если можно - просто своими словами, без использования терминологии.

Vasiliy_Pavlov
Offline
Зарегистрирован: 20.04.2017

wdrakula пишет:

Стесняюсь спросить, но что именно Вы называете "тактом сигнала ШИМ"?

Если можно - просто своими словами, без использования терминологии.

Один период. Если абстрактно один период сигнала равен 10с, то необходимо снимать показания с AnalogRead каждую секунду.  

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

тогда почему Вы назвали это ШИМ?

ШИМ, если позволите, это Широтно Импульсная Модуляция. Сигнал ШИМ имеет вид последовательности прямоугольных импульсов с постоянным периодом, но различной длительности.

Сигнал с периодом 10 сек с трудом может быть назван ШИМ. ...С большой натяжкой.

В "экосистеме" Ардуино естественным считается ШИМ, порождаемый встроенной в IDE функцией analogWrite(), он имеет частоту примерно 500 Гц и, соответственно, период 2 мс. Вот за 2 мс сделать 10 АЦП и обработать - в теории возможно, но потребует филигранного программирования. То есть задача не для новичка совсем.

----

Отсюда вывод: задавайте вопрос точнее. Суть управления, суть обратной связи, почему назвали ШИМом, что имели ввиду?

А АЦП - ну читайте даташит (это из 328-ого, мы ведь про него говорим?):

 ------    Up to 76.9kSPS (Up to 15kSPS at Maximum Resolution)

Прикиньте сколько времени нужно на обработку данных, да и нужно ли 10 измерений. Теория управления - интересная наука, там много решений.

 

Vasiliy_Pavlov
Offline
Зарегистрирован: 20.04.2017

Прошу прощения за нечетко поставленный вопрос. Опишу более подробно и приложу скетч. На данный момент реализован алгоритм управления электрогидравлическим приводом с помощью драйвера двигателя L298N. Шток перемещается из-за протекания тока через катушку индуктивности в том или ином направлении (очень примитивный принцип работы, опуская механику работы самого привода). Направление тока определяется алгоритмом управления через L298N (Н - мост), проще говоря, если нужно, чтобы шток перемещался вправо, то ток тещет в одну сторону, при перемещении штока в другую сторону, ток также меняет направление. 

//Перемещение штока
void Peremeshenie(){
  
  
  Xzadanoe = pwm; //Коэффициент заполнения ШИМ приходящий от интерфеса "оператора"
    
  delta = Kus*(Xzadanoe - sensorPotenciometr);//Kus - коэф усиления; sensorPotenciometr - датчик положения штока(обратная свзяь)
  if (delta > 255) delta = 255;
  if (delta < -255) delta = -255;

  if (delta<0)
  {
  digitalWrite (IN3, LOW);
  digitalWrite (IN4, HIGH);
  analogWrite(ENB,(-(delta)));
  }
else if (delta>=0)
  {
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
  analogWrite(ENB,((delta)));
  }
delay(1);
}

Таким образом, чем больше разница между задающим сигналом и действительным положением штока, тем больше коэффициент заполнения и тем быстрее шток стремится к заданомму положению. Для увеличения быстродействия введен коэф. усиления, который также можно задать с окна оператора или задаваться константой. 

Окно оператора реализовано в среде LabView через последовательный интерфейс. Синхронизация Labview и контроллера с грехом попалам мне удалась. Если интересно могу скинуть полностью весь код и интерфейс в Labview.

Сейчас передо мной была поставлена задача оптимизировать данную работу и увеличить быстродействие системы путем ввода обратной связи по току(ток на катушке мгновенно не достигает максимального значения, а имеет достаточно долгий переходной процесс, а обратная связь позволит уменьшить переходной процесс). Таким образом коэф. заполнения будет зависеть не только от разницы действительного и реального положения штока, но и от тока на катушке от максимального тока.

Это и подводит меня к сути вопроса: необходимо за один период ШИМ  успеть снять напряжение с катушки, через з-н Ома, зная постоянный резистор,  вычислить ток, и на основе этого значения сформировать следующий ШИМ сигнал. Возможно ли используя прерывания реализовать подобный подход? К примеру: записывать значения тока в массив. Путем прерывания по окончанию одного периодна ШИМ сигнала запоминать последнее значение тока, а затем обнулять этот массив. А в основном теле программы используя последнее значение тока на предыдущем такте ШИМ формировать следующий сигнал с учетом обратной связи по току.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

почему вы хотите уложиться в 1 период? Не лучше ли наоборот, частоту ШИМ повысить и корректировать выходное значение по обратной связи.

-------------

А каждый период ШИМ строить - у ардуинки частоты не хватит, на другом контроллере можно.