Fórum Root.cz
Hlavní témata => Hardware => Téma založeno: 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
-
ukaz schema a program.... nevim, v cem to pises, ale dostatecne rychly pulsy na LPT moc nejdou, takze se k nejaky PWModulaci asi nedostanes
-
Program je v C:
#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)
-
prasarna to sice je, ale melo by to jet :D Jaky hodnoty davas pro ten ctvrtej argument? ty mikrosekundy?
-
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.
-
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 :-)
-
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ý.
-
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
-
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ší.
-
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 :-)
-
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
-
Jo, já teď předělávám na nanosleep a zítra večer se ozvu, až to zkusím ve škole.
-
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