Мост Уитстона.

gena321
Offline
Зарегистрирован: 19.01.2019
Приветствую!
В мосту два фоторезистора, один для дневного света, на другой падает свет от светодиода, яркость диода зависит от "i".
После нажатия кнопки напряжениеna на PA7 должно быть минимальным, строки  45-56
Редко , но иногда мост настраиваться на минимуму.
В программе есть проблема с надежным определением минимума.
Подскажите как это исправить ?
 

HardwareTimer pwmtimer4(4);
#include "EmonLib.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
EnergyMonitor emon1;

float  cur, acur[50], sumc;

int i = 0;
int ovfi = 0;

int (Irms) = 0;
int currentIrms = 0;
int previousIrms;
int maxIrms = 0;
int minIrms = 4095.0;


void setup()
{
  pwmtimer4.pause();
  pwmtimer4.setPrescaleFactor(3);
  pwmtimer4.setOverflow(2000);
  //pwmtimer4.setCompare(TIMER_CH2, 2880);
  pwmtimer4.refresh();
  pwmtimer4.resume();

  pinMode(PB7, PWM); //duty regulated for balance
  pinMode(PB6, INPUT_PULLDOWN);
  pinMode(PB9, INPUT_PULLDOWN);
  pinMode(PA7, INPUT);    // Irms
  lcd.begin(16, 2);

  emon1.current(PA7, 2.8);
}

void loop()
{

  ovfi = 3000 - i;
  pwmtimer4.setCompare(TIMER_CH2, i);
  previousIrms = currentIrms;
  currentIrms = analogRead(PA7);

  if (digitalRead(PB9) == HIGH) {
    if (currentIrms != minIrms) {
      if (previousIrms > currentIrms)

      {
        i++;
      }
      else
      { i --;
      }
    }
  }

  lcd.setCursor(0, 1);
  lcd.print( currentIrms);
  //lcd.print( minValue);
  lcd.setCursor(8, 1);
  lcd.print( i);
  //delay(100);

  emon1.calcVI(20, 2);
  float Irms = emon1.Irms;
  lcd.setCursor(0, 0);
  lcd.print("U=");
  lcd.print(Irms);
  //delay (500);
}

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

пожалуй подпишусь

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

gena321 пишет:

В программе есть проблема с надежным определением минимума.

И в чём именно она состоит?

gena321
Offline
Зарегистрирован: 19.01.2019
Кнопку надо нажимать очень много раз и случайно настройка происходит.  
Иногда "i " становится отрицательном а должно всегда быть положительном.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не понял для чего нажимается кнопка, что должно произойти и т.п.

Более понятного объяснения не будет? 

Тогда разбирайтесь сами.

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

gena321 пишет:

Кнопку надо нажимать очень много раз и случайно настройка происходит.  
Иногда "i " становится отрицательном а должно всегда быть положительном.

Ну, можно добавить

if(i<0) i=0;

И тогда i никогда не будет отрицательным.

 

Logik
Offline
Зарегистрирован: 05.08.2014

Вывод i сделан ШИМом, знач яркость светодиода будет зависить от i только в среднем, за время существенно более периода ШИМа, а не мгновенно. А в стр.43 вводится пошти мгновенное значение. Отсюда и свистопляска. Надо усреднять введеное и по нему работать. Если устойчивость не потеряется при этом то заработает. 

gena321
Offline
Зарегистрирован: 19.01.2019

Пытаюсь добавить " if(i<0) i=0; " , открыл скобку и закрыл , но получаю ошибку 

 
  if (digitalRead(PB9) == HIGH)
  {
    if (currentIrms != minIrms)
    {
      if (previousIrms > currentIrms)



        if (i < 0) i = 0;
    {  // открыл
    /////////////////////
    {
      i++;
    }
    else
    {
      i --;
    }
    /////////////////
    } //  закрыл


  }
}

 

exit status 1
expected '}' before 'else'

 

gena321
Offline
Зарегистрирован: 19.01.2019

Logik

В ручной настройке (две кнопки) есть delay, добавил и здесь но не помагает.

Вероятно светодиод не успевает.
 if (digitalRead(PB9) == HIGH)
    {
    if (i < 3000)
    {
      i++;
      delay(100);
    }
    }
    if (digitalRead(PB6) == HIGH)
    {
    if (i > 0)
    {
      i--;
      delay(100);
    }
    }

 

Logik
Offline
Зарегистрирован: 05.08.2014

//Пытаюсь добавить " if(i<0) i=0; " , открыл скобку и закрыл , но получаю ошибку 

ууу как все запущено... Короче забей, те не по силам.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

gena321 пишет:

Пытаюсь добавить " if(i<0) i=0; " , открыл скобку и закрыл , но получаю ошибку 

Ошибка 1: Скобку открыл два раза подряд.
Ошибка 2: Условный оператор if...else применён не правильно.

 

gena321
Offline
Зарегистрирован: 19.01.2019

До строки #10,  3 скобки открыты , после #20,  3 закрыты, #12 до #18 скобки для i  

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

1) Две открытых скобки подряд - строки 10 и 12.
2) Нахрена там скобки, если тело оператора if написано там же, в строке 09 ?
3) Да и вся строка if (i < 0) i = 0; не на своём месте, нельзя её вставлять перед открывающей скобкой предыдущего оператора if. Синтаксиса Вы не знаете и написали полную хрень.

gena321
Offline
Зарегистрирован: 19.01.2019

Количество открытых скоб = количество закрытых , когда убрать #10 тога скобка # 24 зекрывает loop

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Дело не в количестве скобок... Код в сообщении #7 написан вообще неправильно.

b707
Offline
Зарегистрирован: 26.05.2017

gena321 пишет:

Количество открытых скоб = количество закрытых , когда убрать #10 тога скобка # 24 зекрывает loop

Гена, ты сюда спорить прищел? Или советов более умных людей спрашивать?

gena321
Offline
Зарегистрирован: 19.01.2019

Это та знаю , а как написать правильно = не знаю.

b707
Offline
Зарегистрирован: 26.05.2017

gena321 пишет:

Это та знаю , а как написать правильно = не знаю.

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

Тому кто 2х2 не знает, нет смысла интегралы обьяснять.

gena321
Offline
Зарегистрирован: 19.01.2019

b707

Я не спорю только говорю что происходит когда убрать скобку 

b707
Offline
Зарегистрирован: 26.05.2017

gena321 пишет:

b707

Я не спорю только говорю что происходит когда убрать скобку 

ну так почитай же книжку какую-нить! Или ты всю программу так писать думаешь - убирая и добавляя скобки наобум?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

это if (i < 0) i = 0; равно

if (i < 0) {
i = 0;
}

 

gena321
Offline
Зарегистрирован: 19.01.2019

Valera19701

Спасибо, программа работает лучше.

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

gena321 пишет:

Это та знаю , а как написать правильно = не знаю.

Ну, прочитайте Вы хоть какую-нибудь книжку, ну, пожалуйста. Ну, поймите Вы наконец, что нельзя программировать методом тыка.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

... Ну, поймите Вы наконец, что нельзя программировать методом тыка.

А всё остальное методом ТЫКА делать можно!!! )))

Logik
Offline
Зарегистрирован: 05.08.2014

конечно можна. людей например.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Logik пишет:

конечно можна. людей например.

главное не пальцем, а то моду взяли, из пробирки...

gena321
Offline
Зарегистрирован: 19.01.2019

Logik пишет:

Вывод i сделан ШИМом, знач яркость светодиода будет зависить от i только в среднем, за время существенно более периода ШИМа, а не мгновенно. А в стр.43 вводится пошти мгновенное значение. Отсюда и свистопляска. Надо усреднять введеное и по нему работать. Если устойчивость не потеряется при этом то заработает. 

Спасибо за подсказку, она помогла.