Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   835 / 850
(#) andyka válasza andyka hozzászólására (») Márc 19, 2024 /
 
A következőképpen müködhet ? (ugyanaz az időzitő, csak más értékkel)
  1. void IRAM_ATTR ISR_1(){ timerAlarmWrite(Timer_1, dimm_1, false); // elkezd számoln
  2.                         tr_1 = true; }
  3. void IRAM_ATTR onTimer_1(){ digitalWrite(TrPin_1, tr_1);  // triak indít / triak leállít
  4.                             timerAlarmWrite(Timer_1, 30, false);  // egy új időintervallum beállítása ami eteltével következne a triak leállítása
  5.                             tr_1 = false; }
A hozzászólás módosítva: Márc 19, 2024
(#) Massawa válasza andyka hozzászólására (») Márc 19, 2024 /
 
A végfokozat megvan és müködik, nem az a kérdés. A hiddal valamivel több energiát tudok átadni mint triakkal és a berendezés akár akkurol, egyenáramrol is müködik.
A hozzászólás módosítva: Márc 19, 2024
(#) andyka válasza Massawa hozzászólására (») Márc 19, 2024 /
 
Nem a triak-ra gondoltam, hanem a szoftver megoldásra! Az időzítőkre, a triakokat csak úgy mellesleg említettem
A hozzászólás módosítva: Márc 19, 2024
(#) Massawa válasza andyka hozzászólására (») Márc 19, 2024 /
 
Én is egy idözitön gondolkodom. Na mindegy delután megirok valamit meglátom mire jutok.
(#) KoblogPerGyok válasza Massawa hozzászólására (») Márc 19, 2024 /
 
Szia!

Gondolkodtam rajta, három timerrel megoldható, egyszerűbben. Két timerrel megoldható, kicsit nehezebben. 1 timerrel megoldható sokkal bonyolultabban, és pofon egyszerűen is, épp ahogy mondod. A delay-t nem is használva micros-al és while-okkal megoldható. De a delay microsec is jó lehet ide.

Én kipróbálnám, hogy az interrupt függvényben egyszerűen microssal megvárnám, míg d4 magas, utána d4 alacsony d5 magas majd egy másik while, ami után a d5-t alacsony. (while-al és a microssal mérném az időt)
De!
H-hídnál kell egy kis késleltetés, hogy a tranzisztorok ne nyissanak szembe! Oda meg betennék egy kis while-t micros időméréssel, így d4 lekapcsol de d5 kis időkéséssel kapcsol csak be.

Megpróbálom szimulátoron és küldöm az elképzelésemet forráskódba, de szerintem épp erre gondoltál te is.
A hozzászólás módosítva: Márc 19, 2024
(#) KoblogPerGyok válasza Massawa hozzászólására (») Márc 19, 2024 /
 
De nem lenne jobb tisztán szinuszos alapjelet előállítani és azt erősíteni? Mert arra kis plusz munkával könnyedén rá lehetne ültetni DC komponenst is. Persze ehhez nem H-híd kellene erősítő fokozatnak.
(#) Massawa válasza KoblogPerGyok hozzászólására (») Márc 19, 2024 /
 
Elméletileg lehetne, kb 10 A kellene ugy 18-20 V körül a maximális szinten. Ez ugye kb 200 W és ennyit el is kellene disszipálni, ha csak 5-6 V lenne a kimeneten.
(#) KoblogPerGyok válasza Massawa hozzászólására (») Márc 19, 2024 /
 
Ok, értem. Csak azért kérdeztem, hogy nem jobb a gépnek a tisztán szinuszos? Mert ha az jobb lenne, akkor is lehetne szerintem játszani kicsit. De még gondolkodom. Amúgy a sima várakozás megoldja amit szeretnél. Elvileg meg is csináltam, sokkal könnyebben is meg lehetne csinálni, de nem tudom tesztelni.
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Márc 19, 2024 /
 
Csináld meg ahogy elsőként gondoltad, nem jó irányban kezdtem gondolkodni, bocsánat!
(#) Massawa válasza KoblogPerGyok hozzászólására (») Márc 19, 2024 /
 
A H hiddal ne nagyon foglalkozz annak van a bemenetén egy proci ami kezeli a H hid müködését ( védelmét is stb) utovégre 40 A 50V-ra lett tervezve.
Csak 2 TTL bemenete van az egésznek.
Azt hiszem van ott valami késleltetési beállitás is, de eddig nem kellett vele foglakoznom.
Kösz szépen a segitséget. Mint irtam sima 555 meg 2 TTL áramkörrel már müködik részben, de ott nem lehet a DC tartományt kialakitani meg nem stabil a frekije. ( valtozik a PWM-mel). Az nem baj ha a hid mindkét fele egy szinten van, söt az ki is használom mert söntöli/fékezi a motort.
Mindenképen microst kell használnom mert a DELAY csak ms felbontást tud azaz a 10 ms-s félperiodusban csak 10 lépést tudna ami egy kicsit kevés.
(#) KoblogPerGyok válasza Massawa hozzászólására (») Márc 19, 2024 /
 
Ennyit pakoltam össze 10 perc alatt a wokwi-n, nem tudom most tesztelni.

  1. unsigned long d4_magas_ideje;
  2. unsigned long d5_magas_ideje;
  3. unsigned long dt_tranzisztorok_szembenyitas;
  4. volatile unsigned long most;
  5. volatile unsigned long eltelt;
  6. void setup() {
  7.   // put your setup code here, to run once:
  8.  
  9.  
  10.   d4_magas_ideje=5000; //microsec
  11.   d5_magas_ideje=5000; //microsec
  12.   digitalWrite(4, LOW);
  13.   digitalWrite(5, LOW);
  14.  
  15.   Serial.begin(9600); // Serial connection to print samples
  16.    
  17.   cli(); // disable interrupts during setup
  18.  
  19.   // Configure Timer 1 interrupt
  20.   // F_clock = 16e6 Hz, prescaler = 64, Fs = 50 Hz
  21.   TCCR1A = 0;
  22.   TCCR1B = 1<<WGM12 | 0<<CS12 | 1<<CS11 | 1<<CS10;
  23.   TCNT1 = 0;          // reset Timer 1 counter
  24.   // OCR1A = ((F_clock / prescaler) / Fs) - 1 = 5000-1
  25.   //Remélem ennyi, csak írtam, nem teszteltem.
  26.   OCR1A = 4999;       // Set sampling frequency Fs = 50 Hz
  27.   TIMSK1 = 1<<OCIE1A; // Enable Timer 1 interrupt
  28.  
  29.   sei(); // re-enable interrupts
  30. }
  31. // Timer 1 interrupt service routine (ISR)
  32. ISR(TIMER1_COMPA_vect)
  33. {
  34.   most=micros();
  35.   digitalWrite(4, HIGH);
  36.   while (micros-most >=d4_magas_ideje)
  37.   {  
  38.   }
  39.   digitalWrite(4, LOW);
  40.   // kis idő, mielőtt szembe nyitnánk a h-hidat
  41.   most=micros();
  42.   while (micros()-most >=dt_tranzisztorok_szembenyitas)
  43.   {
  44.   }
  45. //D5 bekapcsol
  46.   digitalWrite(5, HIGH);
  47.   most=micros();
  48.   while (micros()-most >=d5_magas_ideje)
  49.   {
  50.   }
  51.   digitalWrite(5, LOW);
  52.   //Serial.println(analogRead(0)); // Sample voltage on pin A0
  53. }
  54. void loop() {
  55.   // put your main code here, to run repeatedly:
  56.  
  57. }
(#) Massawa válasza KoblogPerGyok hozzászólására (») Márc 19, 2024 /
 
Ezek mezei motorok meg relék, amit amugy is gyakran PWMmel hajtanak. Azon még gondolkodok hogy azt a két relét amit mechanikusan blokkolnak a váltoáram esetében lehet, hogy egy LP filterrel szürni kell, mert a négyszögjelre eléggé összevissza megy az egyik a másik jobban viselkedik. De ez most másodlagos elöbb a motorokat kell tudni vezérelni.
És is elöbb szinuszra gondoltam. Szereztem is egy 150W digitális erösitöt,, de az habár 12 V-rol van táplálva belül felemelik a feszültséget kb 40 V-ra ami szintén nem jo.
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Márc 19, 2024 /
 
Ez csak valamiféle kód, nem tesztelt, de szerintem ennyi is elég lehet. Több timer meg egyéb csak tovább bonyolítaná az egészet. Azt kell biztosítani, hogy ez tutira 20ms alatt fusson le. Én azt tenném, hogy ezt a függvényt más néven elmenteném, az interruptot nem engedném és a setup-ban hasonló módin lemérném, hogy mennyi idő alatt fut le. Ha tuti, akkor mehet az interruptba.
(#) Massawa válasza KoblogPerGyok hozzászólására (») Márc 19, 2024 /
 
Kösz kiprobálom csak most elromlott valami a házban a nejem nem tud dolgozni.
(#) KoblogPerGyok válasza Massawa hozzászólására (») Márc 19, 2024 /
 
Még ez nem jó, mert a <> sem jó, az irány ez, ezen még kalapálni kell kicsit!
(#) pipi válasza andyka hozzászólására (») Márc 19, 2024 /
 
Hali!
Mintha hiányozna a timerAlarmEnable(...);
ezt is olvasd el, itt írtak valamit...
https://electronics.stackexchange.com/questions/657658/ac-dimmer-es...oom32d
nem próbáltam, nem vagyok benne, csak partszélről belevau, a napokban olvastam, eltettem...
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Márc 19, 2024 /
 
Tovább gondolva én ilyet már csináltam is, igaz szimulációban. PWM állíthatná elő a szinusz jel pillanatnyi értékét, a szinusz jel amplitúdóját lehetne szabályozni. Így esetleg nem lenne olyan sok a disszipáció, mert a FET-ek mindig teljesen nyitva vagy teljesen zárva lennének, természetesen +12V-ot adnának csúcsban, de a PWM értéke (átlagolt) lehetne a kívánt max amiltudójú szinusz jel pillanatnyi értéke. De ez csak álmodozás, épp ilyet nem csináltam, de dsPIC-ben szinuszt PWM-el igen. Persze ekkor igen nagy felbontású PWM kell elég magas frekvencián. Erre az Arduino nem lenne elég szerintem. dsPIC simán vitte, de nem emlékszem már pontosan mekkora volt a frekvencia. Nekem KHz-ek kellettek, ezért másképpen oldottam meg.

De mielőtt álmodnék nagyot, le kellene programozni HELYESEN amit küldtem...
(#) KoblogPerGyok válasza pipi hozzászólására (») Márc 19, 2024 /
 
Rossz helyre ment! Bocsi!
A hozzászólás módosítva: Márc 19, 2024
(#) Massawa válasza KoblogPerGyok hozzászólására (») Márc 19, 2024 /
 
Na most itt vagyok de ma mar ne hiszem, hogy programozni fogok. Kösz szépen az ötleteidet, jol használhatok. Persze nekem még be kell kombinálnom a potit ( állitani a idöket) meg a kapcsolot ami változtatja a DC szintet.
(#) KoblogPerGyok válasza Massawa hozzászólására (») Márc 19, 2024 /
 
Lehet én sem, de azért holnap összerakom és valós környezetben szkóppal ránézek, mert tuti nem jó amit küldtem. Az csak iránymutatásképp van! Erre azért figyelni kell. A másik gondolatommal is eljátszok kicsit.
(#) Massawa válasza KoblogPerGyok hozzászólására (») Márc 19, 2024 /
 
Kösz holnap talán lesz több idöm.
(#) KoblogPerGyok válasza Massawa hozzászólására (») Márc 20, 2024 /
 
Ezt dobtam össze, szerintem jobb, mintha a timer-el lenne megoldva, mert ha abban csak 1 utasításhoz tartozó időtúllépés lenne, akkor az hibát okozna. A kód így csak 160 microsec-el lépi túl a 20 ms-ot, szerintem az még elfogadható. A függvény utolsó while-ja illeszti az eltelt időt a 20ms-hez. Csatolok pár szkóp felvételt is.

  1. unsigned long d4_magas_ideje;
  2. unsigned long d5_magas_ideje;
  3. unsigned long dt_tranzisztorok_szembenyitas;
  4. unsigned long periodus_ido;  //20 ms ami 20 000 micro sec
  5. unsigned long periodus_ido_start;
  6. int Hibaled_pin;
  7. int D4_PIN;
  8. int D5_PIN;
  9.  
  10.  
  11. unsigned long Teszt_ido;
  12.  
  13. volatile unsigned long most;
  14. volatile unsigned long eltelt;
  15. void setup() {
  16.   // Arduino nano pin:
  17.   D4_PIN=4;
  18.   D5_PIN=5;
  19.   Hibaled_pin=6;
  20.  
  21.   d4_magas_ideje=2000; //microsec
  22.   d5_magas_ideje=5000; //microsec
  23.   periodus_ido=20000;  //20ms = 20000microsec
  24.   dt_tranzisztorok_szembenyitas=100; //példanak 100microsec
  25.  
  26.   digitalWrite(D4_PIN, LOW);
  27.   digitalWrite(D5_PIN, LOW);
  28.   digitalWrite(Hibaled_pin, LOW);
  29.  
  30.   Serial.begin(9600); // Serial connection to print samples
  31.   Serial.println("Sotros port 9600-al elinditva!");
  32.  
  33.   //Teszteléshez, hogy csak egyszer fusson le
  34.   Serial.println("Fuggveny idult!");
  35.   Teszt_ido=micros();
  36.   impulzusok();
  37.   most=micros();
  38.  
  39.  
  40.   Serial.println("A fuggveny lefutott!");
  41.   Serial.println("A mert ido microsec-ben:");
  42.   Serial.println( most-Teszt_ido);
  43.    
  44. }
  45.  
  46. void loop()
  47.   {
  48.  
  49.     //Folyton meg kell hívni
  50.     impulzusok();
  51.    } //Loop vége
  52.    
  53.    
  54.  void impulzusok(void)
  55.  {
  56.    //A megadott kitöltési tényezők összege nem lehet nagyobb, mint 20ms
  57.    //Ellenkező esetben bekapcsolja a hiba ledet
  58.    
  59.    if (d4_magas_ideje+d5_magas_ideje<=periodus_ido)
  60.      {
  61.        
  62.        digitalWrite(Hibaled_pin,LOW);//Hibaled kikapcsolása, ha előzőleg az időtullépés miatt bekapcsolva lenne
  63.        
  64.        periodus_ido_start=micros();
  65.        //Az első impulzus D4
  66.        most=micros();
  67.        digitalWrite(D4_PIN, HIGH);
  68.        while (micros()-most <=d4_magas_ideje)
  69.           {  
  70.           }
  71.        digitalWrite(D4_PIN, LOW);
  72.      
  73.       // kis idő, mielőtt szembe nyitnánk a h-hidat
  74.       most=micros();
  75.       while (micros()-most <=dt_tranzisztorok_szembenyitas)
  76.         {
  77.         }
  78.      
  79.        //A második impulzus D5
  80.       digitalWrite(D5_PIN, HIGH);
  81.       most=micros();
  82.       while (micros()-most <=d5_magas_ideje)
  83.         {
  84.         }
  85.       digitalWrite(D5_PIN, LOW);
  86.      
  87.        
  88.       //Eltelt sok idő, de nem 20ms-nek megfelelő, ezért várni kell
  89.       //Így nem fogunk a timer interruptba belekavarodni, mert abba az időtúllépés igen nagy gondot okozna!
  90.       //A valós rendszerben ez a pár microsec lötyögés szerintem belefér!
  91.       //Ha előtte van más proci időt foglaló kód, de 20ms alatt van, akkor ez kihozza 20ms-re.
  92.       //Setup-ban a teszt épp erre való, hogy csak 1x fusson le, ki lehet iratni az időt.
  93.       while (micros()-periodus_ido_start <=periodus_ido)
  94.         {    
  95.         }  
  96.      //Ennek akkor van a legnyagyobb értelme, mikor a két kitöltési tényező egyaránt 10-10 ms
  97.      //Timer interruptnál hibára futna ebben az esetben, mert nagyobb lenne az idő, mint a timer interrupt ideje
  98.      //Sokkal bonyolultabb, és instabilabb is lehetne, ezért nem azzal oldottam meg.
  99.      //A kiépített rendszerben szerintem ilyen kis eltérés nem okoz gondot.
  100.  
  101.      }
  102.      else
  103.      {
  104.        digitalWrite(Hibaled_pin,HIGH); //Ha a megadott kitöltési tényezők nagyobbak, akkor jelezze ezen a PIN-en
  105.      }
  106.  }


Szerintem így is jó lehet neked, és szerintem stabilabb is lehet.
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Márc 20, 2024 / 1
 
A digital write helyett lehetne port manipulációval állítani a lábakat, mert az sokkal gyorsabb.
(#) Massawa válasza KoblogPerGyok hozzászólására (») Márc 20, 2024 /
 
Kösz délután kiprobálom.
(#) gaspa válasza andyka hozzászólására (») Márc 20, 2024 /
 
Helló
Én is pont ezzel foglalkozom,kitettek a szaldóból és nyáron van havi kb. 1000 kWh,ősszel 5-600,télen párszáz kWh felesleg,amit nem akarok betáplálni.Én is a hőenergia tárolást szeretném megvalósítani,az akku csak 1-2 nap,a hőmennyiségből sokkal több tárolható,de sokkal bonyolultabb,mint a programozás.Megjöttek az Ali-ról a JSY194 szenzorok,ezekkel fogom megállapítani,pillanatnyilag mennyi fűthető el az egyéb fogyasztások mellett,de én inkább a közvetlen napelem DC-t terhelném IGBT-vel kapcsolva a fűtő elemeket.Nekem úgy tűnik egyszerűbb a vezérlés és az invertereket is csak a ház belső fogyasztása veszi igénybe,valamint kisebb a veszteség is.
(#) antikzsolt válasza gaspa hozzászólására (») Márc 20, 2024 /
 
Én is ezen agyalok hogy és miként lehet eltárolni az energiát. Te mire jutottál? Nekem egy nem visszatermelős rendszerem van amit bőviteni szeretnék még 8-9kw-al amit csak fűtésre szeretnék használni. Első sorban kiegészítő fűtés lenne időzítve. Mielőtt hazaérek menne 1-2 órát. Napi 12-13 óra távolét. Elektromos tömegkályha is gondoltam már rá. 400-600C° melegítve
(#) asch válasza Massawa hozzászólására (») Márc 20, 2024 / 1
 
ATMega328-on ha teljesen pontos időzítésű, de folyton változó időtartamú négyszögjeleket kell kiadni, akkor van az a trükk, hogy a compare regiszterre való reakciót mindig újraprogramozzuk, hogy magasba vagy alacsonyba vigye a kimenetet a következő compare-rel való egyezésnél. Plusz mindig nullázzuk is a számlálót, és ISR-ben egyből újrakonfiguráljuk a rendszert, akkor tetszőleges mintát ki lehet adni vele. Ha a két jelváltás közötti időbe belefér az ISR kiszolgálás ideje, akkor soha nem hibázó tűpontos vezérlést lehet csinálni vele. Meg lehet azt is csinálni, hogy főprogram egy ringbuffer-be írja az időtartamokat, és az ISR csak végrehajtja, így lesz az ISR a legrövidebb és legegyszerűbb talán. A főprogram pedig tetszőleges mintát pakolhat kevésbé real time követelmények mellett.
Egy példa az AltSoftSerial megvalósítása: https://github.com/PaulStoffregen/AltSoftSerial/blob/master/AltSoft...p#L155
(#) Massawa válasza asch hozzászólására (») Márc 20, 2024 /
 
Kösz egyelöre probalom a Koblog kolléga verzioját csak nem volt idöm még összerakni a hardwaret. A kodot már egy kicsit átirtam talán holnap le is tesztelem.
(#) KoblogPerGyok válasza asch hozzászólására (») Márc 21, 2024 /
 
Ezt tetszik, mert ez lenne a korrekt megoldás, ennyire nem másztam bele az Arduino processzorába, azonban az általad javasolt megoldással lehetséges két pin-re kitenni a jelet? Itt két külön pin van, de ekkor gondolom vagy két folyton változó PWM -kell, (PIC-ben ez meg van oldva), vagy a kimenetet kell változtatni, miközben a PWM compare értékét is változtatjuk?
Volna egy kis kódod erről? Azért tudom, hogy kis kód, mert ha jól sejtem sokkal rövidebb lenne az enyémnél. dsPIC-ben csináltam hasonlót, a regiszterekkel operálva rövidebb lehet a kód.

Massawa:
Ha működik is a kódom, vagy az átalakított kódod, akkor is meg kellene nézni/fontolni asch javaslatát is. Már ha van rá időd/kedved. Nekem lenne kedvem kipróbálni.
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Márc 21, 2024 /
 
Adatlapon kívül ez is hasznos, kezem érteni ezt a rendszert is, kipróbálom!

Bővebben: Link

Valójában a "Arduino Timer Interrupts Example (COMPA+COMPB)" fejezetben meg is oldja a feladatot.
A hozzászólás módosítva: Márc 21, 2024
Következő: »»   835 / 850
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem