Folyamatos frekvencia generálás [Ti hogyan csinálnátok?]

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
flex
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2011. április 17. vasárnap, 6:00

Folyamatos frekvencia generálás [Ti hogyan csinálnátok?]

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

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.
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 »

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
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Flex: Milyen elképzelésed van? Kész kódot úgyse tud senki adni, mert nem ismertek a követelméyek: milyen pontosság? Milyen beállíthatóság? Milyen sűrű változtathatóság?

Valami kód/ötlet kialakult a fejedben?

Winnerbt: Waitus : Bascom 2.0.0.0 óra változót is elfogad paraméterként:)
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 »

:)
Nem olvastam tovább :
The number of microseconds to wait. (1-65535)
This must be a constant. Not a variable!
- itt mentem kávéért :)
In version 1.12.x.x and higher you can use a variable as well.

Akkor mégegyszerűbb.

JAni
09:14
Avatar
flex
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2011. április 17. vasárnap, 6:00

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

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.
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 »

Pontosan. Csak a frekihez mindenképp 16-bites timer kell, és mondjuk Attiny-ban nincs, azért kérdeztem a típust.
JAni
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Én még annyit hozzátennék, hogy ilyen rövid időzítések beállításához inkább valami 20MHz-re képes proci kellene!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

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?:)
Avatar
flex
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2011. április 17. vasárnap, 6:00

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

Legyen 1us a pontosság.

C-ben kellene.

Miért fontos, hogy hányadik projekt? :wink:

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"
	    ::
      );
	  
    }
  	
  }

}
--- CUT ---
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Nem !!!
Amíg a ciklusban vagy addig semmi mást nem tudsz csinálni!
Nehéz témát választottál! Ezért ha ez az első projected, akkor nem fog összejönni neked egyhamar!
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 »

Megy ez, csak az eredeti feladatban nincs kihasználva a 100% PWM, tehát
mindig lesz másra ideje. 100Hz-es jelnél is 100usec impulzusnál 1/100-ad a foglalt idő, a többi szabad.
JAni
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 »

jaj, elnéztem! Hamu to fejre!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Nem jó.
É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 :)
Na ez is érdekes program lett :)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

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!

:wink:
Avatar
flex
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2011. április 17. vasárnap, 6:00

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

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. ;-)

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
      .
    }
  }
}
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?
Válasz küldése