Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 kwi 2024, o 14:13


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 44 ]  Przejdź na stronę Poprzednia strona  1, 2
Autor Wiadomość
PostNapisane: 6 lis 2015, o 15:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

Zrobiłem ten układ według bluebooka na płytkach uniwersalnych.
Układ działa bez zarzutu. Przerwanie może być albo PCINT, albo INT0 - do wyboru do koloru. Natomiast wyzwalanie startu timera powinno być na zboczu narastającym. Przy INT0 ustawia się to w rejestrze odpowiedzialnym za przerwanie. Przy PCINT trzeba sprawdzać, czy zbocze idzie w górę i tylko wtedy wyzwalać. Co drugie wykonanie przerwania wtedy jest samym returnem
Oczywiście możesz sobie zrobić pod górę i wyzwalać na zboczu w dół, ale musisz przerobić timer, żeby działał krócej o połówkę piku wyzwalającego.
Warto zgłębić rozdział o ściemniaczu z bluebooka. Jest bardzo pouczający, zrozumienie go naprawdę daje dużą wiedzę. Zarówno hw jak i sw.

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lis 2015, o 16:03 
Offline
Użytkownik

Dołączył(a): 10 sty 2014
Posty: 25
Pomógł: 0

Wymieniłem transoptor i teraz przerwanie wykonuje się co około 9-10ms
Jednak coś jeszcze jest nie tak, zastanawiam się czy nie mam jakiegoś problemu z zasilaniem samego arduino ponieważ detekcja zera przy załączaniu triaka coś zaczyna szwankować.

gdy funkcja wywoływana z przerwania jest taka:

Kod:
void zero_crosss_int()  //function to be fired at the zero crossing to dim the light
{
  Serial.print(millis() - a);
  Serial.print(" ");
  a = millis();
  digitalWrite(AC_LOAD, HIGH);  // załączenie triaka
  delayMicroseconds(10); // triac On propogation delay
  digitalWrite(AC_LOAD, LOW);
}


co moim zdaniem powinno zaowocować prawie pełnym jednostajnym świeceniem się żarówki, powoduje jej straszne miganie.
A na serialu dostaję czasy:

0 0 0 0 8 0 0 0 10 0 0 0 0 8 0 0 0 11 0 0 0 0 8 0 0 0 10 0 0 0 0 8 0 0 0 0 10 0 0 0 9 0 0 0 0 9 0 0 0 0 8 0 0 0 10 0 0 0 0 9 0 0 0 10 0 0 0 0 8 0 0 0 11 0 0 0 0 9 0 0 0 0 9 0 0 0



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lis 2015, o 16:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

Obawiam się, że Serial.print działa bardzo długo i zaburza to wszystko. Prawdopodobnie przerwania kolejkują się i wywołują w losowych momentach.
Niestety, również digital.write daje duże opóźnienie, dziesięć razy tyle co zwykłe PORTB |= (1<<PB0) lub podobne.
Arduino jest bardzo fajne, żeby nie było, ale te funkcje nie powinny siedzieć w przerwaniu. Dlatego jednak polecam pisanie w C - można się tego szybko nauczyć dzięki poradnikom Mirka i jego książce. Unikniesz takich nieszczęść jak wyżej. W funkcjach Arduino masz wyższy poziom abstrakcji niż przy czystym C i tak naprawdę często nie wiesz, co dana funkcja naprawdę robi, i jak długo to robi....
Prąd ma 50Hz, czyli sto razy na sekundę przechodzi przez zero. 10 milisekund, wyłapujesz co drugie, czyli co 20ms. Od złapania przejścia w górę musisz włączyć, i potem precyzyjnie wyłączyć triak. A tu wpada taki Serial.print - który coś tam grzebie i blokuje procek.....
Podejrzewam, że te 0 0 0 .... To właśnie takie spóźnione przerwania, które walą jak pasażerowie do Pendolino po otwarciu drzwi :)

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lis 2015, o 17:08 
Offline
Użytkownik

Dołączył(a): 10 sty 2014
Posty: 25
Pomógł: 0

sq5rix napisał(a):
Obawiam się, że Serial.print działa bardzo długo i zaburza to wszystko. Prawdopodobnie przerwania kolejkują się i wywołują w losowych momentach.
Niestety, również digital.write daje duże opóźnienie, dziesięć razy tyle co zwykłe PORTB |= (1<<PB0) lub podobne.
Arduino jest bardzo fajne, żeby nie było, ale te funkcje nie powinny siedzieć w przerwaniu. Dlatego jednak polecam pisanie w C - można się tego szybko nauczyć dzięki poradnikom Mirka i jego książce. Unikniesz takich nieszczęść jak wyżej. W funkcjach Arduino masz wyższy poziom abstrakcji niż przy czystym C i tak naprawdę często nie wiesz, co dana funkcja naprawdę robi, i jak długo to robi....
Prąd ma 50Hz, czyli sto razy na sekundę przechodzi przez zero. 10 milisekund, wyłapujesz co drugie, czyli co 20ms. Od złapania przejścia w górę musisz włączyć, i potem precyzyjnie wyłączyć triak. A tu wpada taki Serial.print - który coś tam grzebie i blokuje procek.....
Podejrzewam, że te 0 0 0 .... To właśnie takie spóźnione przerwania, które walą jak pasażerowie do Pendolino po otwarciu drzwi :)


Z czystej ciekawości napiszę w czystym C bo powinno się to normalnie skompilować w IDE od arduino. Zobaczymy... ale przekonany nie jestem...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lis 2015, o 22:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

Bardzo dobrze :)
Kod z BB uruchomiłem na attiny 45 - zajęło mi tydzień żeby to wszystko ogarnąć - nie jest to trywialne zadanie!

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lis 2015, o 08:37 
Offline
Użytkownik

Dołączył(a): 10 sty 2014
Posty: 25
Pomógł: 0

W poniedziałek będę już miał książkę przy sobie to zrobie zgodnie z zawartymi tam instrukcjami. Czy ten układ będzie działał prawidłowo w połączeniu z wentylatorem prądu zmiennego? Docelowo chciałbym sterować szybkością pracy wentylatorów w rekuperatorze.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lis 2015, o 13:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

Silnik to nie żarówka. Do obciążenia indukcyjnego potrzebny jest gasik, albo zastosuj inny triak - ja użyłem jeden z tych, BTA204:
http://www.nxp.com/documents/leaflet/75016004.pdf
Nie wymagają gasika, tylko sam bezpiecznik wystarczy, ewentualnie jeszcze warystor. Podłączyłem silniczek 200W i działa, choć nie tak jak się spodziewałem, trochę ta regulacja jest słaba, bardzo zależy od obciążenia silnika. Nie jest też liniowa. Ale przy wentylatorze jest wystarczająca.
Jest bardzo wiele dyskusji o sterowaniu silników klatkowych, najlepsze są do tego falowniki, niestety drogie to są ustrojstwa. Dzięki układowi Mirka można nimi bardzo tanio sterować, dodatkowo możesz zrobić miękki start, to też zwiększy kulturę pracy.
Tylko bardzo uważaj, naprawdę... Ten układ może zabić, jak się zapomnisz...

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lis 2015, o 20:03 
Offline
Użytkownik

Dołączył(a): 10 sty 2014
Posty: 25
Pomógł: 0

Na podstawie tego co jest w książce wklepałem coś takiego. Mikrokontroler ATmega168/328

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Chyba gdzieś popełniłem jakiś błąd bo triak nie jest wyzwalany.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lis 2015, o 01:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

W ten sposób nie dasz rady. Takie programy trzeba uruchamiać stopniowo. Najpierw spróbuj zamigać diodą w przerwaniu. W ogóle nie odpalaj żadnego triaka, tylko zaświeć diodę. Nie dawaj żadnej korekcji szpilki.
Tylko migotanie, np. co 100 przerwań, dioda ma być togglowana w przerwaniu, na początku. Czyli
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

A nawet bez tej linijki, będzie słabo świecić, lekko mrugać, taki PWM z sieci :)
Tak zobaczysz, co się dzieje. Bez timera. Jak to zrobisz, dodaj timer i tak po kolei.
Poza tym osobno sprawdź, czy w ogóle triak się wyzwala, najlepiej osobnym małym programem. Dosłownie pętla i co parę sekund on/off, z delajami.
Ja miałem spory problem z timerem, nie pamiętam dokładnie, jakby mi się kończył za wcześnie. No i zmienną a miałem 8 bitową, więc migało nierówno - masakra.
Dlatego zawsze dodaję jednego leda w każdym projekcie, oczywiście dzięki Mirkowi, od którego nauczyłem się tej sztuczki.
Oszczędzam sobie stresu i czasu, uruchamiam małe klocuszki, a z nich buduję większe konstrukcje.

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lis 2015, o 09:43 
Offline
Użytkownik

Dołączył(a): 10 sty 2014
Posty: 25
Pomógł: 0

Przy pomocy diody doszedłem do wniosku że nie działa warunek z linijki 46

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jednakże sam timer działa. Bo poza warunkiem instrukcja zapalająca diodę się wykonuje.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lis 2015, o 15:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

W tym kodzie najważniejsze jest przerwanie. Zobacz czy ono działa dobrze, dopiero potem sprawdzaj resztę. Coś mi w nim nie gra... Poza tym wykonanie przerwania zależy od sprzętu, więc je najpierw trzeba sprawdzić.

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lis 2015, o 18:05 
Offline
Użytkownik

Dołączył(a): 10 sty 2014
Posty: 25
Pomógł: 0

sq5rix napisał(a):
W tym kodzie najważniejsze jest przerwanie. Zobacz czy ono działa dobrze, dopiero potem sprawdzaj resztę. Coś mi w nim nie gra... Poza tym wykonanie przerwania zależy od sprzętu, więc je najpierw trzeba sprawdzić.


Jestem niemal pewien, że przerwanie detekcji zera działa prawidłowo. Coś chyba jest nie tak z timerem. Wygląda mi na to, że działa zbyt wolno ponieważ w takim przypadku:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


na konsoli dostaje:
10 200
10 200
10 200
10 200

Tak jakby wartość zmiennej kroki nie była w stanie miedzy przerwaniami int0 zejść w dół nawet o jeden.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2015, o 10:08 
Offline
Użytkownik

Dołączył(a): 20 lip 2015
Posty: 83
Pomógł: 6

Pisanie po uarcie w przerwaniu to nigdy nie jest dobre i wiarygodne połączenie. Zmień metodykę szukania błędu, bo w taki sposób będzie cieżko do czegoś dojść.

Nie znam dobrze tematu, z racji że jestem początkującym, ale:

zastanawia mnie, dlaczego w procedurze obsługi przerwania masz coś takiego:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


czy ty tutaj przypadkiem nie tworzysz lokalnej zmiennej w funkcji, zostawiając tym samym globalną (którą sprawdzasz ifem o którym mowa) bez zmian, w wyniku czego Twój warunek jest niespełniony?

Pozdro



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lis 2015, o 20:29 
Offline
Użytkownik

Dołączył(a): 10 sty 2014
Posty: 25
Pomógł: 0

Oto w pełni działający kod pod Arduino. Działa idealnie z układem z książki.

Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 44 ]  Przejdź na stronę Poprzednia strona  1, 2

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO