ATmega8 - Ipari bemenet / kimenet kialakítása

2013-03-01

 

Az utóbbi időben egy hobby PLC-n dolgozom, ami egy ATmega8-ra fog épülni. Ehhez kapcsolódóan foglalkoztam a kimenete és a bemenete kialakításával. Egy digitális bemenet alapvetően egy kapcsolót figyel. Egyszerű dolog, korábban már láttunk is rá megoldást, egy kapcsoló a föld felé, és egy ellenállással felhúzzuk a bemenetet a uC tápjához. Ez igaz is, ha a uC paneljén van a kapcsoló. Viszont, ha a kapcsoló, mondjuk olyan 10m-re van a panelünktől, lehet nem is árnyékolt kábelt használtunk, akkor bizony mindenféle zavarfeszt összeszed a vezeték. Esetleg elvezetjük egy méretes elektromos motor mellett is ... :-) Ezek a bejövő avarjelek olyan szintűek is lehetnek, hogy tönkreteszik a uC bemenetét, ezért azt meg kell védenünk. A bemenetet egyébként nem csak a zavarjelektől kell megvédenünk, hanem a "villanyszerelőktől" is. Telepítés során igen komoly bakikat képesek az emberek elkövetni.

A bemenö jelet az IN bemeneti pont fogadja. A bemeneti pont mellé kivezettem a föld pontot, és a 12V-t, mert külső érzékelőnek lehet tápra szüksége. A védelmet a bemeneti pontra sorosan kötött 10k ellenállás biztosítja. A 2,2nF kondi a RF zavarszűrést biztosítja. Ide akár 47nF kondi is kerülhet, a PLC esetében nem fog sebesség probléma fellépni. Erősen zavart környezetben előfordulhat, hogy magán a földelő vezetéken jut be zavarjel a panelre. Ilyen esetben a föld ágba is be lehet egy 10R-47R ellenállást iktatni. Ipari rendszereknél optocsatolókkal leválasztott bementeket is szokás alkalmazni, de én most nem ilyen szintű, hanem csak egy otthoni, olcsó, hobby célú készüléket szeretnék tervezni. A PLC 12V tápról fog működni, és számos más eszközhöz is csatlakozhat, ami adott esetben akár 12V szintű jelet szolgáltat. Ezért a bemeneti jelet egy 4,7V zener diódával megfogjuk. A bementi ellenállás kifejezeten kisebb teljesítményű legyen, mert extrém feszültség esetén (mint egy biztosíték) inkább égjen ki és védje meg a uC-t. Ha valahonnan sikerülne fordított polaritású (-V) feszültséget rávezetnünk, akkor a zener (diódaként) azt is -0,6V körül limitálja. Ha nagyon spórolós lennék, a zener elhagyásával a uC beépített védődiódáira is rábízhatnám ezt a feladatot. Ez ellen szól, hogy a tápfesz feletti bemenőfeszültséget a bemeneti védődiódák tápfesz +0,6V szinten megfogják, de áramot pumpálnak a tápba. Nagyobb áram a uC tápfeszültségét megemelné, amitől esetleg gallyra mehetne. A 33k ellenállással alaphelyzetben földre húzzuk a bemenetet. Egy trimmer potit kötöttem a bementre és kimértem az ATmega8 bementét. Érdekes dolgokat ír az adatlap, de azzal ellentétben 5V tápfesz melett 2,5V környékén billen át a bemenet, alatta L-t, felette H-t érzékel. A kapcsolásomban alkalmazott értékek mellett mérve 3V alatti feszültségnél billen lefelé a bemenet, és 3,3V felett billen felfelé, tehát még egy kis hiszterézis is van benne.

A kimenetet sokféleképpen meg lehetne oldani. A relé előnye, hogy galvanikus leválasztást biztosít (életvédelem...), és viszonylag tetszőleges egyen/váltó áram kapcsolását lehetővé teszi. Továbbá az átkapcsoló (morse) érintkező, bekötéstől függően lehetővé teszi az áramkör be, illetve kikapcsolását is. 12V-os relé került alkalmazásra, ami méréseim szerint 50mA áramot fogyasztott. Ezért elegendő kapcsoláshoz egy BC182 tranzisztor. Ez sem mai darab, de ilyen volt a láda fiában. Nézegettem a LOMEX-nél, ilyen feladatra alkalmas a BC337 (sőt sokkal többet is tud), de szinte bármelyik tranzisztor jó. Inkább az nehezebb, ha olyan tranzisztort akarunk keresni amelyik nem viseli el az 50mA/20V-t. A relé tekercse, mint minden más induktivitás is, kikapcsolásnál combos feszültségtüskéket tud generálni. A tranzisztor és a többi áramkör védelmére, a feszültség tüskék levágására került beépítésre záróirányba az 1N4001 dióda. Elvileg itt nem alakul ki nagy áram, de valami homályos emlékképem miatt mégsem célszerű egy kis 1N4148-ra bízni a feladatot. Tesztelésnél, beüzemelésnél nagy segítséget tud nyújtani, az indikátor LED, nem célszerű elhagyni.

Életkép az asztalomon, vagy inkább csendélet:

Az igen nagy bonyolultságú teszt progi:


/*******************************************************************************
*   Author       -  Kiraly Tibor
*                   http://www.tkiraaly.hu
*   Date         -  2013.03.01.
*   Chip         -  Atmel ATmega8
*   Compiler     -  avr-gcc ( WinAVR)
*
*   A8_inout test prg.
*
********************************************************************************
#define F_CPU          4000000                   // orajel 4MHz
#include "tkiraaly_atmega8.h"
#include <util/delay.h>
 
#define LED                  0
#define LED_ENABLE           BS( DDRB, LED)
#define LED_KI               BC( PORTB, LED)
#define LED_BE               BS( PORTB, LED)
#define SW                   BTC( PIND, 7)
 
int main( void)
{
   LED_ENABLE;
   for(;;)
   {
//      LED_BE;
//      _delay_ms( 500);
//      LED_KI;
//      _delay_ms( 500);
   if( SW) LED_BE;
   else LED_KI;
   }
}