Kuivausrummun lämpötilansäätö

Mulla on tuollanen järeämpi Mielen kuivausrumpu joka nykyinen ohjauslogiikka on mulle vähän riittämätön. Siinä on vain tehon säädölle 2 eri asetusta, joka mielestäni kytkee vastuspakasta osan käyttöön puoliteholla ja kaikki vastukset täydellä teholla, ei mitään lämpötila kontrollia. Ja kuivausaikakin on vain kelloaika.

Ajatuksena oli muuttaa kuivauksen kesto poistoilman kosteudesta mitattavaksi, eli kun tarpeeksi kuivaa niin voi vetää jäähdytyssykliin ja lopetella kuivauksen.

Mutta tuo lämpötila… onkohan siellä nyt 18kw yhteensä vastuksia, jotka aattelin että pilkkoisi pieniin ryhmiin. Näitä pitäisi sitten Arduinolla releillä ohjata päälle ja pois. Tarvetta on saada matalanlämmön kuivausta myös. Nyt vaan ei ole mitään hajua miten tuon fiksuiten toteuttaa.

Yhdelle lämmölle tuon varmaan voisi pistää niin että kokeilemalla hakee arvot ja sitten jos on ennalta asetetun arvon verrran poikkeamaa asetuslämpötilasta niin lisää tai poistaa vastuksia käytöstä. Ongelma on vaan että tuo ei sitten toimi vaikka jossain korkeammassa lämmössä koska tarvii pelkkään lämmön ylläpitoon enemmän tehoa.

Tuleeko jollekkin joku fiksu tapa ohjata isoa vastuspakkaa eri lämpötiloissa niin että se pysyisi kohtuu hyvin toivotussa lämpötilassa. Sisääntulevan ilmankin lämpötila vaihtelee, tarkoitus on poistoilma ohjata lämmönvaihtimen kautta jota kautta tulee sitten myös kuiva ilma sisään koneeseen.

EDIT: jonkinlainen PID?

Usein tämmöiset lämmitysratkaisut hoidetaan ihan vain “bang-bang” säädöllä, jossa koko lämmityselementtiä ohjataan päälle tai pois mitatun lämpötilan ja ohjearvosta sallitun poikkeaman mukaan. Helppo ja ajaa lämpötilan nopeiten asetettuun arvoon, joskin lämpötilaan tulee pakostikkin hieman ylitystä. Sama säätömalli on käytössä yleensä lämpöpattereissa ja saunan kiukaissa.

PID:llä tarvitsisit joko mahdollisuuden ajaa portaattomasti tehoa vastuksiin tai digitaalisen ratkaisun, jossa vastukset ovat eri kokoisissa ryhmissä säädettävissä. Tällöin tosin taas pienimpien ryhmien releet napsuvat helposti vähän liikaakin ja viritelmä ei kestä.

Lähtiin varmaan hyvin yksinkertaisesta ratkaisusta liikkeelle, eli vastuksien eteen rele/tjsp ja bang-bangillä lämpötila haluttuun haarukkaan ja kosteusmittauksesta katkaisu lämmitykseen.

Kyllä hieman hienostuneempikin ratkaisu on mahdollinen, ei ole pakko tyytyä noin yksioikoiseen säätömalliin. Muokataan vaan vähän muutamaa perusoletusta ja edetään siitä:

  • tyypillisesti reaalimaailman lämmitettävien juttujen termiset aikavakiot on niin pitkiä, ettei maksa vaivaa ajaa vastuksia osateholla, vaan voidaan hyvin pulssittaa täyttä tehoa päälle ja pois kuten Depili toteaa.
    Tähän voidaan oikein hyvin yhdistää myös mikä tahansa säätöalgoritmi - vaikkapa PID - kun vaan laitetaan säätäjän toimisuure ohjamaan sopivaa modulaattoria joka sitten hoitaa tuon bang-bang pulssinleveyssäädön.
    Tämmöisessä skenaariossa tulee niin paljon kytkentäjaksoja, että mekaanista relettä ei missään tapauksessa ole syytä käyttää, vaan ilman muuta puolijohderelettä ja mielellään nollapistekytkevää. Eipä ole kauaakaan kun tein juurikin tuollaisen modulaattorin ja tehoasteen pleksintaivutuskoneeseen. Tehoa oli kytkemässä triac DTA40 ja ohjaus tuli Atmelin ATMega 328:lta (sama joka on Arduino Unossa). Galvaaninen erotus oli MOC3061-optotriacilla jolla sai samalla nollapistekytkennän lahjaksi.
    Tämmöisessä systeemissä PID toimii oikein hyvin, joskin se on herkkä kohdesysteemin dynamiikan muutoksille systeemin toimintapisteen muutuessa lämpötilan mukaan. Tarkoitan tällä sitä, että optimaaliset PID-parametrit on eri silloin kun säädettävä kohde on kylmä ja lämpö nousee nopeasti tehon funktions vs. silloin kun ollaan lähellä lämmitimen maksimikapasiteettia ja lämpötila muuttuu paljon loivemmin tehon funktiona. Tähän auttaa PID-säädöllä parhaiten se, että toteutetaan säädin sumeana jolloin viritysparametreja vaihdetaan toimintapisteen mukaan.
    P.S. systeemin terminen hitaus on myös merkitävä tekijä. Jos paahdetaan täydellä teholla kunnes ohjearvo on saavutettu, niin on ihan tuurissaan mihin päädytään kun lämmityselementteihin kehittynyt lämpöenergia purkautuu kohteeseen. Kokemusta on SMD-juotosuunin virityksestä jossa tällä konstilla saa helposti parinsadan asteen ylityksen aikaan

18kw kokoajan päälle pois on hankala. Jos toisaalta tehoksi riittäisi vaikka vian 10kw. Eli mielummin pistäisi ns riittävän määrän peruslämpöön vastuksia ja sitten sen tarvittavaa määrää vain ohjaisi pois/päälle.

Mulla ei ole kuitenkaan kuin vain 3x35A syöttö ja tuo aiheuttaa jo itsesään aika kovan kuorman verkkoon. Mieluusti siis täysteho vain silloin kun se on tarpeellista (=viileä syöttöilma ja suuri pyyntilämpö).

Ja juu, mekaaniset releet olisi tuossa lyhytikäisiä :slight_smile:

Sen verran tehokas on muuten puhallin, että veikkaisin että vastuspakka luovuttaa aika nopeasti lämpönsä. On myös rakenteellisesti sellainen (ja hyvin kevyt, massaa ei paljon ole). Voisin ottaa kuvaa tuossa jossain kohtaa.

Lämmönvaihtimista ei ole juuri kokemusta, mutta olettaisin että jos ilmavirta pysyy about vakiona sekä ulospuhallettava ilma myös about samanlämpöisenä niin olettaen että ulkoaimettäväkään ilma ei juuri muutu (ei se varmaan hirveästi muutu ohjelman ajon aikana, mutta eri päivinä toki) niin lämmönvaihtimelta koneelle tuleva ilmakin pysyisi suurinpiirtein samanlämpöisenä.

Pitäähän koko käytetävissä oleva teho pystyä kytkemään päälle ja pois, Muuten sen olemassaolosta ei ole mitään iloa. Puhdas vastuskuorma ei myöskään aiheuta mitään epämiellyttäviä loisteho- tai kytkentäpiikki-ilmiöitä joten senkään puolesta ei ole väliä.
Osatehoilla, mikäli ylempänä mainitsemani modulaattori on tehty fiksusti, ei ole juuri eroa kytketäänkö koko kuormaa vai osaa kuormasta. “Fiksun” voi tehdä monella tapaa - yksi on esim jakaa sekunti sataan puoliaaltoon ja ohjata nollapistekytkevällä triacilla tms puoliaallon tarkkuudella jolloin toimisuureen resoluutio on 1%. Lämmityskäytössä tämä tarkkuus riittää enemmän kuin hyvin. Tällöin pwm-jaksonaika on 1 sekunti ja pienin inkrementti 10 ms.

Mutta jos tämmöinen ei mitenkään kelpaa, niin voihan modulaattorin tehdä kumuloivana siten, että se moduloi lämpövastuksia progressiivisesti. Pienillä tehoilla yhtä, ja kun toimisuure pyytää enemmän tehoa kuin tästä ekasta vastuksesta lähtee, niin jätetään se täysille ja aletaan moduloimaan seuraavaa jne jne kunnes kaikki on päällä. Ei tuossa isoa eroa ole; hetkellinen kytkentäteho on pienempi (kokonaisteho on sama), ja tarvitaan enemmän tehoreleitä tai triaceja.Modulaattori on marginaalisesti mutkikkaampi mutta ero on käytännössä merkityksetön.

Joo siis koko kuormaa pitää pystyä kytkemään kyllä, silloin kun sille oin oikeasti tarvetta. Mutta ei ole järkeä kytkeä pois ja päälle 18kw tehoa jos esim 4kw jatkuvalla ja 1kw kytkettävällä pääsisi samaan tulokseen. Eli tarkoitan että olisi jatkuvaa tehoa päälle sen verran kun on tarpeen (hieman alle vaadittavan pyynnin) ja kytketään sitten vain tarvittavaa lisävastusta. Mulla on aika iso määrä erilaista järeetä resistiivistäkuormaa (myös moottorikuormia jotka on sitten ongelmallisempia) ja ongelmaksi tulee niiden samanaikainen käyttö jos turhaan jotain järeätä ajetaan välillä täydellä teholla. 2kpl 18kw koneita aiheuttaa jo 36kw:n kuorman verkkoon samanaikaisesti vs jos molempia pystyisi ajaan vaikka 8kw + 2kw kytkettävänä jolloin olisi maksimissaan 20kw verkossa.

Valtaosan käyttökerroista koneet eivät tarvi täyttä tehoa käytötönsä. Kuivurissa esim pääsääntöisesti kuivataan sellaisia tekstiilejä jotka eivät kestä kovinkaan kuumia lämpöjä. Tämä oikeastaan pääsyy koko ohjauslogiikan uudelleen suunnitteluun. Lisäksi tuossa on varmaan tulossa 18-25kw keittopataa yms joissa sama tilanne että tulen todennäköisesti normaalikäyttöön pudottamaan huomattavasti tehoja. Järeemmät pääsulakkeet tulee nekin aika kalliiksi ja osa kaapeleloinneista rakennuksiin pitäisi tehdä uusiksi.

Sen verran kun tästä ymmärrän (elektroniikka opiskeluista on jo 15vuotta) tämä kuulostaa järkevältä.

Pystytkö avaan vähän lisää miten tuo käytännössä toteutetaan :slight_smile:

EDIT: varmaan silti tulee kolme eri piiriä ohjattavaksi. Jokaiselle vaiheelle omansa. Nyt en ole tarkastanut kytkentää miten vastukset ovat, mutta olettaisin että ne on kytketty vastusten välille 400v jännitteelle.

Kuorman teho ja sitä kautta verkon näkemä (häviö)teho on aina tehollinen suure johon vaikuttaa päällä- ja poissaoloaikojen välinen keskinäinen suhde. Jos kytkentäjakso on pitkä, ehtii systeemi saavuttamaan loppulämpötilansa mutta ei jos jakso on tarpeksi lyhyt. Tämä pätee sekä hyötytehoon että häviöihin. Jos siis 18kW kuormaa ajetaan 50% pulssisuhteella ja huomattavasti kuorman termistä aikavakiota lyhyemmällä jaksonajalla, siihen kehittyy keskimäärin 9 kW pätöteho. Sama pätee häviöihin, eli kaapelit yms kuumenevat puolella häviöteholla. Tässä mielessä ei ole väliä kytketkö koko tehoa vai onko osa päällä koko ajan.
Huomaa, että johdonsuojat ja sulakkeet toimivat ihan samalla tavalla. Esimerkki: jos 20A sulakkeen takana on kaksi kuormaa jotka molemmat ottavat verkkoon kytkettynä 20A, niin voit ongelmitta ajaa niitä samaan aikaan 50% pulssisuhteella kunhan pwm-jakso vaan on riittävän lyhyt. Tällöin huippuvirta on 40A mutta tehollinen virta vain 20A ja se niitä johtoja kuumentaa ja sulakkeita kuormittaa.

Mutta homman siis voi toki hoitaa ohjaamalla lämmitysvastuksia kumulatiivisestikin kuten edellä kirjoitin.
Kolmivaihekuorman voi kytkeä joko tähteen tai kolmioon. Tähteen kytketty toimii pitkälle samoin kuin 3 erillistä 1-vaihekuormaa ja niitä voi ohjata juuri sellaisina. Kolmioon kytketty vaatii pikkasen erilaisen kytkennän mutta sama periaate toimii.
Lämmitystä ohjaamaan tarvitaan yksinkertainen säätäjä. Klassisesti tämmöisessä on muutama eri toiminto suunnilleen näin:

  • jonkinlainen käyttöliittymä tai ohjausrajapinta, jonka kautta asetetaan haluttu lämpötila (ohjearvo) ja käsketään systeemi päälle ja pois
  • lämpötilan mittaus ja skaalaus jolla muodostetaan mitatu lämpötilalukema (oloarvo)
  • lämpötilan säätäjä joka ottaa vastaan ohjearvon ja oloarvon, sekä laskee näistä toimisuureen jollain sopivalla algoritmilla kuten vaikka PID.
  • toimisuureen muokkaus sopivaksi lämmittimen ohjaukseksi. Tässä se olisi juurikin tuo pwm-modulaattori joka muodostaa liipaisusignaalit puolijohdereleílle
  • Lämmittimen tehopiiri eli ne puolijohdereleet tai triacit tms.

“Helpoin” tapa on varmaan napata hyllystä lähin Arduino ja tehdä koko säätöhomma sillä. Sen lisäksi tarvitaan galvaaninen erotus tehopiiristä, ja ne tehokytkimet. Itse olen siis tosiaan käyttänyt tuohon MOC3061 nollapistekytkevää optotriacia ja BTA40-tehotriacia jonka jatkuva virta on max 40A. Voin pistää piirikaavion jonnekin jos kiinnostaa, tossa nyt yksi kuva yksivaiheisesta ohjaimesta jonka tein taannoin: https://www.dropbox.com/sc/j41ixju9c4ryzin/AABWIF9nIj8nJh8bs2hrDOtla

Ardulla tehty modulaattori on sikäli helppo jos käyttää tuota MOC3061:tä että sitä ei tarvitse synkata mihinkään. sekunnin ajastus toimii mainiosti ja opto hoitaa nollapistekytkennän. Synytvä kytkentäjitteri ei meinaa mitään koska säätäjä kompensoi sen helposti pois.

Juu tämä ilmanmuuta näin. En ehkä ymmärtänyt sinua aikaisemmin, tarkoitin että esim en halua 10 sekuntin sykleissä kytkeä koko massaa päälle/pois (miten kaikkein yleisin termostaatti toimii ja kuten se tällä hetkellä toimii). Mutta jos vastuksia ajetaan järkevällä PWM jaksolla niin asiahan on hyvin.

Ja kiitoksia selvennöksestä, vaikuttaa järkevältä. Täytyy tosiaan mietti tuo kolmio kytkentä, just ny ei aivot pelaa sitä miettimään. Tähti on nyt ainakin mielessä paljon selkeämpi.

Täytyy nyt tutkia miten tuon PWM ohjauksen sitten toteuttaisin. Pitää kaivella erilaisia esimerkkikoodeja tuosta aiheesta.

Niin ja kyllä piirikaavio kiinnostaa.

Tää taitaa olla aikalähellä oikeanlaista?
http://www.bristolwatch.com/arduino/arduino1.htm

Lähellä mutta ei kannata tehdä ihan noin. Tuo on joku vaihetta leikkaava kytkentä joka aiheuttaa aivan turhia (ja tosi ikäviä) häiriöitä verkkoon. Kun ei ole tarvetta niin ei kannata tehdä noin, vaan nollapistekytkennällä jolloin teho kytkeytyy hiljaisesti ja siististi saastuttamatta verkkoa kovilla dv/dt -piikeillä.
Turha siis ollenkaan detektoida verkon nollakohtia kun ei tarvitse. Ja korvaat sen triacin opton MOC3061:llä jossa on nollakohdan tunnistus sisäänrakennettu. Toimii paljon paremmin ja mittaa ilman vaihesiirtoja ja galvaanisen erotuksen haasteita. Sen perään vaan kunnollinen triac niin homma on siinä.
Laitan piirikaavion myöhään tänään tai huomenaamulla, olen nyt labilla kurssilla.

1 Like

Tässä lupaamani piirikaavio: https://www.dropbox.com/s/ot5wign4fzllz6n/Lämmittimen_ohjaus.pdf?dl=0
Siinä on muutakin mitä ei nyt tähän hommaan tarvita. Oleellista kuitenkin, että laite on tehty samalla 328P -prosessorilla joka on normi Ardussa joten ohjauksen voi tehdä ardulla myös ihan samaan tyyliin.
Tehonohjaus tapahtuu GPIO-pinnistä D0(30). Pikku fetillä ajetaan optotriacia MOC3061 jonka toisiopuoli taas ohjaa tehotriacia BTA40. Optotriaciin on sisäänrakennettu nollapistekytkentä jolloin sitä ei tarvitse olla ollenkaan ohjausohjelmassa.
Tehotriacin navat on ehdottomasti kytkettävä kuten kuvassa näkyy jotta hilan ohjausvirran napaisuus menee oikein. Puhtaalla vastuskuormalla snubberia C1/R12 ei tarvita mutta induktiivisella kuormalla se on syytä olla.
Hilavirran rajoitusvastusten R10, R11 tehonkesto vähintään 0,5 W.




Onko sun kaaviossa R13 se itse lämpövastus vai onko se kanssa joku sarjassa?

Mutta joo, tuo nyt on semiselkeä itselle vaikka tämä nollapistekytkentä ei oikein aukeakkaan.

Ei sulla olis heittää vielä jotain esimerkkikoodia miten tuota nyt olet ohjannut?

Joo tosiaan, R13 on varsinainen kuorma.
Minäpä katselen koodinpätkää ja laitan tulemaan. Toki kuten saatoin mainita, niin tämä nimenomainen kytkentä menee pelkällä asetusarvolla kun tähän ei haluttu säätäjää eikä se oikein tähän käyttöön sovikaan. Mutta on mulla muita projekteja joissa on käytetty PID-säätöä. Voin niidenkin koodista kaivella soveltuvia osia.

Nollapistekytkentä on sikäli helppo, että se tapahtuu tuolla optotriacissa. Katso piirikaaviota sillä silmällä, niin huomaat että kun optotriac ei ole liipaisseena, niin sen toision yli (pinnit 4,6) vaikuttaa verkkojännite. Tämä on juuri se sama jännite jota päätriac kytkee päälle ja pois. Eli opton sisällä voidaan mitata pinnien välinen jännite, ja vain kun sekä ensiönpuolelta on ohjaus päällä ja toision puolella pääjännite ohittaa nollakohdan, optotriac liipaisee. Tuolla lutikassa on siis sisällä ihan elektroniikkaa hoitamassa homman - se ei ole pelkkä simppeli optoerotin.

1 Like
/*
 * PWRcontroller.cpp
 * SSR-releen tai nollapistekytkevän triacin tehon asetus
 * 
 * Created: 15.2.2016 11:53:03
 * Author : Kremmen
 */ 

#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 8000000L

uint16_t cmscounter;
volatile uint16_t mscounter;	// millisekuntilaskuri (laskee millisekunteja pwm-syklin alusta)
uint16_t tmpsetpoint, csetpoint;
volatile uint16_t setpoint;	// asetusarvo (0 - 1000)

uint16_t ADsum;					// AD-muunnoksen keskiarvoistuksen apumuuttujia
uint8_t ADindex;
#define  ADINDEXMAX 64			// oltava 2:n potenssi!
uint16_t ADvalue[ADINDEXMAX];

volatile bool cyclestart;
bool pwroutput, indicator;		// indicator on merkkivalon tilanohjaus. Kirkkaus seuraa tehon päälläoloa
uint8_t portvalue;


int main(void) {
uint8_t i;

 // Alustetaan GPIO - portti D
	PORTD = 0;
	DDRD = 0x03;
 
    // Alustetaan kello, timeri1 ja A/D-muunnin
	CLKPR = 1 << CLKPCE;			// enable prescaler
	CLKPR = 0;						// prescaler = 1 (8MHz kello)
	
	TCCR1A = 0;						// Compare outputit pois päältä WGM bitit 0 ja 1 = =
	TCCR1B = 1<<WGM12 | 1<<CS10;	// CTC moodi, prescaler = 1
	TIMSK1 = 1 << OCIE1A;			// Timer 1 keskeytys vertailurekisteristä A
	OCR1A = 0x1f40;					// vertailu = 8000  --> 1ms aikakeskeytykset
	
	ADMUX = 0x00;
	ADCSRA = 1 << ADEN | 1 << ADIE | 1 << ADPS0; // muunnin päälle, keskeytykset päälle, muuntimen kellojakaja /4

	// nollataan A/D-muuntimen bufferi
	for ( i=0; i<ADINDEXMAX; i++ ) {
		ADvalue[i] = 0;
	}
	ADindex = 0;
	ADsum = 0;
	
	sei();
	//pwm-looppi
    for ( ; ; ) {
		// uuden pwm-syklin alussa powerit päälle
		if (cyclestart) {
			cli();
			cyclestart = false;
			sei();
			pwroutput = true;
		}
		// tsekataan syklissä kulunut aika
		cli();
		cmscounter = mscounter;
		csetpoint = setpoint;
		sei();
		// jos päälläoloaika on kulunut niin powerit pois päältä
		if ( cmscounter >= csetpoint ) pwroutput = false;
		// siirretään lopputulos GPIO-pinniin
		portvalue = (PIND & 0xfc);
		portvalue |= ((pwroutput & 0x01 ) | (indicator & 0x01)) << 1;
		PORTD = portvalue;
    }
}

// Timer1 Compare A: 1 millisekunnin keskeytys
//	kasvatetaan millisekuntilaskuria
//	
ISR(TIMER1_COMPA_vect) {
	ADCSRA = ADCSRA |  1 << ADSC | 1 << ADIE;	// käynnistetään uusi A/D-muunnos
	if ( ++mscounter >= 1000) {
		mscounter = 0;
		cyclestart = true;
	}
	indicator = !indicator;
}

// A/D-muuntimen keskeytys
ISR(ADC_vect) {
	ADsum -= ADvalue[ADindex];
	ADvalue[ADindex] = ADC;
	ADsum += ADvalue[ADindex];
	ADindex++;
	if ( ADindex >= ADINDEXMAX) ADindex = 0;
	tmpsetpoint = ADsum >> 6;	// jako 64:llä. Synkattava ADINDEXMAX:in kanssa!
	
	// A/D-muunnos tuottaa lukeman 0 - 1024. Jaksonaika on 1000 ms joten
	// setpoint on 24 isompi kuin jakso. Käytetään ero hyväksi tekemällä hieman välystä molempiin päihin
	// Lukemat 0-12 tulkitaan nollaksi ja isommista vähennetään 12. Tällöin viimeiset 12 inkrementtiä vastaavat "täyttä kaasua"
	// Näin varmistetaan, että potikalla päästään ihan nollasta ihan täysille.
	
	if (tmpsetpoint < 12 ) setpoint = 0;
	else setpoint = tmpsetpoint - 12;
	
}

Kiitos, pitää tutkia tuota ajankanssa.