Portál AbcLinuxu, 28. března 2024 10:25

Řízení otáček větráku dle teploty

3.5.2005 13:34 | Přečteno: 3929× | Linux

Toto je zápis ze soudku "abych to našel až to zase někdy budu potřebovat" ovšem mohl by i někomu pomoct. Nenašel jsem soft, který by uměl automaticky řídit otáčky ventilátoru na chladiči procesoru proto jsem si jeden primitívní narychlo sesmolil. Předpokládá se, že už máte rozchozené čtení teploty ze senzorů a PWM. Původně jsem chtěl udělat nějakou PID regulaci nebo alespoň lineární aproximaci mezi několika body. Na zkoušku jsem ale udělal pouze 4 intervaly ve kterých má větráček konstantní otáčky a stalo se to nejhorší co se stát mohlo: funguje to bezvadně. Takže žádný PID už nebude...
Musíte si sami experimentálně zjistit a doplnit mezní teploty a hodnoty PWM (hint: PWM se dá i číst). Konstanty pwm a tmp se taktéž můžou různit. Po zavedení správného modulu pro senzory na to snadno prozkoumáním sys FS přijdete. Tyto platí pro desku MSI K7N Plat (AMD64). Na závěr: Ja VÍM že to je prasácky napsané takže mi už to nemusíte do diskuze psát ;-)
#include 
#include 
#include 
#include 

FILE *f; 

char buf[1024];

const char *pwm = "/sys/bus/i2c/devices/0-0290/pwm2";
const char *tmp = "/sys/bus/i2c/devices/0-0290/temp2_input";

void obsluha_signalu(int sig) {
	
	#ifdef DEBUG
		printf("Signal %d\n",sig);
	#endif
	
	FILE *f = fopen(pwm,"w+");
	if (!f) {
	#ifdef DEBUG
		printf("Can't open %s\n",tmp);
	#endif
		exit(1);
	}
	fprintf(f,"240");
	fclose(f);
	exit(0);
}


int main() {

	signal(SIGINT,obsluha_signalu);
	signal(SIGTERM,obsluha_signalu);
	signal(SIGQUIT,obsluha_signalu);

	while(1) {

	f =  fopen(tmp,"r");

	if (!f) {
	#ifdef DEBUG
		printf("Can't open /%s\n",tmp);
	#endif
		return 1;
	} 
	
	fread(buf,1,1024,f);
	
	int temp = atoi(buf)/1000;
	
	#ifdef DEBUG
	    printf("Readed %s temperature: %dC\n",buf,temp);
	#endif
	
	fclose(f);

	FILE *f = fopen(pwm,"w+");
	
	if (!f) {
	    #ifdef DEBUG
		printf("Can't open %s\n",pwm);
	    #endif
	    return 1;
	}

	if (temp<40) {
		fprintf(f,"100");
		#ifdef DEBUG
		    printf("PWM set to 100\n");
		#endif
	} else 	if (temp<50) {
		fprintf(f,"150");
		#ifdef DEBUG
		    printf("PWM set to 150\n");
		#endif
	} else if (temp<60) {
		fprintf(f,"200");
		#ifdef DEBUG
		    printf("PWM set to 200\n");
		#endif
	} else {
		fprintf(f,"240");
		#ifdef DEBUG
		    printf("PWM set to 240\n");
		#endif
	}

	fclose(f);

	sleep(1);


	}

	return 0;

}

 
       

Hodnocení: -

zatím nehodnoceno
        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

3.5.2005 13:49 Michal Čihař | skóre: 61 | blog: Bláboly | Praha
Rozbalit Rozbalit vše -
Odpovědět | Sbalit | Link | Blokovat | Admin
To už jsem někde viděl :-)
Weblate - překládání přes web | Gammu SMSD - posílání SMS | Blog
3.5.2005 16:39 miho | skóre: 24 | blog: Mihovy_sochory | Orlová
Rozbalit Rozbalit vše Re: -
Nejak se to odtamtud neda stahnout. Jinak pripadna podoba je cite nahodna :-)
3.5.2005 14:04 johniez | skóre: 17 | blog: xyz | Praha
Rozbalit Rozbalit vše improvement
Odpovědět | Sbalit | Link | Blokovat | Admin
Co tohle:
	if (temp<40) {
		fprintf(f,"100");
		#ifdef DEBUG
		    printf("PWM set to 100\n");
		#endif
	} else 	if (temp<50) {
		fprintf(f,"150");
		#ifdef DEBUG
		    printf("PWM set to 150\n");
		#endif
	} else if (temp<60) {
		fprintf(f,"200");
		#ifdef DEBUG
		    printf("PWM set to 200\n");
		#endif
	} else {
		fprintf(f,"240");
		#ifdef DEBUG
		    printf("PWM set to 240\n");
		#endif
	}
napsat nejak takhle:
	if (temp<40) {
		hodnota=100;
	} else 	if (temp<50) {
		hodnota=150;
	} else if (temp<60) {
		hodnota=200;
	} else {
		hodnota=240;
	}
	fprintf(f,hodnota);
	#ifdef DEBUG
	    printf("PWM set to %d\n", hodnota);
	#endif
vogo avatar 3.5.2005 14:58 vogo | skóre: 34 | blog: "Skládat papír"
Rozbalit Rozbalit vše ale....
Odpovědět | Sbalit | Link | Blokovat | Admin
ma to jeden hacek, vetsinou se snizovani otacek provadi pulzne, coz velmi zatezuje napajeci cast desky, proto muze dojit k jejimu predcasnemu "odumreni", takze si zjistete jak na to vase deska jde, jestli ji mate aspon trosku radi ;)
Nejsem paranoidní, ale to ještě neznamená, že po mě nejdou.
3.5.2005 16:45 miho | skóre: 24 | blog: Mihovy_sochory | Orlová
Rozbalit Rozbalit vše Re: ale....
Pulzne sirkovou modulaci (PWM) se ridi otacky snad vsech desek. Nechapu ale proc by to melo zpusobovat problemy. Ty 2-3W IMO nemuze delat problemy kdyz procesor skube odberem klidne o 90W.

Nehlede k tomu, ze k 90% desek se dodava soft (pro WIN), ktery provadi totez.
3.5.2005 17:21 Libor Klepac | skóre: 45 | Mýto
Rozbalit Rozbalit vše az nekdy
Odpovědět | Sbalit | Link | Blokovat | Admin
super, jestli mi nekdy bude fungovat pwm, tak to pouziju (soubor pwm mam, ale zapis hodnoty nic nedela ;-)

sice uz ted jedu na 1600RPM, ale ten chladic by mel snest i min
Urine should only be green if you're Mr. Spock.
Luk avatar 3.5.2005 17:43 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše "Prasácky napsané..."
Odpovědět | Sbalit | Link | Blokovat | Admin
Nedá mi to, abych si nerýpl :-D Už jsem dlouho neviděl, aby byly v programu názvy funkcí česky a vypisované zprávy anglicky :-):-):-)
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.