Не стабильно работает.

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

korob писал(а):На этой плате? Если так, то получается что программа что-то не того... :roll:
Сейчас попробую напрямую подать 5В на транзистор. Потому что щелкать это одно, а надо что бы включенным стояло продолжительно.
Пока суть да дело сходил купил другой блок питания. И пока что работает нормально. 5 минут уже работает.Датчик вместо влажности выдает рандом значение, и реле отрабатывает нормально. Тьфу-тьфу.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6643
Зарегистрирован: Чт авг 09, 2012 01:09:39
Откуда: Ливны

Сообщение korob »

seval писал(а):И пока что работает нормально.
Значит всё-таки питание. Но кондесатор на 470мкФ. всё равно лучше установить, если ещё не ставили. И да, заметил отсутствующий конденсатор в цепи сброса МК на 0,1мкФ., его тоже крайне желательно установить.
Большой опыт, порой, не даёт находить/видеть нам простые и очевидные решения. :(
Всегда с уважением, Александр.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

korob писал(а):Значит всё-таки питание. Но кондесатор на 470мкФ. всё равно лучше установить, если ещё не ставили. И да, заметил отсутствующий конденсатор в цепи сброса МК на 0,1мкФ., его тоже крайне желательно установить.
Кондеры есть дома а я не дома. Вечером припаяю обязательно. А зачем на входе электролит?
Друг Кота
Аватара пользователя
Сообщения: 6643
Зарегистрирован: Чт авг 09, 2012 01:09:39
Откуда: Ливны

Сообщение korob »

seval писал(а):А зачем на входе электролит?
Как зачем? Для "буферизации" напряжения питания, если питание подаётся по проводникам с некотором сопротивлением, для сглаживания скачков напряжения, неизбежно возникающих при коммутации реле, да и не только.
Последний раз редактировалось korob Сб авг 22, 2015 15:37:25, всего редактировалось 1 раз.
Большой опыт, порой, не даёт находить/видеть нам простые и очевидные решения. :(
Всегда с уважением, Александр.
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

korob писал(а):Как зачем? Для сглаживания скачков напряжения, неизбежно возникающих при коммутации реле, да и не только.
Понял. Спасибки. Я просто только учусь. :)
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

korob писал(а):
seval писал(а): И да, заметил отсутствующий конденсатор в цепи сброса МК на 0,1мкФ., его тоже крайне желательно установить.
Да уж. Поставил конденсатор и схема перестала вообще запускаться. Чего я не так сделал?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6643
Зарегистрирован: Чт авг 09, 2012 01:09:39
Откуда: Ливны

Сообщение korob »

:shock: Конденсатор не пробит? Что на RESETе?
Большой опыт, порой, не даёт находить/видеть нам простые и очевидные решения. :(
Всегда с уважением, Александр.
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

korob писал(а)::shock: Конденсатор не пробит? Что на RESETе?
Не знаю. Как проверить?
Опытный кот
Сообщения: 806
Зарегистрирован: Ср май 06, 2015 06:41:27
Откуда: Благовещенск

Сообщение Андрей СШ »

Да можно просто вольтметром.
Друг Кота
Аватара пользователя
Сообщения: 6643
Зарегистрирован: Чт авг 09, 2012 01:09:39
Откуда: Ливны

Сообщение korob »

Значит с конденсатором в цепи RESET понятно. Посмотрел, в ардуино используется софтовый сброс для исполняемой программы, а хардварный используется для обновления софта. Не учёл эту особенность ардуино. :facepalm: :oops: Снимайте.
Большой опыт, порой, не даёт находить/видеть нам простые и очевидные решения. :(
Всегда с уважением, Александр.
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

seval писал(а):но нет у меня 0,33 мкФ.
0,33 мкФ это минимально допустимая ёмкость, но ставить выше никто не запрещает. Поставьте на входе и выходе стабилизатора хотя бы по 100 мкф, но можно и больше.
Опытный кот
Сообщения: 806
Зарегистрирован: Ср май 06, 2015 06:41:27
Откуда: Благовещенск

Сообщение Андрей СШ »

Меня эти "советские" конденсаторы несколько беспокоят. Тип неизвестен. Состояние тоже. Возраст большой. Разновидностей конденсаторов много и не все из них сюда подходят.
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

Мурик писал(а):0,33 мкФ это минимально допустимая ёмкость, но ставить выше никто не запрещает. Поставьте на входе и выходе стабилизатора хотя бы по 100 мкф, но можно и больше.
То есть электролиты? Минус к минусу и плюс к плюсу?
Андрей СШ писал(а):Меня эти "советские" конденсаторы несколько беспокоят.
Я понял. Если будут проблемы поменяю их.
korob писал(а):Снимайте.
Убрал его и пока работает. Сегодня поставлю в работу дома. И буду наблюдать.
Андрей СШ писал(а):Да можно просто вольтметром.
У меня нет режима конденсатор
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

seval писал(а):То есть электролиты? Минус к минусу и плюс к плюсу?
Да. Сейчас какие стоят?
seval писал(а):У меня нет режима конденсатор
Нужно измерять напряжение, а не емкость конденсатора.
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

Мурик писал(а):Сейчас какие стоят?
Керамические 100нФ
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Параллельно им поставьте элекролиты.
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

Приехал домой. Поставил, вроде работает. Помылись, вентилятор включился. Потом слышу, через минут 15, опять реле дребезжит. Снял все, проверил. Транзистор не реагирует на сигнал от МК. Сгорел по видимому. Реле рабочее. Электролиты правда еще не поставил. Завтра куплю транзистор. Поставлю электролиты, и опять проверять буду.
Опытный кот
Сообщения: 806
Зарегистрирован: Ср май 06, 2015 06:41:27
Откуда: Благовещенск

Сообщение Андрей СШ »

У Вас с какой частотой сигнал от датчиков приходит?
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

Андрей СШ писал(а):У Вас с какой частотой сигнал от датчиков приходит?
Я не знаю. Там тоже схема на Atmega328
ИзображениеИзображение
У меня по программе идет все по Modbus. Мастер опрашивает датчики. И раз в 10 секунд заносит данные в переменную. С переменной уже анализирует, то есть дребезг в программе по идее не возможен.
Спойлер

Код: Выделить всё

#include <SPI.h>
#include <Wire.h>
#include <ModbusRtu.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

Modbus _modbusMaster(0, 0, 2);
uint16_t _regModSlav_1[4];
modbus_t _modTelegrSend1;
modbus_t _modTelegrRead1;
unsigned long _modbusTimeVar1 = millis();
bool _isNeesdedSinhronizeSlave1 =0;
uint16_t _regModSlav_2[4];
modbus_t _modTelegrSend2;
modbus_t _modTelegrRead2;
unsigned long _modbusTimeVar2 = millis();
bool _isNeesdedSinhronizeSlave2 =0;
uint8_t _modState;
int  _modTlgIndex = -1;
bool  _isModbusRead = 0;
int _gtv1 = 0;
int _gtv2 = 0;
bool _gtv3 = 0;
bool _gtv4 = 0;
int _gtv5 = 45;
int _gtv6 = 40;
int _gtv7 = 0;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
int _bitW1;
void setup()
{
  Serial.begin(9600);
  _modbusMaster.begin(19200);
  _modbusMaster.setTimeOut(1000);
  _modState = 0;
  _modTelegrSend1.u8id  = 1;
  _modTelegrSend1.u8fct  = 16;
  _modTelegrSend1.u16RegAdd  = 0;
  _modTelegrSend1.u16CoilsNo  = 4;
  _modTelegrSend1.au16reg  = _regModSlav_1;
  _modTelegrRead1.u8id  = 1;
  _modTelegrRead1.u8fct  = 3;
  _modTelegrRead1.u16RegAdd  = 0;
  _modTelegrRead1.u16CoilsNo  = 4;
  _modTelegrRead1.au16reg  = _regModSlav_1;
  _modTelegrSend2.u8id  = 2;
  _modTelegrSend2.u8fct  = 16;
  _modTelegrSend2.u16RegAdd  = 0;
  _modTelegrSend2.u16CoilsNo  = 4;
  _modTelegrSend2.au16reg  = _regModSlav_2;
  _modTelegrRead2.u8id  = 2;
  _modTelegrRead2.u8fct  = 3;
  _modTelegrRead2.u16RegAdd  = 0;
  _modTelegrRead2.u16CoilsNo  = 4;
  _modTelegrRead2.au16reg  = _regModSlav_2;
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  pinMode(9, OUTPUT);
  digitalWrite(9, 1);
  display.setTextColor(WHITE);
  display.setTextSize(2);
  display.setCursor(0,0);
  display.println("VENT ON");
  display.display();
  delay (10000);
  digitalWrite(9, 0);
  display.clearDisplay();

}
void loop()
{
  if((_isTimer(_modbusTimeVar1, 1000 ))&&(!_isNeesdedSinhronizeSlave1)) { 
    _isNeesdedSinhronizeSlave1= 1; 
    _modbusTimeVar1 = millis();
  }
  if((_isTimer(_modbusTimeVar2, 1000 ))&&(!_isNeesdedSinhronizeSlave2)) { 
    _isNeesdedSinhronizeSlave2= 1; 
    _modbusTimeVar2 = millis();
  }
  switch(_modState) {
  case 0:
    { 
      if((_modTlgIndex == -1)&&(_isNeesdedSinhronizeSlave1)){
        _modTlgIndex = 1; 
        _isModbusRead = 1; 
        _modState = 1;  
        break;
      }
      if((_modTlgIndex == 1)&&(_isModbusRead)){
        _regModSlav_1[3] = _bitW1;
        _isModbusRead = 0; 
        _modState = 1; 
        break;
      }
      if((_modTlgIndex == 1)&&( !_isModbusRead)){
        _modTlgIndex = -1; 
        _isNeesdedSinhronizeSlave1 = 0;
      }
      if((_modTlgIndex == -1)&&(_isNeesdedSinhronizeSlave2)){
        _modTlgIndex = 2; 
        _isModbusRead = 1; 
        _modState = 1;  
        break;
      }
      if((_modTlgIndex == 2)&&(_isModbusRead)){
        _regModSlav_2[3] = _bitW1;
        _isModbusRead = 0; 
        _modState = 1; 
        break;
      }
      if((_modTlgIndex == 2)&&( !_isModbusRead)){
        _modTlgIndex = -1; 
        _isNeesdedSinhronizeSlave2 = 0;
      }
      break;
    } 
  case 1:
    { 
      if((_modTlgIndex == 1)&&(_isModbusRead)) { 
        _modbusMaster.query(_modTelegrRead1); 
        _modState = 2;  
        break; 
      }
      if((_modTlgIndex == 1)&&(! _isModbusRead)) { 
        _modbusMaster.query(_modTelegrSend1); 
        _modState = 2;  
        break; 
      }
      if((_modTlgIndex == 2)&&(_isModbusRead)) { 
        _modbusMaster.query(_modTelegrRead2); 
        _modState = 2;  
        break; 
      }
      if((_modTlgIndex == 2)&&(! _isModbusRead)) { 
        _modbusMaster.query(_modTelegrSend2); 
        _modState = 2;  
        break; 
      }
      break;
    } 
  case 2: 
    _modbusMaster.poll();
    if (_modbusMaster.getState() == COM_IDLE) {
      _modState= 0;
    }
    break;
  }




  if (1) {
    if (! _gen1I) { 
      _gen1I = 1; 
      _gen1O = 1; 
      _gen1P =  millis(); 
    } 
  } 
  else { 
    _gen1I = 0 ;  
    _gen1O= 0;  
  } 
  if (_gen1I ) { 
    if (_gen1O) { 
      if ( _isTimer( _gen1P , 100 )) { 
        _gen1P = millis(); 
        _gen1O = 0; 
      } 
    } 
    else  { 
      if ( _isTimer( _gen1P , 10000 )) {  
        _gen1P = millis(); 
        _gen1O = 1;  
      } 
    } 
  }
  if (_gen1O) {
    _gtv1 = (int(_regModSlav_1[0]));
  }
  if (_gen1O) {
    _gtv2 = (int(_regModSlav_2[0]));
  }
  _gtv3 =  ((_gtv1) >= (_gtv5)) && (! ((_gtv1) <= (_gtv6))) ;
  _gtv4 =  ((_gtv2) >= (_gtv5)) && (! ((_gtv2) <= (_gtv6))) ;
  _bitW1 = _gtv7;
  bitWrite(_bitW1, (1), ( (_gtv3) || (_gtv4) ));
  digitalWrite(9,  (_gtv3) || (_gtv4) );
  if ( (_gtv3) || (_gtv4) ){
    display.setTextColor(WHITE);
    display.setTextSize(2);
    display.setCursor(0,0);
    display.println("VENT ON");
    display.display();
  }
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,25);
  display.println("H1 - ");
  display.setCursor(60,25);
  display.println(_gtv1);
  display.setCursor(85,25);
  display.println("%");
  display.setCursor(0,50);
  display.println("H2 - ");
  display.setCursor(60,50);
  display.println(_gtv2);
  display.setCursor(85,50);
  display.println("%");
  display.display();




}
bool _isTimer(unsigned long startTime, unsigned long period )
{
  unsigned long currentTime;
  currentTime = millis();
  if (currentTime>= startTime) {
    return (currentTime>=(startTime + period));
  } 
  else {
    return (currentTime >=(4294967295-startTime+period));
  }
}
https://yadi.sk/d/q__owdFRibpLe
Последний раз редактировалось seval Вс авг 23, 2015 06:12:13, всего редактировалось 3 раза.
Опытный кот
Сообщения: 806
Зарегистрирован: Ср май 06, 2015 06:41:27
Откуда: Благовещенск

Сообщение Андрей СШ »

Надо программу глянуть. Похоже это датчик "дребезжит", а реле просто повторяет.
Ответить

Вернуться в «AVR»