Обнуляются все переменные. и программа стартует заново.

Overfinch
Offline
Зарегистрирован: 13.11.2017

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

Прошелся по гайдам, написал такой код...

Скорость считывается правильно, и регулировка мощности работает, но через некоторое время, все переменные принимают значение по умолчанию и всё останавливается.

Помогите понять в чём причина.

#define PIN_DO 2 
volatile unsigned long pulses; // количество прерываний
float rps; // обороты в секунду
unsigned long timeOld; // время для сравнения
#define HOLES_DISC 8 // количество отвествий в диске
int speedSet; // можность для электромотора
long n = 0; // счетчик "циклов"
 
void counter()
{
 pulses++;
}
 
void setup()
{
 Serial.begin(9600);
 pinMode(PIN_DO, INPUT);
 speedSet = 0;
 pulses = 0;
 timeOld = 0;
 attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING);
 analogWrite(9, speedSet);
}
 
void loop()
{
  
  if(Serial.available()){ // здесь задаю мощность для электромотора, с серийного порта
    speedSet = Serial.parseInt();  
    analogWrite(9, speedSet);
  }
  
 
  
   if (millis() - timeOld >= 1000) // выполняется раз в секунду
   {
     n++;
     detachInterrupt(digitalPinToInterrupt(PIN_DO));
     rps = (pulses) / (HOLES_DISC);
     Serial.print(n);
     Serial.print(" - ");
     Serial.print(speedSet);
     Serial.print(" - ");
     Serial.println(rps);
     
     timeOld = millis();
     pulses = 0;
     attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING);
   }
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Для чего вы делаете detachInterrupt()/attachInterrupt() в условии "выполняется раз в секунду"?

Overfinch
Offline
Зарегистрирован: 13.11.2017

Я считаю количество изменений с 1 на 0, который идут с датчика оборотов, во время вычисления RPS я останавливаю прирывание, высчитываю, и запускаю заново.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, это я понял, но для чего вы постоянно деаттачите и аттачите заново?

Overfinch
Offline
Зарегистрирован: 13.11.2017

Читал гайд, где было написано что желательно приостанавливать прирывания во время расчета, для большей точности, если закомментировать detachInterrupt/attachInterrupt , то поведение остаётся таким же, через некоторое время всё перезапускается.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

вангую - помеха по питанию, перезапуск ардуино.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, в принципе правильно понимаете, только останавливаете неправильно.

 
  #include <util/atomic.h>

   ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 
       // Считываем и обнуляем (если нужно) volatile переменные 
    }
      // Делаем всё остальное: расчеты, вывод в Serial и пр.

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

 

Overfinch
Offline
Зарегистрирован: 13.11.2017

Прописал в сетапе вывод "START" в последовательный порт, что бы было видно перегружается ли он, и таки да, после какого-то времени выводит "START" и всё по новой.

По питанию, подключен по USB плюс 9 вольтовый блок питания подключен.

Overfinch
Offline
Зарегистрирован: 13.11.2017

Даже если выставить изначально 255 на выход моторчика, то наблюдается такая картина...

(START выводится в setup() что бы видить когда перегружается)

START
n 1 напряжение на моторчик -255 обороты в секунду - 339.00
n 2 напряжение на моторчик -255 обороты в секунду - 448.00
START
n 1 напряжение на моторчик -255 обороты в секунду - 447.00
n 2 напряжение на моторчик -255 обороты в секунду - 440.00
START
n 3 напряжение на моторчик -255 обороты в секунду - 0.00
n 4 напряжение на моторчик -255 обороты в секунду - 354.00
START
n 1 напряжение на моторчик -255 обороты в секунду - 456.00
START
n 2 напря⸮
 
 
sadman41
Offline
Зарегистрирован: 19.10.2016

Сделайте всё то же самое, но без запитывания моторчика. Диск покрутите рукой. 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

на ноги мотора электролит 1000х16 (ПОЛЯРНОСТЬ !!) + керамика 0.1

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Да, мне тоже интересно, связан analogWrite() и моторчик. Думаю, что многое сразу станет ясно.

Overfinch
Offline
Зарегистрирован: 13.11.2017

xDriver пишет:

на ноги мотора электролит 1000х16 (ПОЛЯРНОСТЬ !!) + керамика 0.1

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

Спасибо, сейчас нарисую и скину схему.

Overfinch
Offline
Зарегистрирован: 13.11.2017

Overfinch
Offline
Зарегистрирован: 13.11.2017

Скорее всего не стабильное питание мотора из за этого не полностью открывается полевик, и греется, и падает ток на моторе, может ли это быть причиной перезагрузки ардуино?

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

sadman41 пишет:

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

та, да - питание они разделяют, а земли соединяют - дабы помеха шла на плату дуино. О_О

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, может и так. Я бы еще не стал в ардуину кучу питаний тыкать для начала. Если из нагрузки на ней только оптрон, то оставил бы чисто USB.

Overfinch
Offline
Зарегистрирован: 13.11.2017

Разделил землю, и перестал перезагружаться, всем спасибо большое за ответы!

Sanyaba
Sanyaba аватар
Offline
Зарегистрирован: 27.07.2015

Паралельно двигателю поставить быстрый диод!

5к в затворе полевика может быть мало для полного открытия и если полевик греется советую увеличить подтягивающий резистор до 50к

Overfinch
Offline
Зарегистрирован: 13.11.2017

Спасибо, попробую.