Fórum Root.cz

Hlavní témata => Hardware => Téma založeno: Martin P. 23. 04. 2013, 20:19:10

Název: Ovládání větráčku pomocí LPT
Přispěvatel: Martin P. 23. 04. 2013, 20:19:10
Zdravím, dělám projekt na fyziku a potřebuju poradit, jak ovládat pomocí LPT portu rychlost větráčku (má dva dráty). Udělal jsem si jednoduchý program na ovládání pinů LPT portu, takže tohle není problém, umí to i rychlé pulzy. Problém je v tom, jak ovládat otáčky větráku pomocí 0 a 1. Zapojil jsem to přes tranzistor, ale při rychlých pulzech je větrák pomalý a nemá sílu, a když se pulzy ještě zrychlí, větrák se přestane točit úplně (? tranzistor nestíhá ?) Potřebuji teda poradit, jak ovládat otáčky pomocí 0 a 1 (stačí přibližně - pomalé, středně rychlé, rychlé a max)

Předem děkuji za odpověď
Martin
Název: Re:Ovládání rychlosti větráčku pomocí LPT portu
Přispěvatel: 3ugeene 23. 04. 2013, 20:46:47
ukaz schema a program.... nevim, v cem to pises, ale dostatecne rychly pulsy na LPT moc nejdou, takze se k nejaky PWModulaci asi nedostanes
Název: Re:Ovládání rychlosti větráčku pomocí LPT portu
Přispěvatel: Martin P. 23. 04. 2013, 20:59:22
Program je v C:
Kód: [Vybrat]
#include <sys/io.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

#define base 0x378

void perm(void) {
 if(ioperm(base,1,1)) {
  printf(" Nedostatecna prava!\n");
  exit(1);
 }
}
void wait_usec(int usec) {
 struct timeval tv;
 tv.tv_sec = 0;
 tv.tv_usec = usec;     
 select(0,NULL,NULL,NULL,&tv);
}

int main(int argc, char *argv[]) {
 int i;
 int cas;
 perm();
 
 if(atoi(argv[3]) == 0) {
  while(1) {
   outb(atoi(argv[2]), base);
   wait_usec(atoi(argv[4]));
   outb(atoi(argv[1]), base);
   wait_usec(atoi(argv[4])); 
  }
 } else {
  for(i=0;i<atoi(argv[3]);i=i+1) {
   outb(atoi(argv[2]), base);
   wait_usec(atoi(argv[4]));
   outb(atoi(argv[1]), base);
   wait_usec(atoi(argv[4]));
  }
 }
 exit(0);
}

Já vím, je to jedna velká prasárna, nikdy jsem v C nedělal, dal jsem to dohromady pomocí Google. Když se to připojí na reproduktor, tak to dělá i docela dost vysoké tóny. Schéma zapojení dodám, jen co ho nakreslím (eta 10 min)
Název: Re:Ovládání rychlosti větráčku pomocí LPT portu
Přispěvatel: 3ugeene 23. 04. 2013, 21:06:35
prasarna to sice je, ale melo by to jet :D Jaky hodnoty davas pro ten ctvrtej argument? ty mikrosekundy?


Název: Re:Ovládání rychlosti větráčku pomocí LPT portu
Přispěvatel: gamer 23. 04. 2013, 21:07:26
Potřebuješ PWM modulaci, frekvence řádově v kHz se dá na LPT udělat, což na větrák s přehledem stačí. Tady se můžeš inspirovat:
http://linuxgazette.net/issue97/pramode.html
Je to pro RT kernel, ale na normálním to taky bude fungovat, stačí použít nanosleep a pouštět to pod rootem. Bude to žrát 100% CPU, protože nanosleep dělá busy wait.
Název: Re:Ovládání rychlosti větráčku pomocí LPT portu
Přispěvatel: Martin P. 23. 04. 2013, 21:09:30
Minimum aby se to rozjelo (bez popostrčení) je 30000. A ono to hlavně jede, postavil jsem si na breadboardu čítače, dekodér a displej a ovládám přes to čísla :-)
Název: Re:Ovládání rychlosti větráčku pomocí LPT portu
Přispěvatel: Martin P. 23. 04. 2013, 21:10:47
Potřebuješ PWM modulaci, frekvence řádově v kHz se dá na LPT udělat, což na větrák s přehledem stačí. Tady se můžeš inspirovat:
http://linuxgazette.net/issue97/pramode.html
Je to pro RT kernel, ale na normálním to taky bude fungovat, stačí použít nanosleep a pouštět to pod rootem. Bude to žrát 100% CPU, protože nanosleep dělá busy wait.

Dal by se nějak upravit ten program, co jsem posílal? Jak říkám, v C vůbec neumím, umím jen v PHP, ale oni jsou si všechny jazyky docela podobný.
Název: Re:Ovládání rychlosti větráčku pomocí LPT portu
Přispěvatel: 3ugeene 23. 04. 2013, 21:13:56
urcite dal, ale v ccku nedelam... nicmene zkus jinou vec, pokud teda neni problem v elektronice:  ty tam mas jednotlivy casy mezi 1 a 0 stejny (u obou delayus) pwm takhle nefunguje, nybrz ma nejakej puls o delce T, jednicka je pak dlouha nejakou cast n a nula je pak dlouha T-n.


mrkni sem: http://lsd.spsejecna.net/web/beranek/I3B/Pe%C5%A1ekFilip_PWM.pdf na ty impulsy
Název: Re:Ovládání rychlosti větráčku pomocí LPT portu
Přispěvatel: gamer 23. 04. 2013, 21:17:12
Musíš měnit střídu těch pulzů, máš tam pořád 50%.
http://cs.wikipedia.org/wiki/Pulzn%C4%9B_%C5%A1%C3%AD%C5%99kov%C3%A1_modulace
A místo čekání selectem bych tam dal nanosleep, bude to přesnější.
Název: Re:Ovládání rychlosti větráčku pomocí LPT portu
Přispěvatel: Martin P. 23. 04. 2013, 21:17:46
Jooo už to asi začínám chápat :-) Takže vlastně tam mám regulovat jen délku té jedničky, jestli to chápu, noo, podívám se na to, stejně tyhle věci mám ve škole, tak dneska udělám program a zítra odpoledne to zkusím. Dík za radu :-)
Název: Re:Ovládání rychlosti větráčku pomocí LPT portu
Přispěvatel: 3ugeene 23. 04. 2013, 21:22:13
presne

 if(atoi(argv[3]) == 0) {
  while(1) {
   outb(atoi(argv[2]), base);
   wait_usec(atoi(argv[4]));
   outb(atoi(argv[1]), base);
   wait_usec(atoi(argv[4])); 
  }

tohle zmen na

 if(atoi(argv[3]) == 0) {
  while(1) {
   outb(atoi(argv[2]), base);
   wait_usec(atoi(argv[4]));
   outb(atoi(argv[1]), base);
   wait_usec(atoi(argv[5])); 
  }

a zkus pro zacatek blbnout s tema argv 4 a 5, cim bude jeden (u zapnutyho pinu) vetsi nez u vypnutyho, tim by se to melo tocit rychlejc

treba

 if(atoi(argv[3]) == 0) {
  while(1) {
   outb(255, 0x378);
   wait_usec(20);
   outb(0, 0x378);
   wait_usec(1); 
  }

a


 if(atoi(argv[3]) == 0) {
  while(1) {
   outb(255, 0x378);
   wait_usec(10);
   outb(0, 0x378);
   wait_usec(20); 
  }

je pak pomalejsi verze



ty cisla u wait_usec jsem tam placnul, chce to zkusit
Název: Re:Ovládání rychlosti větráčku pomocí LPT portu
Přispěvatel: Martin P. 23. 04. 2013, 21:24:48
Jo, já teď předělávám na nanosleep a zítra večer se ozvu, až to zkusím ve škole.
Název: Re:Ovládání rychlosti větráčku pomocí LPT portu
Přispěvatel: 3ugeene 23. 04. 2013, 21:26:58
jasny, zaklad mas, treba na to prijdes :)

jinak pro zacatek doporucuju nejakej uber zakladni program, co obsahuje jen smycku a tam se vyblbnes

  while(1) {
   outb(255, 0x378);
   wait_usec(20);
   outb(0, 0x378);
   wait_usec(1); 
  }

tahle smycka stridave vypina a zapina vsechny piny 2-1O (pokud me pamet neklame), takze staci fakt blbnout s tema wait hodnotama