Digitale Input
Sikring af niveauet på en indgang
Grunden til at sikre niveauet på en indgang på et kredsløb er at man ellers ikke kan være sikker på hvilket niveau indgangen har, når der ikke er forbundet noget. Grunden til dette er at ledningerne kan opsamle felter, så det kan toolkes som både høj og lav.
En svævende indgang
Umiddelbart vil man sige at når det ikke er forbundet noget til en indgang, så er den 0 eller lav. Det er bare ikke rigtigt, da indgangen i stedet svæver, og altså både kan antage høj og lav på skift eller i værste fald opfange et fejlt, hvor den skifter hurtigt mellem 0 og 1.
Svævende indgange vil give ustabile kredsløb.
Dette er gældende for logiske kredsløb generelt, men man skal specilt være opmærksom på det, når man programmerer microcontrollere som PIC og Arduino.
Skal man lave en indgang f.x. til en PIC eller en Arduino, hvor man kan skifte niveauet mellem højt og lavt, så ville man umiddelbart tænke at man kunne lave det viste kredsløb.
Det er bare forkert. Signalet ind til PIC'en er fint højt, når der er trykket på knappen, men når der ikke er trykket på knappen, så svæver signalet, og man kan ikke vide om det er højt eller lavt |
Pull-down
Løsningen på dette problem, er at anvende en pull-down modstand, som vist på kredsløbet her under.
Ideen i kredsløbet er at de signaler man kan opfange på ledningerne vil kun give en meget lille strøm i modstanden, og derfor vil spændingen over modstanden også være lille, og signalet ind på PIC'en eller Arduino'en vil være lavet.
Når man trykker på knappen, så vil der komme et højt signal ind på PIC-indgangen, og når man slipper den igen, så vil signalet straks gå lavt igen. Det er svært at foretage en egentlig beregning på modstanden, andet end hvor meget strøm man vil ofre, når der er trykket på knappen. Normalt er 100k en god størrelse, men hvis elektronikken skal fungere med lange ledninger eller i et meget støjfyldt miljø, så vil det være bedre med en mindre modstand. |
Pull-up
Efter samme teknik kan man anvende en pull-up modstand som viste herunder.
Ideen i kredsløbet er at de signaler man kan opfange på ledningerne vil kun give en meget lille strøm i modstanden, og derfor vil spændingen over modstanden også være lille.
Så længe der ikke er trykket på knappen, så vil signalet ind til PIC'en eller Arduino'en være højt, fordi modstanden er forbundet til +5V. Når man trykker på knappen, så vil der komme et lavt signal ind på PIC- eller Arduino-indgangen, og når man slipper den igen, så vil signalet straks gå højt igen. Man kan observere at signalet kommer omvendt ind i PIC'en eller Arduino'en (som om der sad en inverter-gate). |
Elektrisk fjernelse af prel
Når man konstruerer opstillinger som reagerer enten på en forkant eller en bagkant, kan man opleve problemer med at kredsløbet reagerer flere gange på et tryk. Det skyldes at en trykknap har det fænomen som hedder prel, hvilket grundlæggende blot er at kontakten får forbindelse flere gange idet der trykkes, eller idet der slippes. Der hvor man oplever problemet kan være counter-kredsløb, som tæller hvor man gange der er trykket på en knap eller det kan være i microcontroller kredsløb med PIC eller Arduino, hvor softwaren skal reagere på en knap.
Måling på en kontakt med prel både på forkant og bagkant
For at sikre mod prel kan man placere en kondensator fra signalet til stel, således at når der er trykket på knappen, så "holder" kondensatoren på signalet indtil den er afladet igen af modstanden. Dette laves på følgende måde ved de to koblinger af kontakten:
Den tid som kondensatoren "holder" på signalet bestemmes af tidskonstanten (betegnes med det græske tau) τ = R ⋅ C. Med de viste komponenter giver det en tidskonstant på 10 millisekunder, hvilket er den tid der går indtil spændingen er faldet til ca. 36% - hvis indgangen reagerer på 50%-niveauet, så vil tiden være lidt kortere (ca. 7 millisekunder).
Ekstra sikring af kredsløbet
Med de ovenstående kredsløb vil man indføre noget, som kan have uheldige konsekvenser for kredsløbets funktion. Det er langt fra sikkert man vil opleve det, men med en simpel forbedring kan man forhindre det. Problemet opstår i det øjeblik hvor man trykker på kontakten. I begge kredsløb vil der principielt løbe uendelig stor strøm i kondensatoren, hvilket kan skade kondensatoren på længere sigt.
I kredsløbet med pull-down modstand er det forsyningen der skal levere den uendelige strøm, hvilket kan resultere i et dyk i forsyningen - selv et kortvarigt dyk vil kunne forstyrre en microcontroller. Ydermere vil kontakten heller ikke have godt af det - der vil kunne opstå små svejsninger i kontaktfladen.
I kredsløbet med pull-up modstand, der vil kontakten kortslutte kondensatoren, som er blevet ladet op gennem modstanden - her er det kondensator og kontakt der kan få forringet deres levetid.
Det er heldigvis ret enkelt at forhindre disse uheldigheder, ved at indføre en ekstra modstand, som vist herunder. Det er blot en lille modstand der skal til, så tidskonstanten holdes meget mindre en den anden tidskonstant - med de givne værdier bliver tidskonstanten 10 mikrosekunder. Den maksimale strøm der kommer til at løbe i kontakten bliver her til 50 mA, ved anvendelse af ohms lov.
Kredløbene kan opbygges som følger:
Sikring mod ikke logisk niveau
Med indførelsen af RC-led på kontaktfunktionen, så vil det digitale signal ikke længere have en ren digital karakter med veldefineret høj og lav, men vil komme til at glide gennem det udefinerede område for en logisk indgang, hvilket kan resultere i at den logiske indgang vil kunne opfatte skiftende højt og lavt niveau, hvilket vi jo lige har forsøgt at forhindre.
For at imødekomme dette kan man anvende en schmitt-trigger, som giver en analog hysterese, hvilket betyder at den skal over et vist niveau for at skifte, og når den så er skiftet, så skal under et lavere niveau for at skifte tilbage. Dette resulterer i et rent logisk signal, så indgangen vil opfatte signalet rigtigt.
Det er dog heldigvis sådan at mange microcontrollere i dag har schmitt-triggeren indbygget i almindelige digitale indgange, eller man kan vælge en indgang der har det - det skal man undersøge i databladet for den aktuelle microcontroller. Den microcontroller der anvendes i Arduino er en ATMEGA328P[1], som har schmitt-trigger på alle indgange.
Hvis man ønsker at sikre sig, så ser kredsløbet ud som følger:
Kontakt med Pull-Down og udvidet elektrisk prel- og niveau-sikring
I det viste kredsløb er det en inverterende schmitt-trigger der er anvendt, så det aktive lave signal fra kontakten bliver til et aktivt højt signal.