Folyamatos frekvencia generálás [Ti hogyan csinálnátok?]
Folyamatos frekvencia generálás [Ti hogyan csinálnátok?]
Sziasztok,
Arra keresem az ötleteket, hogyan lehet AVR-en olyan négyszög frekvenciákat generálni 10Hz ... 100Hz között aminek a kitöltési tényezője 1us ... 10ms között folyamatosan us-ként is állítható legyen.
Hogyan kell ilyet ügyesen csinálni?
Köszi,
_flex.
Arra keresem az ötleteket, hogyan lehet AVR-en olyan négyszög frekvenciákat generálni 10Hz ... 100Hz között aminek a kitöltési tényezője 1us ... 10ms között folyamatosan us-ként is állítható legyen.
Hogyan kell ilyet ügyesen csinálni?
Köszi,
_flex.
Milyen típussal?
Ha van 16-bites Timer-ed, akkor pl.
8MHz Clk /1024 prescale =>0.12Hz-7612Hz Timer INT beállítható.
Ez eddig rendben, a 10-100Hz-hez tartozó Timer értéket vagy kiszámolod a programban vagy tábla (attól függ, milyen felbontás kell).
A megszakításrutinban meg:
Set kimenet
várakozás (For-Next üres ciklus vagy más)
Reset kimenet
Return
(mivel a Waitus nem fogad el változót, ezért magadnak kell megcsinálni)
Egyszer ki kell mérni, hogy egy ciklus mennyi uSEC.
Az impulzusszélesség is lehet egy másik Timer, amit indítasz/leállítasz, de ott figyelni kell, hogy ne legyen glitch-es, tehát így hírtelen szimmetrikus PWM-re állítanám be.
Csak nem RC servo vezérlés lesz?
JAni
08:18
Ha van 16-bites Timer-ed, akkor pl.
8MHz Clk /1024 prescale =>0.12Hz-7612Hz Timer INT beállítható.
Ez eddig rendben, a 10-100Hz-hez tartozó Timer értéket vagy kiszámolod a programban vagy tábla (attól függ, milyen felbontás kell).
A megszakításrutinban meg:
Set kimenet
várakozás (For-Next üres ciklus vagy más)
Reset kimenet
Return
(mivel a Waitus nem fogad el változót, ezért magadnak kell megcsinálni)
Egyszer ki kell mérni, hogy egy ciklus mennyi uSEC.
Az impulzusszélesség is lehet egy másik Timer, amit indítasz/leállítasz, de ott figyelni kell, hogy ne legyen glitch-es, tehát így hírtelen szimmetrikus PWM-re állítanám be.
Csak nem RC servo vezérlés lesz?
JAni
08:18
Sziasztok,
ATMEGA128 a platform C-ben.
Azt mondjátok, hogy az 1 jó megoldás lenne:
veszek 1 timer-t, amivel megoldom a 10...100Hz-es megszakításokat, majd a megszakításkezelőben lévő ciklusban készítem négyszögjelet.
Azaz, hogy 16MHz-es órajelnél 1us-hoz 16 utasításnyi időt várok,
1ms-hoz pedig 16000-et.
Így gondoljátok? Esetleg más ötlet?
Sziasztok,
_flex.
ATMEGA128 a platform C-ben.
Azt mondjátok, hogy az 1 jó megoldás lenne:
veszek 1 timer-t, amivel megoldom a 10...100Hz-es megszakításokat, majd a megszakításkezelőben lévő ciklusban készítem négyszögjelet.
Azaz, hogy 16MHz-es órajelnél 1us-hoz 16 utasításnyi időt várok,
1ms-hoz pedig 16000-et.
Így gondoljátok? Esetleg más ötlet?
Sziasztok,
_flex.
Még 1x a kérdés:
- milyen pontosság kell?
waitus is lehet pontos!
waitms is
minél magasabb az órajel, annál pontosabban állíthatod....
Timerrel a frekvenciát, ill a kitöltest a következővel állíthatod - ha precíz kell.
Delay/wait segítségével a pontatlanság bejátszhat....
Igaz nem az ez első projekted?:)
- milyen pontosság kell?
waitus is lehet pontos!
waitms is
minél magasabb az órajel, annál pontosabban állíthatod....
Timerrel a frekvenciát, ill a kitöltest a következővel állíthatod - ha precíz kell.
Delay/wait segítségével a pontatlanság bejátszhat....
Igaz nem az ez első projekted?:)
Legyen 1us a pontosság.
C-ben kellene.
Miért fontos, hogy hányadik projekt?
Ez így jó gondolkodás 1s-ra???
--- CUT ---
--- CUT ---
C-ben kellene.
Miért fontos, hogy hányadik projekt?
Ez így jó gondolkodás 1s-ra???
--- CUT ---
Kód: Egész kijelölése
{
[b]// 1s[/b]
int i;
for ( i = 0; i < 1000; i++ ) {
[b]// 1ms[/b]
int i;
for ( i = 0; i < 1000; i++ ) {
[b]// 1us on 16Mhz[/b]
asm volatile(
"nop\n\t"
"nop\n\t"
"nop\n\t"
"nop\n\t"
"nop\n\t"
"nop\n\t"
"nop\n\t"
"nop\n\t"
"nop\n\t"
"nop\n\t"
"nop\n\t"
"nop\n\t"
"nop\n\t"
"nop\n\t"
"nop\n\t"
"nop\n\t"
::
);
}
}
}
Nem jó.
És hogy állítod a belső változtatást?
Na ez is érdekes program lett 
És hogy állítod a belső változtatást?
Kód: Egész kijelölése
Set port valami = H
for ( i = 0; i < 1234; i++ ) {
asm volatile(
"nop\n\t"
::
);
}
set port=L
for ( i = 0; i < 1111; i++ ) {
asm volatile(
"nop\n\t"
::
);
}
mars az elejere :)
Egyik rosszabb, mint a másik!
Az első prog-ban 2 egymásba ágyazót For ciklusnak nem lehet ugyanaz az index változója!
A Másodiknál nem maradt idő a változtatásra!
(Feltétel volt, hogy folyamatosan változó jel kel, us pontossággal!)
Én először egy vezérelhető LED villogtatót készítenék 10 – 100Hz-ig!
Igaz 50Hz felett már nem látjuk. Inkább legyen vezérelhető hang generátor!

Az első prog-ban 2 egymásba ágyazót For ciklusnak nem lehet ugyanaz az index változója!
A Másodiknál nem maradt idő a változtatásra!
(Feltétel volt, hogy folyamatosan változó jel kel, us pontossággal!)
Én először egy vezérelhető LED villogtatót készítenék 10 – 100Hz-ig!
Igaz 50Hz felett már nem látjuk. Inkább legyen vezérelhető hang generátor!
Szerintem ez így jó, mert mindegyik lokális változó a zárójeleken belül. Nincs ezzel más gond, mint az, hogy nem szép... bár nekem tetszik. 
De ne térjünk el a tárgytól!
Még mindig érdekel, hogy milyen ötletekkel lehetne ezt a legszebben és leguniverzálisabban megcsinálni!
Azaz itt vannak ezek a ciklusok vagy asm nop-okkal vagy akár _delay_us( 1 );-el várakoztatva a pontos időre. De nem szép dolog pár ms-ig benn ragadni 1 megszakítás rutinba, csak azért, hogy várjuk az impulzus végét.
Valaki felvetette a léptető motorokat. Azokat hogyan vezérlik? Le tudja ezt valaki röviden írni? vagy link esetleg?
Kód: Egész kijelölése
{ int i=1;
.
. itt i=1
.
{ int i=2;
.
. itt i=2
.
{ int i=3;
.
. itt i pedig 3
.
}
}
}
Még mindig érdekel, hogy milyen ötletekkel lehetne ezt a legszebben és leguniverzálisabban megcsinálni!
Azaz itt vannak ezek a ciklusok vagy asm nop-okkal vagy akár _delay_us( 1 );-el várakoztatva a pontos időre. De nem szép dolog pár ms-ig benn ragadni 1 megszakítás rutinba, csak azért, hogy várjuk az impulzus végét.
Valaki felvetette a léptető motorokat. Azokat hogyan vezérlik? Le tudja ezt valaki röviden írni? vagy link esetleg?
