Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
WinAVR / GCC alapszabályok:
1. Ha ISR-ben használsz globális változót, az legyen "volatile"
2. Soha ne érjen véget a main() függvény
3. UART/USART hibák 99,9% a rossz órajel miatt van
4. Kerüld el a -O0 optimalizációs beállítást minden áron
5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás
6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et
Bővebben: AVR-libc FAQ
Lapozás: OK   623 / 840
(#) killbill válasza Droot hozzászólására (») Okt 17, 2014 /
 
Hogyan johetett ki 4110 fok, amikor 2047 a maximum? Azon kivul a csatolt kepen az elso byte mindig 0, tehat 16 foknal nagyobb ertek nem is lehet. A 13 fok sokkal inkabb helyes eredmeny, mert a masodik byte felso 4 bitje pontosan a fokot tartalmazza, ha a felso byte 0. Ennek megfeleloen a csatolt kepen 8..14 fok koruli ertekek vannak. A belso homerorol nem derul ki semmi, mivel a harmadik byte helyett is a negyediket kuldted ki.
A programban data es th milyen tipusu valtozok? Ha data long, akkor nem kell a felesleges maszkolas es ujboli elojel eloallitas (15. sor), eleg csak siman: th = data >> 18;
(#) Droot válasza killbill hozzászólására (») Okt 17, 2014 /
 
Valóban.
Azt viszont már javítottam.
A sprintf-ben hogy kell átírni hogy két tizedes pontosan megjelenjen?
Illetve nem teljesen értem hogy miért kell elosztani 4-el a fogadott hőmérséklet adatot.
(#) vzoole válasza Droot hozzászólására (») Okt 17, 2014 /
 
Első körben én kettéválasztanám az érkező 32bit adatot két 16 bitesre.

Ez csak pozitív egész számokat tud kezelni, de kezdésnek jó lesz:
  1. uint16_t data_H;
  2. uint16_t data_L;
  3. uint8_t b1;
  4. uint8_t b2;
  5. uint8_t b3;
  6. uint8_t b4;
  7.  
  8. CS_ENABLE;
  9. b1 = spi_readwrite(0x00);
  10. b2 = spi_readwrite(0x00);
  11. b3 = spi_readwrite(0x00);
  12. b4 = spi_readwrite(0x00);
  13. CS_DISABLE
  14.  
  15. data_H = (b1<<8) | b2;
  16. data_L = (b3<<8) | b4;
  17.  
  18. tc_temp = (data_H>>4); //hőelem hőmérséklet
  19. ic_temp = (data_L>>8); //környezeti hőmérséklet
(#) Droot válasza vzoole hozzászólására (») Okt 17, 2014 /
 
Tökéletesen működik!

Hogy lehet megcsinálni, hogy ne csak egész számokat tudjon kezelni?
(#) killbill válasza Droot hozzászólására (») Okt 17, 2014 /
 
Azert kell neggyel osztani, mert az also ket bit nem a homerseklethez tartozik, a kovetkezo ket bit pedig a tizedes resz, azaz a 0.5 es 0.25 fokok bitjei. A sprintf-ben nem egyszeru a ket tizedes kiiras, mert ha azt kapod az IC-bol, hogy 3, akkor az 0.75 fok. Egy nem tul elegans megoldas, ha pl. megszorzod 25-tel a kapott eredmenyt, es azt iratod ki ket reszletben. Csak ott is szivas van a tort resz elojelevel:

  1. #define ABS(x) ((x<0)?-(x):(x))
  2.  
  3. void func(void)
  4. {
  5. int  kt, it;
  6.  
  7.  CS_LOW();
  8.  kt = spi_read(0) << 8;
  9.  kt |= spi_read(0);
  10.  it = spi_read(0) << 8;
  11.  it |= spi_read(0);
  12.  CS_HIGH();
  13.  
  14.  kt >>= 2;  // also ket bit nem kell, az elojel megmarad
  15.  kt *= 25;
  16.  printf("%d.%d", kt / 100, ABS(kt%100));
  17. }

Ha ugyanezt lebegopontosan oldod meg, akkor valamivel egyszerubb a kiiratas, de valojaban sokkal tobb kodba kerul a lebegopontos aritmetika hozzalinkelese miatt:

  1. double temp;
  2.  CS_LOW();
  3.  kt = .....
  4.  CS_HIGH();
  5.  kt >>= 2;  // also ket bit nem kell, az elojel megmarad
  6.  temp = 0.25 * kt;
  7.  printf("%6.2fC", temp);
(#) Droot válasza killbill hozzászólására (») Okt 17, 2014 /
 
Köszönöm a gyors válaszokat neked is és Zolinak is! A legvégén nem lesz szükségem a tizedesek kiírására, de szeretném megérteni, ezért jól jött hogy leírtad.
(#) vzoole válasza Droot hozzászólására (») Okt 17, 2014 /
 
Én nem terhelném le az AVR-t tört változókkal.
Külön kezelném a tört értékeket egész számként.
Persze ez függ a felhasználási területtől is.
  1. //hőelem tizedes
  2. tizedes_ertek = ( (data_H>>2) & 0x3 ) * 25;
A hozzászólás módosítva: Okt 17, 2014
(#) killbill válasza vzoole hozzászólására (») Okt 17, 2014 /
 
Jogos, csak akkor a negativ szamok eseteben maskepp kell dolgozni. Ha csak siman eldobod az also ket bitet a szambol, amikor az egeszeket kepzed, akkor a negagiv ertekeknel kulon oda kell figyelni, mert a -1, -2 es -3 ertekek -0.25, -0.5, -0.75 foknak felel meg. Ha csak siman eldobod az also ket bitet, akkor az egesz resz -1 lenne, pedig annak nullanak kellene lennie. Ezen felul a tizedeseket sem kepezheted ugy, hogy az also ket bitet szorzod 25-tel, mert negativ homersekletnel az sem lesz jo. Ennel egyszerubb, ha negativ homerseklet eseten, kiirsz egy minusz jelet, es a szamot negalod, es utana pont ugy kezeled, mint a pozitiv homersekleteket.
A hozzászólás módosítva: Okt 17, 2014
(#) killbill válasza killbill hozzászólására (») Okt 18, 2014 /
 
Nem is jo a kodreszlet, amit irtam, mert -0.25 es -0.75 fok kozott hibas erteket ir, mivel ezekben az esetekben az egesz resz nulla, igy nem fogja kiirni a minusz jelet... A floatos megoldas jo, csak az irtozatos pazarlas.
(#) vzoole válasza killbill hozzászólására (») Okt 18, 2014 /
 
Ez a része tényleg beugratós, észre se vettem.

Még egy olyan megoldást tudnék elképzelni, hogy a hőelem adatán az alsó két bitet lemaszkoljuk, és így használjuk fel előjeles egész számként. Csak minden számítási műveletnél figyelembe kell venni, hogy az aktuális hőmérséklet 16 szoros értékével dolgozunk.

Egyedül a megjelenítésnél kell egy pár művelet, ahol külön kezelnénk az előjelet, az egész értéket és a tizedest. Talán még mindig kevésbé lenne erőforrás igényes mint egy lebegőpontos szám.

Persze, terminálon átküldve nem lenne jó, de az szerintem nem is végtermék megoldás. Ha PC-n kell megjeleníteni, akkor oda is átmehet egészként és majd az ottani program konvertálja át magának tizedesre.
A hozzászólás módosítva: Okt 18, 2014
(#) killbill válasza vzoole hozzászólására (») Okt 18, 2014 /
 
Maszkolas helyett inkabb elshiftelem ket bittel jobbra. Akkor is elojeles egesz szam marad, de minden bit hasznos lesz benne, nem kell kulon foglalkozni azzal, hogy az also ket bit mindig nulla. Tort szam marad igy is, hiszen az also ket bit 0.75 fokot "ér", de ettol meg szamolni konnyen lehet vele. Es ahogy mondod, a kiirasnal kell csak vacakolni a szetszedessel. A 25-os szorzast is csak a kiirasra javasoltam, egyeb muveletekre a 14 bites erteket jobbra igazitva a legcelszerubb hasznalni. Terminalra ASCII-t kuldesz, ez adja magat. De hat az a kiiratas, maga.
(#) vzoole válasza killbill hozzászólására (») Okt 18, 2014 /
 
Tehát ha előjeles számot shift-elek az előjel marad a helyén?
(#) killbill válasza vzoole hozzászólására (») Okt 18, 2014 /
 
Igen. 0x8000 >> 1 = 0xc000. Ha elojeles szamot shiftelsz jobbra, akkor a legfelso bit megmarad, es az eggyel alacsonyabb helyierteku bitre is a legfelso bit masolodik be. Assembly-ben ez altalaban az ASR, Arithmetic Shift Right. Balra shiftelesnel az also bitbe nulla megy mindig.
A hozzászólás módosítva: Okt 18, 2014
(#) k3gy3tl3n hozzászólása Okt 22, 2014 /
 
Sziasztok, a következő fuse bit-ek beírásával kizárhattam magam a mikrokontrollerből: 7F DF ? Amíg A1 D9 volt még ment, de most már a régit sem tudom visszaírni. Most külső oszcillátor kell neki hogy tudjam programozni?
(#) Droot hozzászólása Okt 23, 2014 /
 
Sziasztok!

Nemrégiben jelentkeztem a MAX31855 problémával kapcsolatban.
A szabályzáshoz szeretnék egy PIC szabályzót illeszteni. Egyenlőre egy másik projekt szabályzójával próbálkozom, több kevesebb sikerrel.
Amíg a beállított értéket nem éri el teljesen a szenzor, kb. 20 fok különbség lehet, addig tökéletesen működik a kijelzés, amint eléri és a szabályzás beavatkozna, elkezd ugrálni a kijelzés, pl beállítom 200 fokra akkor 211, 202, 193, de még 170-re is képes lemenni. Ha "beállt" és csak finoman kellene pár fokot szabályoznia képes ugrálni a kijelzés 198 és 188 között, csak ez az érték, pont 10es különbséggel. Ha csak a proporcionális tag értéke van beállítva, az integráló és a deriváló 0, akkor tökéletesen működik. Amint az integrálót 0-ról elállítom, újra előjön a hiba.

  1. Főciklus:
  2.         while(1)
  3.         {
  4.                 data_H = (b1<<8) | b2;
  5.                 data_L = (b3<<8) | b4;
  6.  
  7.                 tc_temp = (data_H>>4); //hőelem hőmérséklet
  8.                 ic_temp = (data_L>>8); //környezeti hőmérséklet
  9.                 if(tc_temp & 0x800) //ha D31=1 azaz negatív hmérséklet
  10.                         tc_temp = 0;
  11.                 DisplayValue = tc_temp;
  12.         }
  13.  
  14. //Timer2 1,91Hz
  15. ISR(TIMER2_OVF_vect)
  16. {
  17.  
  18.                 MAX31855_EN;
  19.                 b1  = spi_readwrite(0x00);
  20.                 b2 = spi_readwrite(0x00);
  21.                 b3 = spi_readwrite(0x00);
  22.                 b4 = spi_readwrite(0x00);
  23.                 MAX31855_DIS;
  24.  
  25.                 power = pid(SetTemp,tc_temp,&pid_s);
  26.                 OCR1B = power;  //set PWM fill factor
  27. }


pid.c:
  1. /*
  2.  * pid.c
  3.  *
  4.  *  Created on: 2009-01-23
  5.  *      Author: wodz
  6.  */
  7. #include <stdint.h>
  8. #include <stdio.h>
  9. #include "pid.h"
  10.  
  11. int16_t pid(uint16_t setpoint, uint16_t temperature, pid_t *pid_s)
  12. {
  13.         int32_t result;
  14.  
  15.         // calculate regulator error
  16.         pid_s->errors[pid_s->index & MASK] = setpoint - temperature;
  17.  
  18.         // calculate derivative term
  19.                 pid_s->derivative = pid_s->errors[pid_s->index & MASK] - pid_s->errors[(pid_s->index-1) & MASK];
  20.  
  21.         // if we are far away from setpoint use PD otherwise use full PID function
  22.         if (pid_s->errors[pid_s->index & MASK] > pid_s->KT || pid_s->errors[pid_s->index & MASK] < -pid_s->KT)
  23.         {
  24.                 result = (pid_s->KP*pid_s->errors[pid_s->index & MASK] + pid_s->KD*pid_s->derivative);
  25.         }
  26.         else
  27.         {
  28.                 // integrate error
  29.                 pid_s->integral += pid_s->errors[pid_s->index & MASK];
  30.  
  31.  
  32.                 // PID function
  33.                 result = (pid_s->KP*pid_s->errors[pid_s->index & MASK] + (pid_s->KI*pid_s->integral)/100 + pid_s->KD*pid_s->derivative);
  34.         }
  35.  
  36.         pid_s->index++;
  37.  
  38.         // regulator function bandwidth set to PID_TOP - PID_BOTTOM
  39.         if (result > PID_TOP)
  40.         {
  41.                 return (int16_t)PID_TOP;
  42.         }
  43.         else if (result < PID_BOTTOM)
  44.         {
  45.                 return (int16_t)PID_BOTTOM;
  46.         }
  47.         else
  48.         {
  49.                 return (int16_t)result;
  50.         }
  51.  
  52.  
  53. }


pid.h:
  1. /*
  2.  * pid.h
  3.  *
  4.  *  Created on: 2009-01-24
  5.  *      Author: wodz
  6.  */
  7.  
  8. #ifndef PID_H_
  9. #define PID_H_
  10.  
  11. #define MASK 0x01                               //bit mask to access current error in errors array
  12. #define PID_TOP 511                             //max value regulator function should return
  13. #define PID_BOTTOM 0                    //min value regulator function should return
  14. #define MAX_PID_CONSTANT 32             //max value of constants to avoid overflows
  15.  
  16. typedef struct {
  17.         uint8_t KP;                                     //proportional term constant 0-32
  18.         uint8_t KI;                                     //integral term constant 0-32
  19.         uint8_t KD;                                     //differential term constant 0-32
  20.         uint8_t KT;                                     //threshold between PD and PID behavior of regulator function
  21.         uint8_t index;                          //errors array index
  22.         int16_t errors[2];                      //errors array
  23.         int16_t integral;                       //integral of the error
  24.         int16_t derivative;                     //derivative of the error
  25. } pid_t;
  26.  
  27. int16_t pid(uint16_t setpoint, uint16_t temperature, pid_t *pid_setup);
  28.  
  29. #endif /* PID_H_ */


Amennyit ugrál a beállított hőmérséklet annyit fizikailag képtelen, mert egy fűtőtesten van a hőelem, tehát azt nem értem, hogy hol és mit rontottam el hogy csak akkor ugrál amikor finoman kellene szabályozni. Vagy pont azért csinálja ezt mert még nincs bekalibrálva a PID szabályozó?
(#) vzoole válasza Droot hozzászólására (») Okt 23, 2014 /
 
Kapcsolási rajz?
(#) killbill válasza Droot hozzászólására (») Okt 23, 2014 /
 
Ez messze nem AVR kerdes, sokkal inkabb PID. Ha nem jok a konstansok, a szabalyzod gerjedni fog. Nem egyszeru temakor. A PID szabalyzok integralis tagja csuf dolgokra kepes. Pl. itt soha senki nem nullazza azt es tulcsordulasra sem figyeli a program. Ez semmikeppen nem jo. Ha KD-t nullara allitod es KI-t valami kis ertekre, akkor is ugral?
(#) vzoole válasza Droot hozzászólására (») Okt 23, 2014 /
 
Lehet félreértettem a problémát...
A kijelzett hőmérséklet ugrál össze-vissza vagy a hőmérséklet ingadozik és emiatt a kijelzés is?

ui.: Hol és mire vannak megadva a pid konstans értékei?
A hozzászólás módosítva: Okt 23, 2014
(#) Droot válasza killbill hozzászólására (») Okt 23, 2014 /
 
Akkor nem ugrál. Ezzel a beállítással: pid_s.KP = 15; pid_s.KI = 2; pid_s.KD = 0; pid_s.KT = 30; 160 fokra beállítva 164 és 151 között mászkál, 151 alá nem megy. Kezdhetek arra gyanakodni, hogy csak azért csinálja mert gerjed a szabályozó?

Zoli: Biztos vagyok benne hogy a kijelzett hőmérséklet ugrál. Fizikailag lehetetlen hogy a fűtőtesben 1sec alatt 10 fokot változzon a hőmérséklet, még ha teljes gőzzel fűt, akkor sem változik 1sec alatt 10 fokot, és itt ráadásul negatív irányban változik, ezért nem értem.
(#) vzoole válasza Droot hozzászólására (») Okt 23, 2014 / 1
 
Ha így ugrál az mérési hiba, mégis csak kéne a kapcsolási rajz.
(#) Droot válasza vzoole hozzászólására (») Okt 23, 2014 /
 
Ez volna az. Én is arra tippeltem először, de furcsa hogy csak bizonyos PID értékek mellett csinálja, közben kísérletezések közben ha a KT-t levettem 1-re akkor nem csinálta. És fura hogy csak akkor ugrál ha a PID be akar avatkozni.
A csatolmány kérésre törölve.
A hozzászólás módosítva: Okt 30, 2014
(#) vzoole válasza Droot hozzászólására (») Okt 23, 2014 /
 
Elsőnek a hőelem jelét szűrni kéne, mert elég hosszú a vezeték és rárakódik a kapcsolási zaj.
Másodiknak átlagolni kéne. Másodpercenként elég egyszer pid értéket számolni normál pákáknál, viszont ezalatt mérni kéne "folyamatosan" és átlagolni.

Milyen pákához lesz?
(#) Droot válasza vzoole hozzászólására (») Okt 23, 2014 /
 
Sold iron/n pákához. Szűréshez elég csak egy 100nfos kondi a hőelem bemenetre?
Átlagolásnál mennyi időnként mérjek és hány értéket érdemes átlagolni?
(#) vzoole válasza Droot hozzászólására (») Okt 23, 2014 /
 
100n nem elég, kéne egy aluláteresztő szűrő.
Olyan gyakran mérj, amilyen gyakran csak lehet (nem túl sok lesz .
(#) kisstomi5545 hozzászólása Okt 24, 2014 /
 
Üdv!

Megszerettem volna építeni a vonalkövető robotot, de szereintem valami nem jó a programban!
a kapcsolás maga működik, de ha elindítom a Serial Monitort, akkor semmit nem ír ki, miközben kellene neki a határértkeket!
  1. #define EN1 9 // Pin9 (P2.1) : Motor1 sebesseg (PWM)
  2.  
  3. #define M1 10 // Pin10 (P2.2) : Motor1 irany (Bal Motor)
  4.  
  5. #define EN2 12 // Pin12 (P2.4) : Motor2 sebesseg (PWM)
  6.  
  7. #define M2 11 // Pin11 (P2.3) : Motor2 irany (Jobb Motor)
  8.  
  9.  
  10.  
  11. int BalSzenzor = A4; // Bal oldali szenzor az A4 analog labra kotve - Pin6 (P1.4)
  12.  
  13. int JobbSzenzor = A7; // Jobb oldali szenzor az A7 analog labra kotve - Pin15 (P1.7)
  14.  
  15. int balertek; // Bal szenzoron mert ertek
  16.  
  17. int jobbertek; // Jobb szenzoron mert ertek
  18.  
  19. int Hatarertek = 720; // szenzor hatarertek
  20.  
  21. int MotorSebesseg = 30; // Kezdeti motorsebesseg megadasa
  22.  
  23.  
  24.  
  25. void setup()
  26.  
  27. {
  28.  
  29. pinMode(EN1, OUTPUT); // Motor1 sebesseg (PWM)
  30.  
  31. pinMode(EN2, OUTPUT); // Motor2 sebesseg (PWM)
  32.  
  33. pinMode(M1, OUTPUT); // Motor1 irany (Bal Motor)
  34.  
  35. pinMode(M2, OUTPUT); // Motor2 irany (Jobb Motor)
  36.  
  37. MotorBal(MotorSebesseg); // Robot: Elore
  38.  
  39. MotorJobb(MotorSebesseg);
  40.  
  41. Serial.begin(9600); // 9600 baud-os soros kommunikacio beallitasa
  42.  
  43. }
  44.  
  45.  
  46.  
  47. void loop() // vegtelen ciklus
  48.  
  49. {
  50.  
  51. balertek = analogRead(BalSzenzor); // Bal szenzoron levo feszultseg merese (0 - 1023 kozotti ertek)
  52.  
  53. jobbertek = analogRead(JobbSzenzor); // Jobb szenzoron levo feszultseg merese (0 - 1023 kozotti ertek)
  54.  
  55.  
  56.  
  57. // Ha mindket szenzor a vilagos padlo felett van: Elore
  58.  
  59. if (balertek>Hatarertek && jobbertek>Hatarertek)
  60.  
  61. {
  62.  
  63. MotorBal(MotorSebesseg); //Bal motor: elore
  64.  
  65. MotorJobb(MotorSebesseg); //Jobb motor: elore
  66.  
  67. }
  68.  
  69. // Ha a Bal szenzor a vonal felett, a Jobb pedig a padlo felett van: Balra kanyarodas
  70.  
  71. else if (balertek<Hatarertek && jobbertek>Hatarertek)
  72.  
  73. {
  74.  
  75. MotorBal(0); // Bal motor: stop
  76.  
  77. MotorJobb(MotorSebesseg); // Jobb motor: elore
  78.  
  79. }
  80.  
  81. // Ha a Jobb szenzor a vonal felett, a Bal pedig a padlo felett van: Jobbra kanyarodas
  82.  
  83. else if (balertek>Hatarertek && jobbertek<Hatarertek)
  84.  
  85. {
  86.  
  87. MotorBal(MotorSebesseg); // Bal motor: elore
  88.  
  89. MotorJobb(0); // Jobb motor: stop
  90.  
  91. }
  92.  
  93. // Mindket szenzor a vonal felett van (keresztezodes): Elore
  94.  
  95. else if (balertek<Hatarertek && jobbertek<Hatarertek)
  96.  
  97. {
  98.  
  99. MotorBal(MotorSebesseg); // Bal motor: elore
  100.  
  101. MotorJobb(MotorSebesseg); // Jobb motor: elore
  102.  
  103. }
  104.  
  105.  
  106.  
  107. // A mert szenzoradatok elkuldese a PC-re
  108.  
  109. // (szenzor hatarertek meghatarozasakor es tesztelesnel hasznaltam)
  110.  
  111. Serial.print("Bal Szenzor = " );
  112.  
  113. Serial.print(balertek);
  114.  
  115. Serial.print(" Jobb Szenzor = ");
  116.  
  117. Serial.println(jobbertek);
  118.  
  119.  
  120.  
  121. delay(50); // Varakozas 50ms-ig
  122.  
  123. }
  124.  
  125.  
  126.  
  127. void MotorBal(int sebesseg)
  128.  
  129. {
  130.  
  131. if (sebesseg>0)
  132.  
  133. {
  134.  
  135. digitalWrite(M1,HIGH);
  136.  
  137. analogWrite(EN1,sebesseg*255/100);
  138.  
  139. }
  140.  
  141. else
  142.  
  143. {
  144.  
  145. digitalWrite(M1,LOW);
  146.  
  147. analogWrite(EN1,abs(sebesseg)*255/100);
  148.  
  149. }
  150.  
  151. }
  152.  
  153. void MotorJobb(int sebesseg)
  154.  
  155. {
  156.  
  157. if (sebesseg>0)
  158.  
  159. {
  160.  
  161. digitalWrite(M2,HIGH);
  162.  
  163. analogWrite(EN2,sebesseg*255/100);
  164.  
  165. }
  166.  
  167. else
  168.  
  169. {
  170.  
  171. digitalWrite(M2,LOW);
  172.  
  173. analogWrite(EN2,abs(sebesseg)*255/100);
  174.  
  175. }
  176.  
  177. }


Előre is köszönöm!
(#) Kovidivi válasza kisstomi5545 hozzászólására (») Okt 24, 2014 /
 
Szia.
Rakj egy Serial.print-et a setupba, hogy tudd, egyáltalán van-e kommunikáció (ha nem azonosak a sebességek, lehet nem jön át semmi karakter). Ezután rakd fel még az if-ek elé a Serial.print-et, mert lehet, hogy az egyik if-be beragad a program. A másik ötlet: a motorok elindításakor resetel az AVR. Szét kellene választani a két tápot, minimum egy diódával, az AVR-nek meg legyen saját 1000µF kondija. Nézd meg a tápellátást is, hogy elég-e!
szerk: ez mondjuk Arduino, annak van külön témája, oda írj ezután.
A hozzászólás módosítva: Okt 24, 2014
(#) kisstomi5545 válasza Kovidivi hozzászólására (») Okt 24, 2014 /
 
Köszönöm!
Rendben oda fogom.
(#) Kovidivi hozzászólása Okt 24, 2014 /
 
Sziasztok!
Van valami módja az I2C kommunikációt optocsatolóval izolálni?
Találtam kapcsolást, ami majdnem jó, csak nálam nincs különválasztva az SDAin és SDAout.Bővebben: Link
Az SCL-t leválasztani nem okoz gondot, azt úgyis csak a master adja, viszont két irányú lenne a kommunikáció, az SDA leválasztására nem találok megoldást, ahol nem kell valami spéci IC-t venni.
Esetleg ez jó lenne SDA-hoz? Bővebben: Link
Köszönöm a segítséget!
A hozzászólás módosítva: Okt 24, 2014
(#) Droot válasza vzoole hozzászólására (») Okt 24, 2014 /
 
250ms-onként lehet adatot kiolvasni, szóval másodpercenként 4x.
Az aluláteresztő szűrőhöz megfelel a 47uf-os és 470 ohmos ellenállás?
A pwm kapcsolófrekit érdemes lentebbvinni? Láttam olyan megoldást ahol csak 15hz.
(#) Hp41C válasza Kovidivi hozzászólására (») Okt 24, 2014 /
 
Goooogle "I2C opto isolator": Bővebben: Link
A hozzászólás módosítva: Okt 24, 2014
Következő: »»   623 / 840
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