Witam,
Mam problem i nie mogę znaleźć odpowiedzi, sam nie wiem co może być nie tak i w internecie na forach nie widziałem podobnego problemu.
Mianowicie.
Zaprojektowałem układ elektroniczny do sterowania zaworami, zawór działa na 24V i prąd około 63mA. Zawór załączany jest przez tranzystor 2N2222A.
Sercem sterownika jest ATMega328P-PU, wszystkie podstawowe komponenty jak kwarc 16MHz z 22pF, 10k Ohm na RESET, zasilanie filtrowane jest kilkoma kondensatorami ceramicznymi 100nF i innymi elektrolitycznymi (wszystko widać na schemacie poniżej). Aktualnie nie ma układu LM317 - podłączyłem się przewodami z przetwornicy DC do kondensatora C9 (odpowiednia + i -).
Układ komunikuje się z klawiaturą po i2c, układ sterowania zaworami jest slave a klawiatura master. Do zasalania układu klawiatury wziąłem zasilanie z układu sterowania zaworami.
Kod programu:
Problemem jest zmiana stanów na wyjściach. Jak widać po schemacie i kodzie, ATmega steruje 8 zaworami, są one na zmianę załączane (w różnej kolejności wł/wył, rzadko zmienia się stan, działają teraz tylko 4, przez 10 minut jeden, potem się wyłącza i włączane są inne dwa). Po czasie prawie tym samym, 80 minut wszystkie zawory lub jeden się wyłącza, mikrokontroler przestaje dawać zasilania na tranzystor. Zmienia stan z HIGH na LOW, nigdy na odwrót.
Doszły mnie słuchy że to może być spowodowane przyjmowaniem stringów i zapełnianie się pamięci, ale nie chce mi się w to wierzyć za bardzo bo tych stringów jest wysyłanych tyle co jedno zdanie niezłożone. Chciałbym wiedzieć czy istnieje jeszcze jakaś inna możliwość, czemu się tak dzieje.
Mogę dodać jeszcze, że tranzystory miałem z dwóch paczek, jedna stara i działa dobrze z rezystorami na PCB i paczka nowa, gdzie musiałem wylutować rezystor 10k Ohm bo powodował cięgle załączenie tranzystora. Stara paczka miała z 9 lat, nigdy nie używane - nie wiem od czego to zależy też.
Układ też potrafił się wyłączyć od dotyku metalowych części całego układu z zaworami (części aluminiowe rurek), być może jakaś elektrostatyka uszkodziła mikrokontroler? Ale nie jestem przekonany bo złącze do zaworów i część elektryczna jest plastikowa. Jeszcze pracownicy z labu mówili mi, że jak uruchamiają dygestorium (zazwyczaj duży wyciąg oparów ) to potrafi cała elektronika wariować w labie (mierniki, oprawy LED się włączają) - to też może mieć jakiś skutek wadliwego działania? Wyłączenie stanów zazwyczaj się działo kiedy nikt nic nie robi (pozostawione to jest na przeprowadzenie reakcji, układ powinien działać kilka godzin...)
Proszę o pomoc i podpowiedzi co może być nie tak, napięcia są stabilne na wyjściu przetwornicy dającej 5V, tak samo zasilacz 24V DC do wysterowania zaworów - ma on jednak połączenie z masą tej przetwornicy na 5V.
Mam problem i nie mogę znaleźć odpowiedzi, sam nie wiem co może być nie tak i w internecie na forach nie widziałem podobnego problemu.
Mianowicie.
Zaprojektowałem układ elektroniczny do sterowania zaworami, zawór działa na 24V i prąd około 63mA. Zawór załączany jest przez tranzystor 2N2222A.
Sercem sterownika jest ATMega328P-PU, wszystkie podstawowe komponenty jak kwarc 16MHz z 22pF, 10k Ohm na RESET, zasilanie filtrowane jest kilkoma kondensatorami ceramicznymi 100nF i innymi elektrolitycznymi (wszystko widać na schemacie poniżej). Aktualnie nie ma układu LM317 - podłączyłem się przewodami z przetwornicy DC do kondensatora C9 (odpowiednia + i -).
Układ komunikuje się z klawiaturą po i2c, układ sterowania zaworami jest slave a klawiatura master. Do zasalania układu klawiatury wziąłem zasilanie z układu sterowania zaworami.
Kod programu:
#include <Wire.h>
#define cv1 17
#define cv2 16
#define cv3 15
#define cv4 14
#define cv5 10
#define cv6 9
#define cv7 8
#define cv8 7
void setup() {
Wire.begin(8); // Ustaw mikrokontroler jako urządzenie I2C Slave z adresem 8
Wire.onReceive(receiveEvent); // Rejestracja funkcji wywoływanej po odebraniu danych
pinMode(cv1, OUTPUT);
pinMode(cv2, OUTPUT);
pinMode(cv3, OUTPUT);
pinMode(cv4, OUTPUT);
pinMode(cv5, OUTPUT);
pinMode(cv6, OUTPUT);
pinMode(cv7, OUTPUT);
pinMode(cv8, OUTPUT);
// Ustawienie domyślnych stanów zaworów na LOW
resetAllValves();
}
void loop() {
delay(100); // Główna pętla nie jest potrzebna, dane są przetwarzane w funkcji receiveEvent
}
void receiveEvent(int howMany) {
String data = "";
while (Wire.available()) {
char c = Wire.read();
data += c;
}
processData(data); // Przekaż odebrane dane do funkcji przetwarzającej
}
void processData(String data) {
// Przetwarzaj dane i steruj odpowiednimi zaworami
if (data == "z1wl") {
digitalWrite(cv1, HIGH);
} else if (data == "z1wy") {
digitalWrite(cv1, LOW);
} else if (data == "z2wl") {
digitalWrite(cv2, HIGH);
} else if (data == "z2wy") {
digitalWrite(cv2, LOW);
} else if (data == "z3wl") {
digitalWrite(cv3, HIGH);
} else if (data == "z3wy") {
digitalWrite(cv3, LOW);
} else if (data == "z4wl") {
digitalWrite(cv4, HIGH);
} else if (data == "z4wy") {
digitalWrite(cv4, LOW);
} else if (data == "z5wl") {
digitalWrite(cv5, HIGH);
} else if (data == "z5wy") {
digitalWrite(cv5, LOW);
} else if (data == "z6wl") {
digitalWrite(cv6, HIGH);
} else if (data == "z6wy") {
digitalWrite(cv6, LOW);
} else if (data == "z7wl") {
digitalWrite(cv7, HIGH);
} else if (data == "z7wy") {
digitalWrite(cv7, LOW);
} else if (data == "z8wl") {
digitalWrite(cv8, HIGH);
} else if (data == "z8wy") {
digitalWrite(cv8, LOW);
} else if (data == "reset") {
resetAllValves();
} else {
Serial.println("Nieznana komenda");
}
}
void resetAllValves() {
digitalWrite(cv1, LOW);
digitalWrite(cv2, LOW);
digitalWrite(cv3, LOW);
digitalWrite(cv4, LOW);
digitalWrite(cv5, LOW);
digitalWrite(cv6, LOW);
digitalWrite(cv7, LOW);
digitalWrite(cv8, LOW);
}
Problemem jest zmiana stanów na wyjściach. Jak widać po schemacie i kodzie, ATmega steruje 8 zaworami, są one na zmianę załączane (w różnej kolejności wł/wył, rzadko zmienia się stan, działają teraz tylko 4, przez 10 minut jeden, potem się wyłącza i włączane są inne dwa). Po czasie prawie tym samym, 80 minut wszystkie zawory lub jeden się wyłącza, mikrokontroler przestaje dawać zasilania na tranzystor. Zmienia stan z HIGH na LOW, nigdy na odwrót.
Doszły mnie słuchy że to może być spowodowane przyjmowaniem stringów i zapełnianie się pamięci, ale nie chce mi się w to wierzyć za bardzo bo tych stringów jest wysyłanych tyle co jedno zdanie niezłożone. Chciałbym wiedzieć czy istnieje jeszcze jakaś inna możliwość, czemu się tak dzieje.
Mogę dodać jeszcze, że tranzystory miałem z dwóch paczek, jedna stara i działa dobrze z rezystorami na PCB i paczka nowa, gdzie musiałem wylutować rezystor 10k Ohm bo powodował cięgle załączenie tranzystora. Stara paczka miała z 9 lat, nigdy nie używane - nie wiem od czego to zależy też.
Układ też potrafił się wyłączyć od dotyku metalowych części całego układu z zaworami (części aluminiowe rurek), być może jakaś elektrostatyka uszkodziła mikrokontroler? Ale nie jestem przekonany bo złącze do zaworów i część elektryczna jest plastikowa. Jeszcze pracownicy z labu mówili mi, że jak uruchamiają dygestorium (zazwyczaj duży wyciąg oparów ) to potrafi cała elektronika wariować w labie (mierniki, oprawy LED się włączają) - to też może mieć jakiś skutek wadliwego działania? Wyłączenie stanów zazwyczaj się działo kiedy nikt nic nie robi (pozostawione to jest na przeprowadzenie reakcji, układ powinien działać kilka godzin...)
Proszę o pomoc i podpowiedzi co może być nie tak, napięcia są stabilne na wyjściu przetwornicy dającej 5V, tak samo zasilacz 24V DC do wysterowania zaworów - ma on jednak połączenie z masą tej przetwornicy na 5V.