Arduino kontrollerade ljus dimmer (11 / 15 steg)
Steg 11: PIC kontrollerade lightdimmer: programvaran
Om du vill använda denna krets med en PIC mikrokontroller, kan programvaran i denna länk hjälpa dig att få ytterligare:
http://www.edaboard.com/thread265546.html
En bra artikel om noll korsning upptäckt med en PIC kan hittas här:
http://tahmidmc.blogspot.nl/2012/10/Zero-Crossing-...
Författaren Syed Tahmid Birger ger en grundläggande program som upptäcker noll korsningen och sedan utlöser LED med en fördröjning av 20ms.
Även om jag aldrig jobbat med PIC innan och är ingen spricka på C-programmering. Jag bestämde mig att se om jag kunde bygga på sitt program och göra det möjligt att variera ljusintensiteten, snarare än att bara ge det ett värde (20ms fördröjning).
Jag fick snart reda på att funktionerna delay_ms och delay_us i C, är lite knepigt, nämligen att de inte accepterar en variabel. Fördröjningstiden måste vara känd vid tidpunkten för sammanställningen som det är hårdkodad. Jag såg några komplicerade genvägar, men jag trodde en enklare lösning skulle vara att göra en funktion som ger en 75 uS dröjsmål (att 65 för 60Hz) och kallar det med en parameter som bestämmer hur ofta denna försening är loopas.
Det maximala antalet gånger förseningen är loopas är 128. Det beror på att jag har slumpmässigt valt att ljuset bör vara nedtonade i 128 steg (med 0 är full på och 128 att vara utanför).
En varning dock: Jag har ingen PIC programmerare och jag inte planerar (ännu) att gå in i bilder, lycklig som jag är med Atmega och Attiny-serien. Därför inte kan jag testa programmet. Jag kan bara säga att det sammanställer utan problem, och om du vill använda kretsen på en bild, det hjälper dig att komma igång. Du kan också hitta full projekt, inklusive ett program, här och här, inklusive en IR-fjärroch här
//---------------------------------------------------------------------------------------------------------
Programmerare: DIY_Bloke
Starkt baserat på en 0-X program från Syed Tahmid Birger
Kompilator: mikroC PRO för PIC v4.60
Rikta PIC: PIC16F877A
Program för vinkel faskontroll
noll korsning signal på pin-33 RB0/INT
gating signal till MOC3021 via 220-470R från pin 19 RD0/PSP0
X-tal 4 MHz
//---------------------------------------------------------------------------------------------------------
unsigned char FlagReg;
int x;
int maal;
int mörkläggning = 20; / / '20' är bara ett exempel. Ljusreglering bör innehålla en
värde mellan 0 och 128 och kan tas från t.ex. en
variabelt motstånd eller LDR eller ett värde som kommer från ett program
sbit ZC på FlagReg.B0;
void interrupt() {
om (INTCON. ITF) {//INTF flagga upp, så yttre mellanjobb inträffade
ZC = 1;
INTCON. ITF = 0;
}
}
void fördröjning (int maal) {
för (x = 1; x < maal; x ++) {
delay_us(75); 65 för 60Hz
}
}
void main () {
PORTB = 0;
TRISB = 0X01; RB0 ingång för avbrott
PORTA = 0;
ADCON1 = 7. Inaktivera ADC
TRISA = 0XFF; Göra alla PORTA ingångar
PORTD = 0;
TRISD = 0; PORTD alla utgång
OPTION_REG. INTEDG = 0; avbryta fallande utkanten
INTCON. ITF = 0; Rensa avbrott flagga
INTCON. INTEG = 1; Aktivera extern avbrott
INTCON. GIE = 1; Aktivera global avbrott
samtidigt (1) {
om (ZC) {//zero passerar inträffade
Delay(Dimming); "20" är ett exempel
PORTD. B0 = 1; Skicka en puls
delay_us(250);
PORTD. B0 = 0;
ZC = 0;
}
}
}