Moduláció

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
atari
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2009. október 28. szerda, 6:00

Moduláció

Hozzászólás Szerző: atari »

Sziasztok!

Segítséget szeretnék kérni Tőletek, Ti hogyan oldanátok meg az alábbi problémát:
Kép

Próbáltam már timerrel, megszakítással, de nem igazán működött. Nincs valami ötletetek? Egy műszert kellene vezérelnem így.
Amikor mondjuk a 900 Hz-es freki 1-ben van, akkor kell kiadnom 3khz-es jelet.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A programkódot láthatni lehetne?
mondjuk a megszaggatom a meglevő jelet - vagy vmi hasonlót....


Ahogy én nekimennék:
Timer egyik: 3 khz szaggatójelet ad. a Overflownál a timer másik start vagy timer másik stop (50% kitöltési tényező.

Timer másik:
Timer másik overflow-ban : honnan start és meddig számoljon. esetleg prescale.

De mehet start/stop-l, kimenet logikai kapuzva (and), vagy egy VCO-t meghajtva...
Avatar
atari
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2009. október 28. szerda, 6:00

Hozzászólás Szerző: atari »

Ezt írtam, de gyakorlatilag se kép, se hang. :-(


$regfile = "m32def.dat" 'ATMEGA32
$crystal = 1000000 'Órajel:1Mhz
Dim A_freki As Long 'A frekvencia (3kHz)
Dim A_freki_fele As Long 'B frekvencia (900Hz)
Dim B_freki As Long
Dim B_freki_fele As Long
Config Timer0 = Counter , Prescale=1
Config Timer2 = Counter , Prescale =1
Config Portb = Output
Timer0 = 0
Timer2 = 0
Start Timer0
Start Timer2
A_freki = 900
B_freki = 30000
A_freki_fele = A_freki / 2
B_freki_fele = B_freki / 2
Do
If Timer0 < A_freki_fele Then 'ha A freki 1-ben van
If Timer2 < B_freki_fele Then 'B freki elindul
Pinb.0 = 1 'és 1-ben van
Else
Pinb.0 = 0 'B freki nulla
End If
If Timer2 > B_freki Then Timer2 = 0 'B freki egy periódusa lejár
Else 'A freki nulla
Pinb.0 = 0
End If

If Timer0 > A_freki Then 'A freki egy periódusa lejárt
Timer0 = 0
End If
Loop

End

De az is jó lenne, ha sikerülne a két különböző frekvenciát két külön lábon előállítani, aztán kikapuzom.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A config timer nem counter, hanem timer. Counter esetén a külső jelet számolgatná...

Timer INT alapon számolódik, nem egy belső számlálós változó...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

http://avr.tavir.hu/modules.php?name=Co ... age&pid=18

a lap közepén az időzítő/számláló részt....


A belső 1 MHz órajel pontossága felejtős... Hőfokfüggés illetve alapban +/- 5..10%
Avatar
atari
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2009. október 28. szerda, 6:00

Hozzászólás Szerző: atari »

Köszi a segítséget, sok fejtörés után ez lett belőle:

$regfile = "m32def.dat"
$crystal = 8000000

Config Portd = Output
On Timer0 A_freki
On Timer2 B_freki
Config Timer0 = Timer , Prescale = 1
Config Timer2 = Timer , Prescale = 8
Enable Timer0
Enable Timer2
Enable Interrupts
Const idozites_a = 1
Const idozites_b = 255
Timer0 = idozites_a
Timer2 = idozites_b

Do

'ide jön a progi

Loop


A_freki:
Timer0 = idozites_a
Portd.5 = Not Portd.5
Return

B_freki:
Timer2 = idozites_b
Portd.6 = Not Portd.6
Return

Proteussal összeállítva tökéletesen megy. :-)
A két frekit egy nand bemeterére kötve meg is van a kívánt jel. Az időzítésekkel még baj van, de majd kísérletezek vele.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

„Portd.5 = Not Portd.5” ?
Van erre direkt utasítás is a Bascomba: TOGGLE Portd.5
8)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A Start timer1 és a Start timer2 is javasot a Do-Loop program elé....

Első olvasatban jónak tűnik....
Ha a const helyett változóid lesznek egyszer: Timer0: byte; Timer1: word.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Szerintem logikailag egyszerűbb lenne megoldani, mint külső kapukkal! Meg olcsóbb is!
Például valahogy így:

Kód: Egész kijelölése

 $regfile = "m32def.dat"
 $crystal = 8000000

 Config Portd = Output
 On Timer0 A_freki
 On Timer2 B_freki
 Config Timer0 = Timer , Prescale = 1
 Config Timer2 = Timer , Prescale = 8
 Dim Ntimer0 As Byte
 Dim Ntimer2 As Word
 Enable Timer0
 Enable Timer2
 Enable Interrupts
 Const idozites_a = 1
 Const Idozites_b = 255

 Timer0 = idozites_a
 Timer2 = idozites_b

 Do

 'ide jön a progi

 Loop


 A_freki:
    Timer0 = Idozites_a
   If Ntimer2 < 1 Then                                      'Csak Ntimer2 = 0 allat engedélyezzük
    Toggle Portd.5
   End If
'   Decr Ntimer0

 Return

 B_freki:
   Timer2 = Idozites_b
   Toggle Portd.6
   Decr Ntimer2
   If Ntimer2 > 900 Then Ntimer2 = 0
 Return
Igaz a pontos feladatot nem ismerem!
:wink:
Avatar
atari
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2009. október 28. szerda, 6:00

Hozzászólás Szerző: atari »

Köszi az ötletet :o , én is gondoltam erre, csak közben LCD-t kell vezérelnem, gombokat figyelnem... szóval nem akartam nagyon "húzni az időt".
A kapcsolást megcsináltam proteus-ban, de az nem realtime, a jövő héten összerakom deszkapanelen, akkor kiderül minden.
Az a feladat, hogy egy változó "A" freki (700hz-2khz) amikor 1-ben van, ráültessek egy "B" 30khz-es jelet. Nekem kell előállítani mindkét jelet, és a kiküldött "A" freki változással tudok vezérelni egy műszert.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Tisztázzuk a lehetőségeket!
Az M32-esben levő számlálók Timer0-2 8 Bitesek, Timer1 16 Bites.
Mivel 16 Biten tovább lehet számolni, mint 8 Biten ezért Timer1-est javasolnám a kisebb (lassabb) freki előállítására.

És ha 1 szálon kel a 2 frekit kiadni, akkor elég csak 1 kimenetet birizgálni mind a 2 megszakításban. Mindjárt nem is kel kívülről összekapuzni.
Avatar
atari
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2009. október 28. szerda, 6:00

Hozzászólás Szerző: atari »

Sziasztok!
Nos, idáig szenvedtem a dologgal. A cél a következő volt:

___III___III_____IIIII_____IIIII_____II__II__IIIIII_____IIIII_____

A fenti jelet kellett előállítanom az alábbiak alapján:

_ : változó freki ~100hz - 4kHz

I : fix, kb. 30kHz

A két megszakításos timeres megoldás nem jó, mert ha változtatom a TIMER1 időzítést, akkor a TIMER2 is változik valamelyest. A megoldás: a fix frekit hardveresen PWM-el álítom elő, a változó frekit pedig időzítővel:
Config Timer3 = Timer , Prescale = 1
On Timer3 A_freki
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1
Compare1a = 200
Compare1b = 200
Pwm1a = 100
Pwm1b = 125
Start Timer1
Start Timer3

do

ide jön a progi
a_idozit= változó érték

loop

A_freki:

Toggle Portc.0
Timer3 = A_idozit
Return

Úgy kb. ennyi a mag. :-) A két frekit kint összekapuzom és kész is a jel. :-)
Viszont egy másik gondom is lenne: poweroff-nál szeretném az LCD-t (háttérvilágításos) és a 4011-et is kikapcsolni. Nincs erre valami ötletetek? (Valami táp ic, amin van engedélyező bemenet)
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Hozzászólás Szerző: winnerbt »

Szia!
Nem tudom, mekkora a fogyasztásod illetve a betápod, de én anno egy 9V-os elemmel ellátott készülékben a köv. kapcsolást használtam egygombos be/kikapcsolásra. Az LP2981 Error kimenetét fel lehet használni low-batt. jelzésre is, ha kell (vagy vészmentésre, amikor elmegy az áram).
Kép

Kicsit kusza a kép, de lekapartam róla felesleget.
JAni
Avatar
havasi
DrótVégénSzéndarab
Hozzászólások: 38
Csatlakozott: 2010. szeptember 7. kedd, 6:00

Hozzászólás Szerző: havasi »

Szerintem egy tranzisztoros kapcsolóval lekapcsolhatod a tápot mindkettőről.
Avatar
atari
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2009. október 28. szerda, 6:00

Hozzászólás Szerző: atari »

Köszi a válaszokat, egyenlőre kísérletezek még, igazi, egyszerű megoldást nem találtam.

winnerbt: Az ötlet nagyon jó, -ha saját, akkor gratula hozzá- de ezt az ic-t nem tudom beszerezni (vagy drágán), adaptálni kell másikra (~300Ft)

havasi: A tranyós megoldás működik, csak az a bibi, hogy az 5V tápon esik 0,6V, ami így kevés az LCD vezérlőnek, össze-vissza mutat minden hülyeséget.

Az igazi megoldás FET-es lenne, vagy olyan stab ic, ami ki-be kapcsolható. Létezik ilyen, de a min. rendelés 200db (*320Ft)
Válasz küldése