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   666 / 837
(#) Gj hozzászólása Máj 21, 2015 /
 
Üdv!
PC ventilátorok vezérlésénél ha ATMega8-at használok, akkor 8bites Fast-PWM-mel nem sípolnak a ventik, de ATMega48PA-n viszont igen. Ugyan úgy 7.3728MHz-s oszcillátorról hajtom őket, elvileg semmi különbség, de az ATMega48-nál mégis sípolnak a ventik, azaz alacsonyabb frekin ad PWM jelet.

Itt van az ATMega48 kódja (itt csak egy lábon ad jelet, de már ennyi sem működik):
  1. #include <avr/io.h>
  2. #define F_CPU 7372800
  3.  
  4. int main(void)
  5. {
  6.         DDRB |= _BV(PINB1);
  7.         TCCR1A |= _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10);
  8.         TCCR1B |= _BV(WGM12) | _BV(CS10);
  9.         OCR1B = 255;
  10.         OCR1A = 120;
  11.  
  12.         while(1)
  13.         {
  14.  
  15.         }
  16. }
A hozzászólás módosítva: Máj 21, 2015
(#) Droot válasza Gj hozzászólására (») Máj 21, 2015 /
 
CLKDIV8 fuse bit van benne? Esetleg másnéven órajel osztó?
(#) Gj válasza Droot hozzászólására (») Máj 21, 2015 /
 
Megoldotta a problémát, a neve egyébként "CKDIV8" volt.
Nagyon köszönöm!
A hozzászólás módosítva: Máj 21, 2015
(#) yohnsee hozzászólása Máj 21, 2015 /
 
Sziasztok!

Egy kis elméleti segítséget kérnék. AVR-el szeretném mérni egy 230VAC motor áramfelvételét. Arra jutottam, hogy erre két lehetőségem van, az egyik a HALL érzékelővel való mérés, a másik az áramváltó alkalmazása. A motor maximum 4A-t vesz fel. A gondom az, hogy kerestem, de konkrét példát nem találtam a megvalósításra. Program oldalról szerintem menne a dolog, csak a hardveres részt nem hiszem, hogy egyedül ki tudnám találni. Tudnátok nekem tanácsot, iránymutatást adni?
(#) csatti2 válasza yohnsee hozzászólására (») Máj 21, 2015 /
 
Mind a két szenzortípusról (várhatóan) szinuszos jelet fogsz kapni. Ha beéred a nem tökéletes megoldással (feltételezzük, hogy a mért áram szép tiszta szinuszos), akkor egy egyszerű amplitúdócsúcs meghatározó áramkörrel (ellenállás, amin a generált áram átfolyik [áramváltó esetén kell, hogy fesz. jelünk legyen, hall szenzornál gyakran már fesz. jel a kimenet] műveleti erősítő, egyenirányító dióda, kondenzátor kombó, ahol a visszacsatolt jelet a kondi-ról vesszük). Ha szükséges erősíthetjük is a jelet a műveleti erősítővel a pontosabb mérés érdekében. Egy másik műv erősítővel leválaszthatjuk a kondi jelét és ezt ráköthetjük az ADC bemenetére. Egy mosfet-el kisüthetjük a kondit a mérés végén, hogy friss csúcsot mérhessünk. Ezután az amplitudó értékéből a választott ellenállás ismeretében (illetve a műv erősítő szorzatának ismeretében, ha szükséges) meghatározható a maximális áram, ebből pedig viszonylag jó közelítéssel az rms.
A hozzászólás módosítva: Máj 21, 2015
(#) csatti2 hozzászólása Máj 21, 2015 /
 
Itt egy vázlat, hogy is nézne ki. Az áramkör nem teljes természetesen. A betápot stb. neked kell kitalálnod. Ha nagy a kondi, akkor a mosfet-el sorba kell még kötni egy ellenállást (a mosfet legyen föld "közelben"), hogy ne legyen túl nagy a kisütés árama. Ha a uC nem tud kiadni 5V-ot (vagy pontosabban az N-MOSFET max. Vgs(on)-t [katalógusadat, 4V-os sokféle létezik, smd-s kivitelben lehet kapni 1-2V-osat is]), akkor egy tranzisztoron keresztül kell vezérelni a mosfet-et.
A hozzászólás módosítva: Máj 21, 2015
(#) killbill válasza csatti2 hozzászólására (») Máj 22, 2015 /
 
Azon gondolkozom, hogy ha 20 eve egy 2MHz-es 68HC11-gyel 4 darab motor aramat szimultan tudtam merni egyeb sw feladatok mellett csucsegyeniranyito nelkul, akkor egy mai 10-20 MHz-es mikrokontrollernek sem okozhat ez gondot egyetlen motor eseten. Szoval az aramvalto jelet 1kHz-cel mintavetelezve a sw siman meg tudja merni. Akar csak csucsot keres benne, akar maskepp. Persze egy RC szures kell, hogy 500Hz feletti komponensek ne legyenek az A/D bemeneten. Ez a te kapcsolasodba is kellhet, mer ha van egy tuske, az ugyanugy feltolti a csucsegyeniranyitod kondijat.
(#) Kovidivi hozzászólása Máj 22, 2015 /
 
Sziasztok!
Atmega128-at szeretnék 5V-ról és Lithium Ion celláról hajtani, a cella feszültség stabilizálás nélkül jutna el az AVR-hez, ami 8MHz-en ketyegne. DS1307-től kapom a pontos időt, viszont az RTC-vel nem lehet kömmunikálni ilyen alacsony feszültségről. Hogyan lehetne megoldani a legegyszerűbben, hogy legalább 1x ki tudjam olvasni a pontos időt, amikor csak akkumulátorról (Pl. 3.7V-ról) indul az óra? Ha utána nem is lesz időszinkron, nem gond, mert az akku élettartama alatt tudom az időt tovább követni. Vagy Ti másik IC-t használnátok?
A másik megoldás az lehetne, ha fognék egy ilyet: Bővebben: Link, és akkor lenne 5V-om is mindig. Schottky diódával közösíteném a két feszültséget, a DC-DC konverter kimeneti feszültségét 4.5V-ra állítanám be, a töltést ezzel oldanám meg, van engedélyező lába is: Bővebben: Link.
Röviden a Lithium Ion cella feszültsége nem fér össze a DS1307-tel, erre keresek megoldást.
Köszönöm.
A hozzászólás módosítva: Máj 22, 2015
(#) Droot válasza yohnsee hozzászólására (») Máj 22, 2015 1 /
 
Az ACS714 vagy az ACS713-al lehet AC áramot mérni és analóg egyenfeszültséget ad ki, tehát nem szinuszosat. 30A-ig mér, jó kis IC, de arra kell figyelni, hogy 0A-nál kb. 500mV van a kimeneten, eez képest néhány mV-ot emelkedik A-enként.
(#) csatti2 válasza killbill hozzászólására (») Máj 22, 2015 /
 
Az RC szűrés jogos, bár akkor már lehet alul-áteresztő LC szűrő is, az sokkal hatékonyabb.

A többi rész viszont filozófia/cél kérdése. A jel kondicionáláshoz, leválasztásához, erősítéséhez úgyis szükség van műveleti erősítőre. Azon a maradék pár alkatrészen meg már nem múlik. Ebben az esetben pedig sokkal egyszerűbb a szoftver. Ha ez nem cél, akkor persze jó a tisztán szoftveres megoldás is ahogy írtad (mondjuk akkor meg eltolnám egy ofszet feszültséggel a jelet, hogy a teljes tartományban mérni lehessen, akár valódi RMS is mérhető lenne nagy mintavételezésnél).
(#) csatti2 válasza Droot hozzászólására (») Máj 22, 2015 /
 
Biztos? Én úgy tudtam AC-nál annak is szinuszos a kimenete.
(#) killbill válasza csatti2 hozzászólására (») Máj 22, 2015 /
 
Teljesen igazad van, ez valoban filozofia es cel kerdese. Ha valamibol sokat kell gyartani, akkor amit meg lehet programbol oldani, azt nem szabad alkatresszel. Ha egy darab kell, akkor valoban erdemes par alkatresszel megsporolni tobb orai programozoi munkat. Az eltolas adja magat, az aramvaltok egyik kimenete a feltapon volt nekem is annakidejen. Hozzateszem, az aramvalto utan nem volt OPA, csak egy RC, meg a ket vedodioda.

A szuresen gondolkoztam, es lehet, hogy nem is annyira kenyes dolog, mert egy aramjelen sokkal kevesbe vannak zavarok. Kulonosen egy induktiv terhelesnel, ahol az aram nem tud csak ugy hirtelen valtozni. (Bár egy kefés motornál csúf dolgok lehetnek.) Az aramvalto utani resz meg kisimpedancias, az is kevesbe szed ossze zavarjeleket.
A hozzászólás módosítva: Máj 22, 2015
(#) tkovacs válasza Kovidivi hozzászólására (») Máj 22, 2015 /
 
Helló!
Használd a képen látható Dickson doubler kapcsolást a feszültség növelésére. Az órajelet az AVR egyik lábán kiadod, amit le is kapcsolhatsz ha már nem akarod tovább olvasgatni az RTC-t. Ez a megoldás bőven fedezi a DS1307 áramszükségletét.
(#) Droot válasza csatti2 hozzászólására (») Máj 22, 2015 /
 
Az adatlap konkrétan nem írja, de a 6. oldalon az I/Uout diagramon DC jelet ábrázolnak.
(#) csatti2 válasza Droot hozzászólására (») Máj 22, 2015 / 1
 
Az semmi ilyesmit nem állít. Ne felejtsd el, hogy AC-nál a pillanatnyi áram is szinuszosan változik, a szenzor jele ezt követi. Tehát a kettő egymáshoz viszonyított grafikonon egy egyenes fog megjelenni ideális esetben. Ez viszont nem jelenti azt, hogy DC jel jön a szenzorból (épp ellenkezőleg). Ráadásul a megadott mintapéldáknak sincs sok értelme, ha nem szinuszos... (Az ACS714-hez több példát adtak meg).
(#) Kovidivi válasza tkovacs hozzászólására (») Máj 22, 2015 /
 
Köszi! Ezt a megoldást is felírom, ha marad szabad láb. Vagy használok egy már meglevő lábat, amit egyébként is billegtetek. Jó ötlet, köszi!
A hozzászólás módosítva: Máj 22, 2015
(#) yohnsee válasza csatti2 hozzászólására (») Máj 22, 2015 /
 
Köszönöm szépen az iránymutatást neked, Droot- nak és killbill kollégának is.
Nem 1db-ot szeretnék készíteni belőle, de nem is futószalagon fognak menni ezek a dolgok.
Az AC motor 3 vezetékes (ez fix) és 2 relével lesz megoldva az irányváltása. Kapukat fog nyitni-zárni, az áramfigyelés pedig 2 célt szolgálna. Az egyik, hogy ha a motor nem vesz fel áramot, akkor az elektronika kikapcsol és a mikrovezérlő elmegy aludni. A másik, ha netán a motor megszorul, akkor ugye hirtelen megnő az áramfelvétele, és az elektronika megpróbálja az adott relét kikapcsolni. Nem tudom, hogy az áramváltó milyen gyorsan képes lekövetni a változást.
Illetve még sok dolog nem tiszta, de van már egy működő változat DC motorra, csak ott egy 0R1 ellenállással van mérve az áramfelvétel.
(#) csatti2 válasza yohnsee hozzászólására (») Máj 22, 2015 /
 
A három vezetékesnél arra gondolsz, hogy három fázisú? Vagy a földvezetêk a harmadik és egyfázisú?

Három fázis esetén mindhárom áramát illik mérni, egy fázis hiánya esetén ugyanis továbbra is működhet a motor, de nagyon melegedhet plusz egyéb gondok is adódhatnak. Motorvédőt gondolom nem fogsz használni?

DC mérésnél általában egy ismert sönt ellenálláson eső feszültségből számítják az áramot. Az áramváltó tekercs nagy előnye, hogy megoldja a galvanikus leválasztást is, viszont érthető okokból nem működik DC esetén.

A relék segédérintkezőivel ne felejtsd el kizárni a két relé egyszerre történő meghúzását (feltéve persze, hogy olyan reléket használsz, amin vannak/lehet tenni rájuk).
(#) Max26 hozzászólása Máj 23, 2015 /
 
Helló!
/Késleltetés/ :

Ha a gyári _delay_ms(); fv-vel csinálom, akkor működik az 1mp késleltetés ha sajáttal, akkor a LED-et világítani látom. Mi lehet a gond?

Kód:Bővebben: Link
(#) csatti2 válasza Max26 hozzászólására (») Máj 23, 2015 /
 
Mivel a cycle értékét (a while loop végeredményét) nem használod, lehet kioptimalizálta a fordító az egészet.

Próbáld meg átalakítani for ciklusra, ami a következőt tartalmazza:
  1. __asm__("nop\n\t");
(#) killbill válasza Max26 hozzászólására (») Máj 23, 2015 /
 
Eloszor is, egy C ciklusnal nem tudhatod, hogy mennyi ido alatt fut le, ezert pontos idozitesekre nem lehet oket hasznalni. Ez adodik abbol, hogy a fordito sokfelekeppen fordithat. A masik, hogy ha jol optimalizal a fordito, akkor az olyan ciklusokat, aminek semmi ertelme azon tul, hogy az idot huzza, azokat kiszed a kodbol. Ha egy valtozot volatile-nak deklaralsz, akkor nem fogja kioptimalizani a vele kapcsolatos "felesleges" muveleteket.
A hozzászólás módosítva: Máj 23, 2015
(#) zombee válasza csatti2 hozzászólására (») Máj 23, 2015 /
 
A váltóáram csúcsfeszültségét natúrban lehet AVR-el mérni, csak legyen elég magas az ADC órajele,
és ne feledkezzünk meg a mintavételi gyakoriságról sem ami 50Hz esetén minimum 1kHz.

Egy másik, kényelmesebb mód a mérőegyenirányító, aminek kimenetén egy "abszolútérték"
mérhető ami megfelelő RC taggal szűrve megadja a szinuszjel számtani (elsőfokú) középértékét.
Ez a csúcsfeszültségből(Up) így jön ki: Uk = 2*Up/pi

Egy egyszerű mérőegyenirányító két műveleti erősítőből, két diódából és pár ellenállásból épül fel.
(#) yohnsee válasza zombee hozzászólására (») Máj 23, 2015 /
 
Ez nagyon érdekes, tudnál esetleg 1-2 bevált kapcsolást linkelni nekem?
(#) yohnsee válasza csatti2 hozzászólására (») Máj 23, 2015 /
 
Nem, motorvédő nem lesz.
Nem, nem 3 fázisú a motor, hanem a közös kivezetés mellett a 2 másik vezeték az irány meghatározására szolgál. Egyikre adom a feszültséget, jobbra forog a motor. Másikra adom, balra forog. (Bocsi, a saját szintemen magyarázom a dolgokat )
A reléknek nem lesznek segédérintkezői, az AVR fogja őket be-ki kapcsolni. Tudom, hogy a keresztbekapcsolás a legjobb védelem, de most szoftver fogja a védelmet szolgálni.
(#) killbill válasza yohnsee hozzászólására (») Máj 23, 2015 /
 
Semmi gond nincs a ket relevel, ha az egyik az iranyvalto, a masik pedig a ki-/bekapcsolo rele. Akkor nem lehet gond.
(#) k3gy3tl3n válasza Max26 hozzászólására (») Máj 23, 2015 /
 
Szia, valamit nem értek, kiszámoltad hogy kb 56-szor kell elszámolni 65535-ig, akkor te miért 50000-szer számolsz el 65535-ig? Próbáld így:
  1. while(1)        //végtelen ciklus a programnak
  2.         {      
  3.                 PORTA=0xff;
  4.                 //_delay_ms(1000);
  5.                 for(i=0; i<56; i++)
  6.                 {
  7.                         delay_loop(65535);
  8.                 }
  9.                 PORTA=0x00;
  10.                 for(i=0; i<56; i++)
  11.                 {
  12.                         delay_loop(65535);
  13.                 }
  14.                 //_delay_ms(1000);
  15.         }
(#) zombee válasza yohnsee hozzászólására (») Máj 23, 2015 /
 
Persze, csatolok. Az első kép a "bonyolultabb" amit mi használunk a saját mérőáramkörünkben.
Ebben benne vannak az alkatrész értékek és a "minimális" tápellátáshoz szükséges rész is.
A másodikat a Texas Instruments oldalán találtam, mármint a kapcsolást amit Eagle-be szerkesztettem.

Itt az a lényeg hogy R1=R2 legyen, a C1 értéke és funkciója (számomra) kérdéses.
Gondolom a nullátmenetnél végez egy szűrést hogy a mérőegyenirányító ne "szálljon el"
amíg a diódák és a második OPA átkapcsol. Ha nem érzékeny áramköröd van akkor nem kell
precíz és drága OPA(pl. OPA227), egy LM384 is megteszi. A tápfesz és a szűrés viszont
nagyon fontos. Ne felejts el a kimenetre RC szűrőt tenni!
A hozzászólás módosítva: Máj 23, 2015
(#) csatti2 válasza zombee hozzászólására (») Máj 24, 2015 /
 
A 100nF-os kondi az RC körödben kevés lesz 50Hz méréséhez (nagy lesz a ripple).
A te köröd előnye, hogy egyből viszonylag pontos RMS értéket lehet belőle kivenni (hiányzik viszont a jel erősítése). A végeredmény (ha kicsi ripple kell, akkor jóval nagyobb a kondi [5-10 uF]) viszont lassan születik meg (lassan áll be persze annyira azért nem, mondjuk fél-egy másodperc). Őszintén szólva a texas áramköre jobban tetszik, kevesebb precíziós alkatrész kell bele. Hátrány még, hogy negatív betáp is kell ezekhez a megoldásokhoz.
(#) Gj hozzászólása Máj 24, 2015 /
 
Üdv!
ATMega48-at szeretnék használni I2C-vel (TWI) Slaveként.
Eddig jutottam el a kóddal, ami nem sok sőt nem is vagyok benne biztos, hogy jó.
Hogyan kéne befejezni, hogy működjön?
  1. #define SCL_CLOCK 10000
  2. #define TWIprescaler_value 1
  3. #define TWIBaudRate ((F_CPU/SCL_CLOCK)-16)/(2*TWIprescaler_value)
  4.  
  5. ////////////////////////KIMARADT JELENTÉKTELEN RÉSZEK///////////////////////
  6.  
  7. TWBR = TWIBaudRate;
  8. TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWIE) | _BV(TWEA);
  9. TWAR = 255;
A hozzászólás módosítva: Máj 24, 2015
(#) zombee válasza csatti2 hozzászólására (») Máj 24, 2015 /
 
Lehet hogy nagy ripple lesz, de egy 100ms-os időintervallumban mérve és az eredményt kiátlagolva elég jól közelít az RMS-hez. Ha ehhez egy (szoftveres) minimum/maximum kiértékelés is tartozik akkor az időintervallum 40ms alá vihető 50Hz-es áramot feltételezve. Az elsőhöz sem kell több precíziós alkatrész, ugyanúgy megépíthető 1%-os ellenállásokkal és "gyengébb" műveleti erősítővel. A bemenet kondícionálása (pl. osztó, erősítő) a felhasználó feladata, a paramétereket nem ismerem ezért csak az alapkapcsolást tettem bele. A negatív betáp minden hasonló áramkörnél kell, hacsak nem diódahíddal (és a nyitófeszültség adta hibával) képzeli el a delikvens az áramkört. Sajnos nagyobb szűrőkondival túl lassú lenne a cucc.
Következő: »»   666 / 837
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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