Innehållsförteckning:

8 kanalers programmerbar timer: 13 steg
8 kanalers programmerbar timer: 13 steg

Video: 8 kanalers programmerbar timer: 13 steg

Video: 8 kanalers programmerbar timer: 13 steg
Video: Стильная Мужская Стрижка 2023 Пошагово дома | Уроки стрижек Евы Лорман | Как стричь Мужские стрижки 2024, Juli
Anonim
8 -kanals programmerbar timer
8 -kanals programmerbar timer
8 -kanals programmerbar timer
8 -kanals programmerbar timer
8 -kanals programmerbar timer
8 -kanals programmerbar timer

Introduktion

Jag har använt Microchips PIC -sortiment av mikrokontroller för mina projekt sedan 1993 och har gjort all min programmering på assembler -språk med Microchip MPLab IDE. Mina projekt sträckte sig från enkla trafikljus och blinkande lysdioder till USB -joystick -gränssnitt för R/C -modeller och ställverkanalysatorer som används inom industrin. Utvecklingen tog många dagar och ibland tusentals rader med assembler -kod.

Efter att ha fått Matrix Multimedia Flowcode 4 Professional var jag ganska skeptisk till programvaran. Det såg för lätt ut att tro. Jag bestämde mig för att prova och testade alla olika komponentmakron, alla med stor framgång. Det bästa med att använda Flowcode var att enkla projekt kunde kodas på en enda natt. Efter att ha spelat med I²C och en DS1307 realtidsklocka bestämde jag mig för att designa 8 -kanalstimern med Flowcode. Eftersom jag inte var ett litet och enkelt projekt trodde jag att det här skulle vara ett bra projekt att lära mig Flowcode.

Välja en mikroprocessor och andra komponenter

På grund av antalet I/O -stift som krävs var det klart att en 40 -stifts enhet kommer att behövas. PIC 18F4520 valdes, främst för sitt 32K programminne, och 1536 byte dataminne. Alla komponenter som används är standard genomgående hålenheter, vilket gör det möjligt att bygga kretsen på Vero-kortet om det behövs. Detta hjälpte också till med utvecklingen på en brödbräda.

Steg 1: Projektmål

Projektmål
Projektmål

Mål

- Noggrann tidshållning, med batteribackup.

- Alla program och data ska behållas, även efter strömavbrott.

- Enkelt användargränssnitt.

- Programmeringsflexibilitet.

Tid att hålla

Om du bor i ett område som är benäget för strömavbrott kommer inte standard 50/60Hz från kraftledningarna att räcka för noggrann tid. En realtidsklocka var avgörande, och efter att ha testat flera RTC-chips bestämde jag mig för DS1307 på grund av dess enkla oscillator och batteribackup-konfiguration. Ganska exakt tidshållning erhölls med endast en 32.768 kHz kristall ansluten till DS1307. Noggrannheten var inom 2 sekunder under en 2 månaders testperiod med 4 olika kristaller.

Datalagring

All timerprogramdata måste sparas, även vid strömavbrott. Med upp till 100 olika program och olika konfigurationsdata blev det klart att 256 byte inbyggd EEPROM i PIC inte kommer att vara tillräckligt stor. En 24LC256 I²C EEPROM används för att lagra all programmeringsinformation.

Enkelt användargränssnitt

Användargränssnittet består av endast 2 artiklar, en 16 x 4 -raders LCD -display med LED -bakgrundsbelysning och en 4 x 3 knappsats. All programmering kan göras med ett knapptryck. Tillägg till gränssnittet är en hörbar piezo -summer och visuellt blinkande LCD -bakgrundsbelysning.

Steg 2: Programmeringsflexibilitet

Programmeringsflexibilitet
Programmeringsflexibilitet

För att säkerställa tillräcklig programflexibilitet har timern 100 program som kan ställas in individuellt. För varje program kan On time, Off Time, Output Channels och Week Day ställas in. Varje program har tre lägen:

- Auto: På -tid, Av -tid, Utmatningskanal och veckodag är inställd.

- Av: Det enskilda programmet kan inaktiveras utan att radera inställningarna. För att aktivera programmet igen, helt enkelt välja ett annat läge.

- Dag/natt: På -tid, Av -tid, Utmatningskanal och veckodag är inställd. Fungerar på samma sätt som Auto -läget, men kommer

slå bara på utgångarna mellan på- och avstängningstiderna när det är mörkt. Detta möjliggör också full dag/natt -kontroll

som den extra flexibiliteten att tända lampor vid solnedgången och släcka vid soluppgången.

Exempel 1: Tänds efter 20:00 och släcks vid soluppgång:

På: 20:00, Av: 12: 00, Exempel 2: Tänds vid solnedgången och släcks vid 23:00.

På: 12:00

Av: 23:00

Exempel 3: Tänder ljuset vid solnedgången och släcker ljuset vid soluppgången.

På: 12:01

Av: 12:00

Ytterligare alternativ tillgängliga, alla arbetar oberoende av de 100 på/av -programmen.

Programkanaler aktiva: I stället för att stänga av flera program kan enskilda utmatningskanaler inaktiveras utan att program behöver ändras.

Extra ingångar: Två digitala ingångar är tillgängliga, så att vissa utgångskanaler kan slås på under en viss tid. Det kan till exempel användas för att tända vissa lampor när du kommer hem sent på kvällen, när du trycker på en knapp på en fjärrkontroll eller för att tända en annan lampa när huslarmet utlöses.

Extrautgångar: Två ytterligare utgångar (bortsett från de 8 utgångskanalerna) är tillgängliga. De kan programmeras för att slå på med vissa utgångskanaler eller med de digitala ingångarna. I min installation har jag utgångar 6-8 som styr min bevattning, som fungerar på 24V. Jag använder kanalerna 6-8 för att slå på en av hjälputgångarna, för att slå på en 24V strömförsörjning för bevattningssystemet.

Manuell på: På huvudskärmen kan knapparna 1-8 användas för att manuellt slå på eller av kanaler.

Steg 3: Hårdvara

Hårdvara
Hårdvara

Strömförsörjning: Strömförsörjningen består av en likriktare, utjämningskondensator och en 1 Amp -säkring för överbelastningsskydd. Denna matning regleras sedan av en 7812 och 7805 regulator. 12V -matningen används för att driva utgångsreläer, och alla andra kretsar drivs från 5V -matningen. Eftersom 7805 -regulatorn är ansluten till 7812 -regulatorns utgång måste den totala strömmen begränsas till 1 amp genom 7812 -regulatorn. Det är lämpligt att montera dessa regulatorer på en lämplig kylfläns.

I²C -buss: Även om Flowcode möjliggör I²C -kontroll av hårdvara bestämde jag mig för att använda programvaran I²C -konfiguration. Detta möjliggör mer flexibilitet för pin -tilldelningar. Även om den är långsammare (50 kHz) fungerar den fortfarande bra jämfört med maskinvaran I²C -bussen. Både DS1307 och 24LC256 är anslutna till denna I²C -buss.

Realtidsklocka (DS1307): Under start läses RTC-registret 0 och 7 för att avgöra om det innehåller giltig tid och konfigurationsdata. När installationen är korrekt, läses RTC -tiden och tiden laddas i PIC. Detta är den enda gången som tiden läses från RTC. Efter start kommer en 1 Hz puls att finnas på stift 7 i RTC. Denna 1 Hz -signal är ansluten till RB0/INT0, och via en avbrottsrutin uppdateras PIC -tiden varje sekund.

Extern EEPROM: All programdata och alternativ lagras på den externa EEPROM. EEPROM-data laddas vid start och en kopia av data lagras i PIC-minnet. EEPROM -data uppdateras endast när programinställningarna ändras.

Dag/natt sensor: Ett standard ljusberoende motstånd (LDR) används som dag/natt sensor. Eftersom LDR finns i många former och sorter, alla med olika motståndsvärden under samma ljusförhållanden, använde jag en analog ingångskanal för att läsa av ljusnivån. Dag- och nattnivåerna är justerbara och möjliggör viss flexibilitet för olika sensorer. För att ställa in lite hysteres kan individuella värden för dag och natt ställas in. Tillståndet kommer bara att ändras om ljusnivån är under dagen, eller över inställningspunkterna för natten, längre än 60 sekunder.

LCD-skärm: 4 rader, 16 tecken display används, eftersom all data inte kunde visas på en 2-raders display. Projektet innehåller några anpassade tecken, som definieras i makrot LCD_Custom_Char.

Extra ingångar: Båda ingångarna buffras med en NPN -transistor. +12v och 0V finns också på kontakten, vilket möjliggör mer flexibla anslutningar till externa anslutningar. Som ett exempel kan en fjärrkontrollmottagare anslutas till matningen.

Utgångar: Alla utgångar är elektriskt isolerade från kretsen med hjälp av ett 12V relä. De reläer som används är klassade för 250V AC, vid 10 ampere. De normalt öppna och normalt stängda kontakterna förs ut till terminalerna.

Knappsats: Knappsatsen som används är en 3 x 4 matris knappsats och är ansluten PORTB: 2..7.

Steg 4: Knappsatsavbrott

Knappsatsavbrott
Knappsatsavbrott
Knappsatsavbrott
Knappsatsavbrott
Knappsatsavbrott
Knappsatsavbrott

Jag ville använda PORTB Interrupt on Change interrupt vid valfri knapptryckning. För detta måste ett anpassat avbrott skapas i flödeskod för att säkerställa att PORTB -riktning och data är korrekt inställda före och efter varje knappavbrott. Ett avbrott genereras varje gång en knapp trycks eller släpps. Avbrottsrutinen svarar bara när en knapp trycks ned.

ANPASSAD AVBRYT

Aktivera kod

portb = 0b00001110; trisb = 0b11110001;

intcon. RBIE = 1;

intcon2. RBIP = 1;

intcon2. RBPU = 1;

rcon. IPEN = 0;

Hanterarkod

if (intcon & (1 << RBIF))

{FCM_%n ();

portb = 0b00001110;

trisb = 0b11110001;

wreg = portb;

clear_bit (intcon, RBIF);

}

Problem hittade

Under ett avbrott måste avbrottsrutinen under INGA förhållanden ringa till något annat makro som kan användas någonstans i resten av programmet. Detta kommer så småningom att leda till stackoverflow -problem, eftersom avbrottet kan inträffa samtidigt som huvudprogrammet också finns i samma delprogram. Detta identifieras också som ett ALLVARLIGT FEL efter flödeskod när koden kompileras.

I den anpassade koden på knappsatsen under GetKeyPadNumber finns det ett sådant anrop till Delay_us -makrot, vilket kommer att orsaka ett stacköverflöde. För att övervinna detta har jag tagit bort kommandot Delay_us (10) och ersatt det med 25 rader med "wreg = porta;" kommandon. Detta kommando läser PORTA och placerar dess värde i W -registret, bara för att få lite fördröjning. Detta kommando kommer att sammanställas till en enda instruktion som liknar assembler movf porta, 0. För 10MHz -klockan som används i projektet kommer varje instruktion att vara 400ns, och för att få en 10us fördröjning behövde jag 25 av dessa instruktioner.

Observera på den andra raden i figur 3: GetKeypadNumber Custom Code, att det ursprungliga delay_us (10) -kommandot har inaktiverats med “//”. Under detta har jag lagt till mina 25 "wreg = porta;" kommandon för att få en ny 10us fördröjning. Utan samtal till några makron i den anpassade koden Keypad_ReadKeypadNumber kan knappsatsmakroet nu användas i en avbrottsrutin.

Det bör noteras att komponenterna i flödeskodens knappsats och eBlock inte använder de vanliga uppdragningsmotstånden på ingångsledningarna. Istället använder den 100K neddragningsmotstånd. På grund av viss störning på knappsatsen under utvecklingen ersattes alla 100K -motstånden med 10K och alla 10K -motstånden ersattes med 1K5. Knappsatsen testades för att fungera korrekt med ledningar på 200 mm.

Steg 5: Använda timern

Använda timern
Använda timern
Använda timern
Använda timern
Använda timern
Använda timern

Alla skärmar är inställda för att indikera all nödvändig information för användaren att snabbt göra ändringar i inställningarna. Linje 4 används för att navigera genom menyerna och programalternativen. Totalt 22 skärmar är tillgängliga under normal drift.

RAD 1: Tid och status

Visar aktuell dag och tid, följt av statusikoner:

A - Anger att Aux -ingång A utlöstes och Aux -ingång A -timer körs.

B - Indikerar att Aux -ingång B utlöstes och Aux -ingång B -timer körs.

C - Anger att Aux -utgång C är påslagen.

D - Anger att Aux -utgång D är påslagen.

} - Dag/Natsensorstatus. Om det finns, indikerar det att det är natt.

RAD 2: Programutgångar

Visar de kanaler som har aktiverats av de olika programmen. Kanaler visas i deras utmatningsnummer, och ett "-" indikerar att den specifika utgången inte är påslagen. Kanaler som har inaktiverats i "Programutgångar aktiva" kommer fortfarande att anges här, men de verkliga utgångarna kommer inte att ställas in.

RAD 3: Verkliga utgångar

Visar vilka kanaler som slås på av de olika programmen, Aux -ingångar A & B eller manuella utgångar som ställts in av användaren. Om du trycker på 0 återställs alla manuellt aktiverade utgångar och Aux Out A & B -timern återställs.

RAD 4: Meny och knappalternativ (på alla menyer)

Anger funktionen för “*” och “#” knapparna.

Den mittersta delen indikerar vilka sifferknappar (0-9) som är aktiva för den valda skärmen.

Inmatningsstatus för Aux -ingång A & B visas också med hjälp av en öppen eller stängd switch -ikon.

Utgångar kan slås på/av manuellt genom att trycka på motsvarande knapp på knappsatsen.

I menyerna används Star- och Hash -tangenterna för att navigera genom de olika programalternativen. Knapparna 0-9 används för att ställa in alternativen. Om flera alternativ är tillgängliga på en enda skärm eller programmeringsmeny används hashknappen för att gå igenom de olika alternativen. Det valda alternativet kommer alltid att indikeras med tecknet ">" till vänster på skärmen.

0-9 Ange tidsvärden

1-8 Ändra kanalval

14 36 Gå igenom program, 1-steg tillbaka, 4-steg tillbaka 10 program, 3-steg framåt, 6-steg framåt 10

program

1-7 Ställ in veckodagar. 1 = söndag, 2 = måndag, 3 = tisdag, 4 = onsdag, 5 = torsdag, 6 = fredag, 7 = lördag

0 Rensa alla manuella åsidosättningar och ingång A och ingång B -tidtagare på huvudskärmen. I andra menyer ändras

valda alternativ

# På huvudskärmen inaktiveras alla manuella åsidosättningar, ingång A och ingång B -tidtagare och programutgångar, tills

nästa evenemang.

* och 1 Starta om timern

* och 2 Rensa alla program och alternativ, återställ inställningarna till standard.

* och 3 Sätt timern i vänteläge. Tryck på valfri knapp för att slå på timern igen.

Vid felaktiga inmatningar av valfritt tidsvärde blinkar LCD -bakgrundsbelysningen 5 gånger för att indikera ett fel. Samtidigt hörs summern. Kommandona Exit och Next fungerar bara när den aktuella posten är korrekt.

LCD -bakgrundsbelysning

Vid första uppstart tänds LCD-bakgrundsbelysningen i 3 minuter, om inte:

- Det finns ett maskinvarufel (EEPROM eller RTC hittades inte)

- Tid inte inställd i RTC

LCD -bakgrundsbelysningen tänds igen i 3 minuter på alla användarinmatningar på knappsatsen. Om LCD -bakgrundsbelysningen är avstängd, aktiverar ett knappsatskommando först LCD -bakgrundsbelysningen och ignorerar knappen som trycktes in. Detta säkerställer att användaren kommer att kunna läsa LCD -skärmen innan man använder knappsatsen. LCD -bakgrundsbelysningen tänds också i 5 sekunder om Aux -ingång A eller Aux -ingång B är aktiverad.

Steg 6: Menyskärmbilder

Menyskärmbilder
Menyskärmbilder
Menyskärmbilder
Menyskärmbilder
Menyskärmbilder
Menyskärmbilder

Med knappsatsen kan var och en av alternativen enkelt programmeras. Bilderna ger lite information om vad varje skärm gör.

Steg 7: Design av systemet

Systemets design
Systemets design

All utveckling och testning gjordes på brödbräda. När jag tittade på alla sektioner i systemet delade jag upp systemet i tre moduler. Detta beslut berodde främst på PCB -storlekens begränsningar (80 x 100 mm) för den fria versionen av Eagle.

Modul 1 - Strömförsörjning

Modul 2 - CPU -kort

Modul 3 - Reläkort

Jag bestämde att alla komponenter måste vara lättillgängliga och att jag inte ville använda ytmonterade komponenter.

Låt oss gå igenom var och en av dem.

Steg 8: Strömförsörjning

Strömförsörjning
Strömförsörjning
Strömförsörjning
Strömförsörjning
Strömförsörjning
Strömförsörjning
Strömförsörjning
Strömförsörjning

Strömförsörjningen är rakt fram och förser CPU och reläkort med 12V och 5V.

Jag monterade spänningsregulatorerna på anständiga kylflänsar och använde också överskattade kondensatorer för matningen.

Steg 9: CPU -kort

CPU -kort
CPU -kort
CPU -kort
CPU -kort
CPU -kort
CPU -kort
CPU -kort
CPU -kort

Alla komponenter utom LCD -skärm, knappsats och reläer är monterade på CPU -kortet.

Kopplingsplintar har lagts till för att förenkla anslutningarna mellan matningen, två digitala ingångar och ljussensorn.

Huvudstift/uttag gör det enkelt att ansluta till LCD -skärmen och knappsatsen.

För utgångarna till reläerna använde jag ULN2803. Den innehåller redan alla erforderliga drivmotstånd och flyback -dioder. Detta säkerställde att CPU -kortet fortfarande kan tillverkas med gratisversionen av Eagle. Reläerna är anslutna till de två ULN2803s. Den nedre ULN2803 används för de 8 utgångarna och den övre ULN2803 för de två extrautgångarna. Varje extrautgång har fyra transistorer. Anslutningar till reläerna sker också via huvudstiften/uttagen.

PIC 18F4520 var utrustad med ett programmeringsuttag för att enkelt programmera via PicKit 3 -programmeraren.

NOTERA:

Du kommer att märka att kortet innehåller ytterligare 8 -stifts IC. Den översta IC är en PIC 12F675 och ansluten till en digital ingång. Detta tillkom under PCB -designen. Detta gör det lättare att förbehandla den digitala ingången. I min applikation är en av de digitala ingångarna ansluten till mitt larmsystem. Om alarmet ljuder tänds vissa lampor i mitt hus. Att aktivera och avaktivera mitt larmsystem ger olika pip på sirenen. Genom att använda PIC 12F675 kan jag nu skilja mellan arm/avkoppling och ett riktigt larm. 12F675 är också utrustad med ett programmeringsuttag.

Jag har också bestämt mig för en I2C -port via huvudstift/uttag. Detta kommer till nytta senare med reläbrädorna.

Brädan innehåller några hoppare, som bör lödas innan IC -uttagen monteras.

Steg 10: Slutsats för flödeskod

Slutsats för flödeskod
Slutsats för flödeskod
Slutsats för flödeskod
Slutsats för flödeskod
Slutsats för flödeskod
Slutsats för flödeskod

Eftersom jag är van att arbeta på registernivå i montering var det ibland svårt och frustrerande att använda komponentmakronen. Detta berodde främst på min bristande kunskap om Flowcodes programmeringsstruktur. De enda platserna som jag har använt C- eller ASM -blocken var att slå på utgångar inuti en avbrottsrutin och i Do_KeyPressed -rutinen för att inaktivera/aktivera knappavbrottet. PIC placeras också i SLEEP med hjälp av ett ASM -block när EEPROM eller RTC inte hittas.

Hjälp kring användningen av de olika I²C -kommandona erhölls alla från hjälpfilerna för Flowcode. Det är nödvändigt att veta exakt hur de olika I²C -enheterna fungerar innan kommandona kan användas framgångsrikt. Att utforma en krets kräver att designern har alla relevanta datablad tillgängliga. Detta är inte en brist på Flowcode.

Flowcode klarade verkligen testet och rekommenderas starkt för personer som vill börja arbeta med Microchip -serien av mikroprocessorer.

Flödeskodsprogrammering och konfiguration för PIC var inställd enligt bilder

Steg 11: Valfritt I2C -reläkort

I2C reläkort som tillval
I2C reläkort som tillval
I2C reläkort som tillval
I2C reläkort som tillval
I2C reläkort som tillval
I2C reläkort som tillval

CPU -kortet har redan huvudanslutningar för 16 reläer. Dessa utgångar är öppna kollektortransistorer via de två ULN2803 -chipsen. Dessa kan användas för att driva reläerna direkt.

Efter de första testerna av systemet gillade jag inte alla ledningar mellan CPU -kortet och reläer. Eftersom jag inkluderade en I2C -port på CPU -kortet, bestämde jag mig för att designa reläkortet för att ansluta till I2C -porten. Med hjälp av ett 16 -kanals MCP23017 I/O Port Expander -chip och en ULN2803 -transistormatris minskade jag anslutningarna mellan CPU och reläer till 4 ledningar.

Eftersom jag inte kunde passa 16 reläer på ett 80 x 100 mm PCB, bestämde jag mig för att göra två brädor. Varje MCP23017 använder bara 8 av dess 16 portar. Kort 1 hanterar de 8 utgångarna och kort 2 de två extrautgångarna. Den enda skillnaden på tavlorna är adresserna till varje bräda. Detta ställs enkelt in med en minitröja. Varje kort har kontakter för att leverera ström och I2C -data till det andra kortet.

NOTERA:

Om det behövs tillhandahåller programvaran endast ett kort som kan använda alla 16 portar. All utgångsrelädata är tillgänglig på det första kortet.

Eftersom kretsen är valfri och mycket enkel skapade jag inte en schematisk. Om det finns tillräckligt med efterfrågan kan jag lägga till det senare.

Steg 12: Valfri RF -länk

Valfri RF -länk
Valfri RF -länk
Valfri RF -länk
Valfri RF -länk
Valfri RF -länk
Valfri RF -länk

Efter slutförandet av projektet insåg jag snart att jag måste dra en massa 220V AC -ledningar till timern. Jag utvecklade en RF -länk med standard 315MHz -moduler som gjorde att timern kunde placeras inuti ett skåp och reläbrädorna inuti taket, nära alla 220V -ledningar.

Länken använder en AtMega328P som körs på 16MHz. Programvaran för både sändare och mottagare är densamma, och läget väljs av en minihoppare.

Sändare

Sändaren är helt enkelt ansluten till CPU I2C -porten. Ingen ytterligare installation krävs, eftersom AtMega328P lyssnar på samma data som I2C -reläkort.

Data uppdateras en gång per sekund på I2C -porten och sändaren skickar denna information via RF -länken. Skulle sändaren inte ta emot I2C -data på cirka 30 sekunder, sänder sändaren kontinuerligt data för att stänga av alla reläer till mottagarenheten.

Ström till sändarmodulen kan väljas mellan 12V och 5V med en minihoppare på PC -kortet. Jag driver min sändare med 12V.

Mottagare

Mottagaren lyssnar efter kodad data från sändaren och placerar data på en I2C -port. Reläkortet ansluts helt enkelt till denna port och fungerar på samma sätt som det var anslutet till CPU -kortet.

Skulle mottagaren inte ta emot giltig data på 30 sekunder skickar mottagaren kontinuerligt data på I2C -porten för att stänga av alla reläer på reläkortet.

Scheman

En dag, om det finns en efterfrågan på det. Arduino -skissen innehåller all nödvändig information för att bygga kretsen utan ett kretsschema.

Räckvidd

I min installation är sändaren och mottagaren cirka 10 meter från varandra. Timern är inuti ett skåp och reläenheten ovanpå taket.

Steg 13: Slutprodukt

Slutprodukt
Slutprodukt
Slutprodukt
Slutprodukt
Slutprodukt
Slutprodukt

Huvudenheten monterades i en gammal projektlåda. Den innehåller följande:

- 220V/12V transformator

- Strömförsörjningskort

- CPU -kort

- LCD skärm

- Knappsats

- RF -länksändare

- Ytterligare fjärrmottagare för hem som gör att jag kan slå på/av lampor via fjärrkontrollen

Reläenheten består av följande:

- 220V/12V transformator

- Strömförsörjningskort

- RF -länkmottagare

- 2 x I2C reläkort

Alla brädor var designade med samma dimension, vilket gör det enkelt att stapla dem ovanpå varandra med 3 mm distanser.

Rekommenderad: