Skocz do zawartości

Zgrzewarka z mikrofali ogólnego przeznaczenia


Pomocna odpowiedź

Jak juz wiadomo buduje zgrzewarke do ogniw, ale tez do zgrzewania cienkich blach, lutowania tego z czym transformatorowka sobie nie da rady...testy probnego ukladu wyszly pozytywnie, lecz mam taki problem ze na poziomie mocy ponizej  ~90 procent zarowka nieregularnie przerywa...wyglada to tak jakby byla odpalana nie w tym samym momencie polokresu fazy lub niektore przerwania byly pominiete...no ale serial monitor i wyswietlanie zmiennych licznikowych w roznych momentach kodu pokazuja ze jest wszystko ok...ponizej kod i zasada dzialania taka: po nacisnieciu guzika zapisuje do zmiennej ile cykli ma byc uruchamiany ssr i wybieram tryb (dla przykladu tutaj pojedynczy zgrzew) w przerwaniu odejmuje od tej zmiennej 1 i ustawiam timer na czas zwloki zalaczenia ssr (dla 50% 5ms), w przerwaniu od timera zalaczam ssr i ustawiam nowy czas timera (staly 200us) przy ponownym przerwaniu od timera wylaczam ssr i wylaczam przerwanie od timera... 

guzik

switch (licznik) {
      case 1:
        puls = dane[1]  / 10;  //czas w ms/10 = ilosc cykli
        wybor_tryb = 1;
        break;

przerwanie od sieci 230v

void IRAM_ATTR pojedynczy_zgrzew() {
  if (puls > 0) {
    puls--;
    timerAlarmWrite(My_timer, moc, true);
    timerWrite(My_timer, 0);
    timerAlarmEnable(My_timer); //Just Enable
    stan_ssr = 1;
  } else {
    //timerAlarmDisable(My_timer); //Just Enable
    wybor_tryb = 0;

  }
}

timer

void IRAM_ATTR timerr() {
  if (stan_ssr == 1) {
    digitalWrite(pin_ssr, HIGH);
    timerAlarmWrite(My_timer, INTERVAL_IMPULS, true);
    timerWrite(My_timer, 0);
    timerAlarmEnable(My_timer); //Just Enable
    stan_ssr = 0;
  } else {
    digitalWrite(pin_ssr, LOW);
    timerAlarmDisable(My_timer);
  }

}
Link do komentarza
Share on other sites

Sprawdziłem na bibliotece ac dimmer i oscylacje są dalej ale już dużo mniejsze, praktycznie na zero...hmm🤔 trzeba będzie uruchomić drugi timer i sprawdzić w jakich odstępach następuje załączenie triaka 

Link do komentarza
Share on other sites

wrzucam testowy kod....moze ktos cos wypatrzy, przy wypelnieniu 90% opoznienie wlaczenia ssr wynosi okolo 1000us, i co jakis czas (nieregularnie) wartosc spada do 10-11 jednorazowo i wraca do normy czyli 1000us...wartosc 10 oznacza to ze przerwanie od timera nastapilo okolo 10us po przerwaniu od sieci mimo ze w przerwaniu od sieci timer zostal zresetowany i ustawiony na opoznienie 1000us...

hw_timer_t *My_timer = NULL;
hw_timer_t *My_tim = NULL;


#define pin_stopa  27     // 12
#define pin_dlon 33
#define pin_dlon2 32
#define pin_ssr     26          // LED_BUILTIN
#define INTERVAL_IMPULS 300
#define PIN_ISR  13

bool stan_ssr = 0;
int d = 0;
byte wybor_tryb = 0;
int czas_ciagly = 0;
int moc = 0;
int x = 0;
volatile int okres = 0;
bool a = 0;

void IRAM_ATTR przerwanie();
void IRAM_ATTR tryb_ciagly();
void IRAM_ATTR timerr();
void IRAM_ATTR tim();

void setup() {
  Serial.begin(115200);

  attachInterrupt(PIN_ISR, przerwanie, RISING);
  
  pinMode(PIN_ISR, INPUT_PULLUP);
  pinMode(pin_ssr, OUTPUT);
  digitalWrite(pin_ssr, LOW);

  My_tim = timerBegin(1, 80, true);
  timerAttachInterrupt(My_tim, &tim, true);
  timerAlarmWrite(My_tim, 10000000, true);
  timerWrite(My_tim, 0);
  timerAlarmEnable(My_tim); //Just Enable

  My_timer = timerBegin(0, 80, true);
  timerAttachInterrupt(My_timer, &timerr, true);


  czas_ciagly = 10 * 100;
  wybor_tryb = 3;

  x = 90;
  moc = map(x, 1, 100, 10000, 0);
}

void loop() {
  if (a) {
    Serial.println(okres);
    a = 0;
  }

  
}

void IRAM_ATTR przerwanie() {
  d++;
  timerRestart(My_tim);
 
 
  if (wybor_tryb == 1) {

  }
  if (wybor_tryb == 2) {

  }
  if (wybor_tryb == 3) {
    tryb_ciagly();
  }
}

void IRAM_ATTR tryb_ciagly() {
     

  
    if (czas_ciagly > 0) {
      czas_ciagly--;
      stan_ssr = 1;
      
      timerAlarmWrite(My_timer, moc, true);
      timerWrite(My_timer, 0);
      timerAlarmEnable(My_timer); //Just Enable
    }  else {
      digitalWrite(pin_ssr, LOW);
      timerAlarmDisable(My_timer); //Just Enable
      wybor_tryb = 0;
    }
                                       //////////////////////////
  
}

void IRAM_ATTR timerr() {
  
  if (stan_ssr == 1) {
    digitalWrite(pin_ssr, HIGH);
    okres = timerReadMicros(My_tim);
    a = 1;
    timerAlarmWrite(My_timer, 200, true);
    timerWrite(My_timer, 0);
    timerAlarmEnable(My_timer); //Just Enable
    
    stan_ssr = 0;
  } else {
    digitalWrite(pin_ssr, LOW);
    timerAlarmDisable(My_timer);
  }

}

void IRAM_ATTR tim() {}

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

zrobilem jeszcze jeden test na super uproszczonym kodzie...efekt ten sam, zarowka nieregularnie mruga, choc utrzymuje mniej wiecej zadane wypelnienie...

 

hw_timer_t *My_timer = NULL;



#define pin_stopa  27     // 12
#define pin_dlon 33
#define pin_dlon2 32
#define pin_ssr     26
#define PIN_ISR  13


int wypelnienie = 0;
int x = 0;
bool a = 0;

void IRAM_ATTR przerwanie();
void IRAM_ATTR timerr();

void setup() {
  Serial.begin(115200);

  attachInterrupt(PIN_ISR, przerwanie, RISING);

  pinMode(PIN_ISR, INPUT_PULLUP);
  pinMode(pin_ssr, OUTPUT);
  digitalWrite(pin_ssr, LOW);

  My_timer = timerBegin(0, 80, true);
  timerAttachInterrupt(My_timer, &timerr, true);
  timerAlarmWrite(My_timer, wypelnienie, true);
  timerAlarmEnable(My_timer); //Just Enable
  timerStop(My_timer); //Just Enable


  x = 20;
  wypelnienie = map(x, 1, 100, 10000, 0);

}

void loop() {
  if (a) {
    Serial.println(wypelnienie);
    a = 0;
  }


}

void IRAM_ATTR przerwanie() {
  digitalWrite(pin_ssr, LOW);
  timerAlarmWrite(My_timer, wypelnienie, true);
  timerWrite(My_timer, 0);
  timerStart(My_timer); //Just Enable
  a = 1;
}

void IRAM_ATTR timerr() {
  digitalWrite(pin_ssr, HIGH);
  timerStop(My_timer);
}

 

Link do komentarza
Share on other sites

Nie wnikając w szczegóły, potrafisz wpłynąć na czas impulsu synchronizacyjnego? Ewentualnie zmień wyzwalanie na zbocze przeciwne, nie jestem pewien z jakiego układu ZC korzystasz.

I jeszcze tu:
 

void IRAM_ATTR timerr() {
  digitalWrite(pin_ssr, HIGH);
  timerStop(My_timer);
}

Zamiast trzymać stan wysoki powinieneś wygenerować impuls 10...100µS zależnie od tego jakim prądem sterujesz led optotriaka. Na początek spróbuj 100µS

Najprościej chyba jeszcze raz wywołać "timerr()" na te 100uS i w drugim wywołaniu wyłączyć GPIO

Edytowano przez _LM_
  • Pomogłeś! 1
Link do komentarza
Share on other sites

isr_zc() // zero cross przerwanie od INT
{
	power_timer_start(true); // uruchamiasz timer na czas przeliczony do mocy -> 90% -> 1ms
  	// czyli po tym czasie musi wykonać przerwanie od power timer
  	// przeliczenia tego czasu zrób w pętli głównej tak aby funkcje obsługi przerwań trwały jak najkrócej
  	// pamiętaj o "volatile" i umieszczeniu procedur w _IRAM_ATTR
}

isr_power_timer_start() // cza do wysterowania GPIO minął
{
// tu musisz wygenerować impuls właściwy
  gpio_triac(HIGH); // uruchamiasz triac
  start_timer_10...100uS();
}

isr__timer_10...100uS();
{
 gpio_triac(LOW); // impuls wygenerowany, triac powinien już przewodzić aż do kolejnego ZC
}

Pseudo kod, wszystkie timery ustaw na tryb jednorazowy, przeliczenia wg tego co w komentarzach napisałem 

Edytowano przez _LM_
  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

@_LM_ już robiłem kod z impulsem...to ten na samej górze (bardzo prosty) efekt? Ten sam, ale...mierząc teraz ten układ chciałem zmierzyć napięcie na detektorze zera...w sumie przypadkiem przyłożyłem sondy do kolektora/emitera pc814 i żarówką się ustabilizowała jak by ręką odjął...czyli coś jest z rezystancja mi...jaki rezystor dać? Już wrzucam detektor/schemat 

Ps...miałem miernik ustawiony na rezystancje 20k (bo akurat mierzyłem rezystor...u mnie R2/3 mają 47k..R1 10k 

2354781600_1511104298.thumb.png.63324388a7de01582e164d29de7510dc.png

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

Masz zewnętrzne podciąganie czy bazujesz tylko na GPIO pullup? Ok, czekam na schemat, przewodami miernika i swoim ciałem najpewniej dołożyłeś sygnał 50Hz do gpio wymuszając sync.

Edytowano przez _LM_
  • Lubię! 1
Link do komentarza
Share on other sites

Potrafisz zwiększyć R1 do 22k? Bo właściwie ani do tego ZC ani programu niema o co się przyczepić, ewentualnie spróbuj jeszcze napisać ten program z uwzględnieniem mojego pseudokodu. Aha i sterowanie >95% sensu większego niema aczkolwiek rozumiem że chcesz ten układ doprowadzić do stanu używalności

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)
25 minut temu, _LM_ napisał:

Masz zewnętrzne podciąganie czy bazujesz tylko na GPIO pullup? 

Mam w programie pullup na tym pinie...

 

12 minut temu, _LM_ napisał:

Potrafisz zwiększyć R1 do 22k? 

Próbowałem ta wartość zmniejszać i zwiększać...bez efektów...teraz jeszcze sprawdzałem i żeby regulator działał to czarna sonda musi być na minusie (emiterze) a czerwona sygnale gpio (kolektorze)...jeśli dam odwrotnie to żarówką rozjaśnia się pełną mocą 

I moje pytanie...co takiego jest na sondach podczas mierzenia rezystancji?? Jakieś napięcie? Rezystancja?

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

3 minuty temu, farmaceuta napisał:

I moje pytanie...co takiego jest na sondach podczas mierzenia rezystancji?? Jakieś napięcie? Rezystancja?

Oprócz tego że działają jak anteny to jeszcze wprowadzają niewielkie napięcie pomiarowe. Coś tu nie gra, czy przy innych zakładanych mocach daje się to regulować?

  • Lubię! 1
Link do komentarza
Share on other sites

Przed chwilą, _LM_ napisał:

czy przy innych zakładanych mocach daje się to regulować?

W sumie sprawdzałem tylko na dwóch zakresach 20/50%...podłącze później potencjometr i na żywo będę regulował to się zobaczy czy w całym zakresie działa poprawnie 

Link do komentarza
Share on other sites

W programie przelicz i ustaw 50% w sumie masz uart możesz za jego pomocą wysyłać polecenia. Nie trzeba komplikować z ADC i potencjometrem

Edytowano przez _LM_
  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.