Dimmer, 3-fas
Postat: 7 januari 2014, 19:22:20
Nu vill jag berätta lite om den dimmer jag håller på att tillverka för att styra våra värmefläktar på jobbet. De låter för jävligt pga. vindsus och kan bara gå full patte eller inte alls och min tanke är att dimma hastigheten så att de bara kör precis nog till att hålla temperaturen på rätt nivå. Vi håller även på att kolla om det går att få tystare fläktblad till dom. Rätt ville vara att byta skiten men vi hyr lokalerna och chefen vill inte ta den utgift av den anledning.
All diskussion om lämpligheten av denna sorts styrning har vi varit igenom och hör inte hemma här, detta är tänkt att hjälpa/inspirera folk som kan behöva en 3-fas dimmer - eller få andra att spy över att jag väljer denna lösning. Jag ämnar att bygga den och se om det fungerar, gör det inte är det ledsamt men då kommer jag att notera det här. Ja, jag vet om att den bästa lösning är en VFD.
Först lite schema: En snabb liten genomgång:
Självklart finns det anslutning för 3 faser & Noll. Jag använder jackbara kopplingsplintar med 7,62mm C-C på pinnarna. Tål rikligt Ampére för detta. Det finns en ingående (till vänster) och en utgående (till höger).
TF1 sitter mellan ena fas och Noll och får därför 230Vac. Den ger ut ung. 7,5Vac och ett par VA, det räcker fint till detta.
Kopplingen med Q1 & D2 ger en "noll-genomgångs"-puls, jag har mätt den och den är ung. 468µs lång vid varje nollgenomgång. R12 är på 10k och R11 är på 4k7 har jag för mig och används för att ladda ur dioderna så att noll-genomgången avkänns stabilt.
Nåväl, den puls är då synkroniserat med ena fasen och går in på PORTB4 som ställs till "Interrupt-On-Change". Den interrupt används sedan till att "faslåsa" den interna timer, mer nedan.
Jag har även kopplat till en ST232 (MAX232) som ger mig två RS232 portar. Den ena är tänkt att koppla ihop med en identisk enhet så att de kan köra parlöp, det är nämligen två fläktar som ska styras och jag vill bara ha en temperatursensor. Alltså kopplar jag ihop dom med lite kommunikation och då kan den som har en DS18B20 skicka kommandon till den som saknar en sådan.
Har de båda en sensor kommer jag nog att se till att de jämkar temperaturen mellan dom och använder ett medel som regleringsvärde men den tiden, den sorg.
Jag har TVÅ RS232 portar, den andra ska användas för att ställa parameter osv. via ett terminalprogram. När allt är ställd rätt kopplar jag datorn bort från den och sedan kan det sköta sig bäst det kan. Värden sparas till och hämtas från EEPROM så den ska vara självgående när den kör.
R17 och transistorn där (har glömt att annotera den) är till för 1-Wire® kommunikation, det rör sig om en enkel DS1822/DS18B20/DS18S20 som ska hänga ett lämpligt ställe.
Själva schemat är ju ytterst simpelt men mjukvaran har givit mig desto mer huvudbry!
Dimningen sker ju vid att styra hur långt inne på varje halvvåg som man ska slå på TRIAC'erna. Denna har 3 st TRIAC och jag planerade att slå på en åt gången i fasföljd och man fick då se till att ha rätt fasföljd på ingångarna - fram till jag kom på att motorn är ren 3-fas, ingen nolla! Detta betyder att jag måste slå på alla 3 optokopplare vid varje tändning samt att den måste tända med en fashastighet av 300Hz.
Och nu börjar det bli intressant...
Vill jag ha en upplösning på 1% på fläkten behöver jag alltså en klockhastighet på 30kHz för att klara detta. Jag har 3 faser som ska slås på, därav 30kHz, hade det rört sig om 1 fas hade 10kHz räckt.
Nu börjar jag räkna lite... Jag undviker helst att starta PLL-klockan i µC'n, det drar "mycket" ström och löser man jobbet rätt behövs det inte. Men jag ska likaväl klura en del och jag tror att jag har lösningen: Använd Timer 2 (utan interrupt) som frekvensgenerator som sedan matar Timer 1. Timer 1 ger interrupt vid overflow och för varje Timer 1-interrupt blir den laddad med rätt värde så att tiden till nästa interrupt svara till nästa fas, alltså 3,33ms. Interrupten kommer alltså med 300Hz vilket är alldeles överkomligt när µC'n kör på 16MHz.
Så min lösning är att main-loop ser till att läsa temperatursensorn och använda den i en PI-reglering. Den reglering ger ut mellan 0% och 100% vilket då är hastigheten som fläktfan ska köra. Självklart kommer jag att ha en minste hastighet och allt under är automatisk 0% men vilken hastighet det rör sig om vet jag inte än, det ska testas.
För varje synkroniseringspuls kommer jag att ställa Timer 1 till ett visst värde som motsvarar den fördröjning den ska ha och när den utlöser en interrupt slås optokopplarna på och Timer 1 ställs med en fast tid som motsvarar samma position på nästa fas. För att slå av optokopplarnas drivning kommer jag att ta Timer 3 och "förskjuta" den lite så att den interrupt kan stänga av utgångarna. Tiden för förskjutningen bestämmer tändpulsernas längd.
Men jag använder ju den interna oscillator som förvisso är rimligt exakt men inte lika exakt som nätfrekvensen. Alltså måste jag göra en sorts mjukvara-PLL och min tanke är att läsa Timer1 värdet vid varje Sync-puls och hålla koll på antal "varv" den har tagit mellan sync-pulserna samt vilket värde Timer 1 har vid varje Sync-interrupt.
På det vis bör jag kunde justera värdet i Timer 2 till att motsvara nätfrekvensen * 2 * 3 * 100 oavsett hur exakt den interna oscillator är.
Att det hela kommer att "hunta" lite fram och tillbaka kan jag leva med, jag tror att det kan fungera ganska OK ändå. Blir det pannkaka får jag hitta orsaken (enkelt med RS232 port) och ändra vad som går fel.
Jag använder MPLAB-X med XC8, PICkit3, µC'n är en PIC18F25K22.
All diskussion om lämpligheten av denna sorts styrning har vi varit igenom och hör inte hemma här, detta är tänkt att hjälpa/inspirera folk som kan behöva en 3-fas dimmer - eller få andra att spy över att jag väljer denna lösning. Jag ämnar att bygga den och se om det fungerar, gör det inte är det ledsamt men då kommer jag att notera det här. Ja, jag vet om att den bästa lösning är en VFD.
Först lite schema: En snabb liten genomgång:
Självklart finns det anslutning för 3 faser & Noll. Jag använder jackbara kopplingsplintar med 7,62mm C-C på pinnarna. Tål rikligt Ampére för detta. Det finns en ingående (till vänster) och en utgående (till höger).
TF1 sitter mellan ena fas och Noll och får därför 230Vac. Den ger ut ung. 7,5Vac och ett par VA, det räcker fint till detta.
Kopplingen med Q1 & D2 ger en "noll-genomgångs"-puls, jag har mätt den och den är ung. 468µs lång vid varje nollgenomgång. R12 är på 10k och R11 är på 4k7 har jag för mig och används för att ladda ur dioderna så att noll-genomgången avkänns stabilt.
Nåväl, den puls är då synkroniserat med ena fasen och går in på PORTB4 som ställs till "Interrupt-On-Change". Den interrupt används sedan till att "faslåsa" den interna timer, mer nedan.
Jag har även kopplat till en ST232 (MAX232) som ger mig två RS232 portar. Den ena är tänkt att koppla ihop med en identisk enhet så att de kan köra parlöp, det är nämligen två fläktar som ska styras och jag vill bara ha en temperatursensor. Alltså kopplar jag ihop dom med lite kommunikation och då kan den som har en DS18B20 skicka kommandon till den som saknar en sådan.
Har de båda en sensor kommer jag nog att se till att de jämkar temperaturen mellan dom och använder ett medel som regleringsvärde men den tiden, den sorg.
Jag har TVÅ RS232 portar, den andra ska användas för att ställa parameter osv. via ett terminalprogram. När allt är ställd rätt kopplar jag datorn bort från den och sedan kan det sköta sig bäst det kan. Värden sparas till och hämtas från EEPROM så den ska vara självgående när den kör.
R17 och transistorn där (har glömt att annotera den) är till för 1-Wire® kommunikation, det rör sig om en enkel DS1822/DS18B20/DS18S20 som ska hänga ett lämpligt ställe.
Själva schemat är ju ytterst simpelt men mjukvaran har givit mig desto mer huvudbry!
Dimningen sker ju vid att styra hur långt inne på varje halvvåg som man ska slå på TRIAC'erna. Denna har 3 st TRIAC och jag planerade att slå på en åt gången i fasföljd och man fick då se till att ha rätt fasföljd på ingångarna - fram till jag kom på att motorn är ren 3-fas, ingen nolla! Detta betyder att jag måste slå på alla 3 optokopplare vid varje tändning samt att den måste tända med en fashastighet av 300Hz.
Och nu börjar det bli intressant...
Vill jag ha en upplösning på 1% på fläkten behöver jag alltså en klockhastighet på 30kHz för att klara detta. Jag har 3 faser som ska slås på, därav 30kHz, hade det rört sig om 1 fas hade 10kHz räckt.
Nu börjar jag räkna lite... Jag undviker helst att starta PLL-klockan i µC'n, det drar "mycket" ström och löser man jobbet rätt behövs det inte. Men jag ska likaväl klura en del och jag tror att jag har lösningen: Använd Timer 2 (utan interrupt) som frekvensgenerator som sedan matar Timer 1. Timer 1 ger interrupt vid overflow och för varje Timer 1-interrupt blir den laddad med rätt värde så att tiden till nästa interrupt svara till nästa fas, alltså 3,33ms. Interrupten kommer alltså med 300Hz vilket är alldeles överkomligt när µC'n kör på 16MHz.
Så min lösning är att main-loop ser till att läsa temperatursensorn och använda den i en PI-reglering. Den reglering ger ut mellan 0% och 100% vilket då är hastigheten som fläktfan ska köra. Självklart kommer jag att ha en minste hastighet och allt under är automatisk 0% men vilken hastighet det rör sig om vet jag inte än, det ska testas.
För varje synkroniseringspuls kommer jag att ställa Timer 1 till ett visst värde som motsvarar den fördröjning den ska ha och när den utlöser en interrupt slås optokopplarna på och Timer 1 ställs med en fast tid som motsvarar samma position på nästa fas. För att slå av optokopplarnas drivning kommer jag att ta Timer 3 och "förskjuta" den lite så att den interrupt kan stänga av utgångarna. Tiden för förskjutningen bestämmer tändpulsernas längd.
Men jag använder ju den interna oscillator som förvisso är rimligt exakt men inte lika exakt som nätfrekvensen. Alltså måste jag göra en sorts mjukvara-PLL och min tanke är att läsa Timer1 värdet vid varje Sync-puls och hålla koll på antal "varv" den har tagit mellan sync-pulserna samt vilket värde Timer 1 har vid varje Sync-interrupt.
På det vis bör jag kunde justera värdet i Timer 2 till att motsvara nätfrekvensen * 2 * 3 * 100 oavsett hur exakt den interna oscillator är.
Att det hela kommer att "hunta" lite fram och tillbaka kan jag leva med, jag tror att det kan fungera ganska OK ändå. Blir det pannkaka får jag hitta orsaken (enkelt med RS232 port) och ändra vad som går fel.
Jag använder MPLAB-X med XC8, PICkit3, µC'n är en PIC18F25K22.