Egyenáramú motor vezérlés

2014-11-01

 

Érdekesek ezek a project-ek. Egyes alkatrészei, részei már évek óta várják, hogy összeálljon a nagy egész. Ez a project arról szól, hogy piszkálta a fantáziámat egy CNC gép elkészítése. Réges-régen, amikor még minekünk magyaroknak volt olyan büszkeségünk, mint az EMG (Elektronikus Mérőkészülékek Gyára), szakközépiskolás éveim alatt volt szerencsém 3 hónap szakmai gyakorlatra Óbudáról Sashalomra átjárnom. Ezt ugye ma már nem teheti meg az ember. Akkorban gyártottak ott szerszámgép vezérléseket. Nem állítanám, hogy megértettem minden részletében, de az megmaradt bennem, hogy egyenáramú motorokat használtak a tengelyek meghajtására, és digitális encoder-ek adták a lépészámnak, fordulatszámnak megfelelő visszajelzést a vezérlésnek. Örömmel találtam évekkel ezelőtt rá a Hobby CNC lapra, ami azóta sokkal kiforrottab és üzletibb lett. Anno meglepett, hogy a CNC gépekhez léptető motorokat használnak. Egyszer amikor még elmondhattam magamról hogy fejlesztő mérnök voltam és nem papírok tologatásával kerestem a kenyerem, volt egy feladatom, ahol egy koordináta asztal felett kellett egy kamerát mozgatni. Azt MOM gyártmányú léptető motorokkal oldottuk meg. Én mondjuk csak a léptető motorok vezérlését csináltam belőle. Vannak persze erősebb, gyorsabb léptető motorok, de az én tapasztalataim szerint egy szerszámgéphez nem elég nagy a teljesítményük és a sebességük. Nekünk flexibilis tengelykapcsolókat kellet használnunk, mert különben a motorok nem tudták megindítani az orsókat. Egy körülfordulás 200 lépés volt, és másodpercenként maximum 200 lépést tudtak elfordulni. Szóval én inkább kimustrált olcsó akkumlátoros fúrók motorjában gondolkoztam. Azután hogy lesz-e valaha saját építésű CNC gépem, a csuda tudja.

Kedvcsinálónak a kapcsoló fokozat fényképe. Ezt most modellező stílusban készítettem el. Ott szokás, hogy a kis panelből arasznyi vezetékek lógnak ki, és a panelt egy zsugorcsővel védik. Azután ezt beragasszák valahova a modell repülőgépbe, vagy hajóba. Mondjuk én elég béna vagyok a kínaiakhoz képest, legalább 5mm zsugorcsövet ráhagytam feleslegesen :).


Ez a következő kép részben érzékelteti, hogy milyen kisméretű áramkörről van szó, továbbá bizonyítja, hogy az IC-k füsttel működnek (ha kijön a füst, tovább nem működnek:). Az eset úgy történnt, hogy a uC-ben még benne maradt az előző PWM program, és figyelmetlenül rákötöttem az elektronikát a motorral. A nagyon keskeny tüskékre jól reagált a motor, de az IC-ben lévő diódák már nem birták a keletkező feszültségtüskék energiáját eldisszipálni. Különben nagyon megbízható kapcslásról van szó, de hát a kezeim között mi lehet biztonságban?


Ezen a képen látható project. Bal felső sarokban egy 12V-os zselés aksi, rajta egy töltő áramkör. Erről terveztem a motorokat járatni, hogy ne kelljen túl izmos tápokat készíteni, de ez a jövő zenéje. Ebben a formájában jó lehet riasztó berendezéshez is. Az a fémes meg kék az képezi a motort. Alul az LCDT01 panelje, ez lett vezérlő elektronikának felhasználva.


Akkor alapozzunk elméletileg. Ha egy egyenáramú motort be/ki akarunk kapcsolni, azt igen egyszerűen egy kapcsoló segítségével tudjuk megtenni. Talán kicsit kevésbé közismert, hogy a forgó motorunkat rövidre zárva le tudjuk fékezni. Természetesen a két kapcsolót nem szabad egyszerre zárni, mert azt valamiért a tápegységek nem szeretik. Érdekesség, hogy amikor még használtunk mindenféle deprez meg más mágneses műszereket, szállításhoz egy darab dróttal illet rövidre zárni az érintkezőiket.


Ha egy motort szeretnénk hol balra, hol jobbra járatni, az úgy tudjuk megtenni, ha hol pozitív, hol meg negatív feszültséget kapcsolunk rá.


Ennek az a legnagyobb hátránya, hogy két tápfeszültséget kell építenünk hozzá. Sokkal egyszerűbb, ha két váltókapcsolóval a pólusaikat váltakozva a tápra, vagy a földre tudjuk kötni. Ezzel a kapcsolással az első ábra fékező kapcsolását is létre tudjuk hozni, mindkét kapcsolót például a földre kapcsolva. Ennek a kapcsolásnak megfelelő áramkört hívják egyébként teljes hídnak, míg az előzőt fél hídnak.


Egy tranzisztoros kapcsoló áramkör teljesen alkalmas a motorunk be/ki kapcsolásához, sőt PWM vezérléssel a teljesítményét is szabályozhatjuk bizonyos határok között. Anélkül, hogy a különböző motorok pontos működését itt tárgyalnám (főiskolás korom óta abban is bizonytalan vagyok, hogy mitől megy a villamos) azt tudjuk róluk, hogy elektromágnesek, vagyis tekercsek vannak bennük. Ezeknek van ugye egy olyan tulajdonságuk, hogy a rajtuk átfolyó áram kikapcsolására rosszul reagálnak, egy viszonylag nagy feszültségtüskét generálnak. Ez több száz V is lehet. A tranzisztor védelmét a tekerccsel párhuzamosan, záróirányba bekötött diódával szokták megoldani. Ez rövidre zárja a keletkező indukciós áramot.


Itt látható az H1 áramkör kapcsolási rajza. Utóbb eléggé hasonlít egy csöves készülékre, pedig csak azért rajzoltam kerek tokozásokat, hogy elüssön az áramköri vezetékektől. Az áramör lelke a két SI4593 SO8 SMD tokozású CMOS FET pár. Mint tudjuk teljesen egyező paraméterű P/N FET-eket nem lehet gyártani. A katlógus szerint ezek 30V feszültségig megbírkóznak hozzávetőleg 4A-es áram kapcsolásával. Feleannyiba kerül az IRF7309, hasonló paraméterekkel, mondjuk 3A áramot lehet vele kapcsolni. Ez a MMUN2211 is egy ravasz kis alkatrész, kb 10HUF, és rögtön tartalmaz a tokon belül egy 2x10kOhm-os bemeneti osztót. Ezen felül csupán két ellenállásra van az áramkörhöz szükségünk. Mivel 12V környékére terveztem a kapcsolást használni, a FET-ek bemenetének védelmére sem fordítottam figyelmet. A kapcsolást meg lehet építeni nagyobb feszültségre, nagyobb áramra diszkrét alkatrészekből (FET-ekből), még csak nagyon drágább sem lesz. Viszont akkor a GATE-jük zener diódás védelmét is meg kell csinálni. A kapcsolás kellemes tulajdonsága, hogy vezérlés nélkül, vagy legalább mindkét vezérlő bemenetre egyező vezérlést kapcsolva a motor ki lesz kapcsolva. Akkor kapcsoljuk be, ha két vezérlő bemenetre eltérő vezérlést (mondjuk TTL szintet) adunk. A forgás irány attól függ, melyik vezérlő bementre kapcsolunk feszültséget. Vegyük alaphelyzetnek, hogy egyik bemenetre sem kapcsolunk vezérlő feszültséget, vagyis 0-t kapnak. Ekkor az ellenállások a GATE-ket felhúzzák 12V-ra, az alsó N FET-tek kinyitnak, a motor mindkét sarkát földre (GND) kötik, és ezzel rövidre is zárják. Ha az egyik vezérlő bemenetre kb 1,5V-nál nagyobb fesültséget adunk, vagyis 1-be kapcsoljuk, a tranzisztor kinyit, és az adott oldalon a GATE-eket földre húzza. Ekkor lezár az alsó N FET és kinyit a felső P FET, a motor sarkát tápfeszre kapcsolja. Akár mindkét vezérlő lábra is adhatunk 1-et, akkor a motor mindkét sarkára tápfesz kerül, és nem a föld, hanem a táp felé fogjuk rövidre zárni.


Ennél a programnál én most azt a megoldást választottam, hogy az egyik vezérlő bemenetet kijelöltem irányváltónak, a másikat pedig ki/be kapcsolónak. Utólag belegondolva ezzel sokkal komplikáltabbá tettem a programot. A kapcsolás soros porton keresztül vezérelhető, háromféle dolgot tud csinálni. A - állj, B - balra forog, J - jobbra forog. A forgásirány beállítás/indításban van még egy kis várakozás is. Ennek az az értelme, hogy a forgó motor előbb lefékeződjön, majd úgy induljon az új irányba. Lehetne a programon még finomítani, mert mondjuk balra forgás közben ismét nyomunk egy B-t, akkor ugye leáll a motor, majd elindul ismét balra. Ha nem manuálisan vacakolunk, hanem valami vezérléshez használjuk a kapcsolást, akkor kihagyhatók ezek a kis várakozások, de nyilván a vezérlőnek kell figyelnie rá, hogy balról nem célszerű rögtöm jobbra kapcsolni.

/*******************************************************************************
*   Author       -  Kiraly Tibor
*                   http://www.tkiraaly.hu
*   Date         -  2014.11.01.
*   Chip         -  Atmel ATmega8
*   Compiler     -  avr-gcc (WinAVR)
*
*   Motor vezerles
*   ATmega8, LED 
*
*   Ez egy soros portrol vezérelhető motorvezerles.
*   A soros port 9600N1 beállítású.
*   Parancsok:
*   A    - allj
*   B    - balra indul
*   J    - jobbra indul
*   
********************************************************************************
*   PonyProg Configuration and Security Bits (bepipalva):
*
*   CKSEL3, CKSEL2, CKSEL1, CKSEL0
*   P       P       -       -       0011  Calibrated Internal RC Oscillator 4MHz
*
*   Calibrated Internal RC Oscillator
*   SUT1  SUT0
*   -     P         Slowly rising power
*   
********************************************************************************
*     
*    Soros port:
*     1 VCC
*     2 X
*     3 RX             - AVR RXD  - 2
*     4 TX             - ACR TXD  - 3
*     5 GND
*
*    Programozo fej:
*     1 RST            - AVR NRES - 1
*     2 X
*     3 SCK            - AVR SCK  - 19
*     4 MISO           - AVR MISO - 18
*     5 MOSI           - AVR MOSI - 17
*     6 GND
*
*    Egyeb:
*     LED              - AVR PB0 - 14
*     Csipogo          - AVR PC3 - 26
*     Motor irany      - AVR PB1 - 15
*     Motor be/ki      - AVR PB2 - 16
*
*******************************************************************************/

#define F_CPU                _4MHZ




#include "tkiraaly_atmega8.h"
#include <util/delay.h>



// LED - PB0
#define LED_ENABLE           PB0_OUT
#define LED_BE               BC( PORTB, 0)
#define LED_KI               BS( PORTB, 0)


// MOTOR
#define MOTOR_ENABLE         PB1_OUT;PB2_OUT
#define MOTOR_LEFT           BC( PORTB, 1)
#define MOTOR_RIGHT          BS( PORTB, 1)




void motor_start( void);               // motor inditasa
void motor_stop( void);                // motor leallitasa




ISR( USART_RXC_vect)                   // USART megszakitas kezelese
{
   switch( UDR)
   {
      case 'B':
      case 'b':
                motor_stop();
                _delay_ms( 100);
                MOTOR_LEFT;
                motor_start();
                break;
      case 'A':
      case 'a':
                motor_stop();
                break;
      case 'J':
      case 'j':
                motor_stop();
                _delay_ms( 100);
                MOTOR_RIGHT;
                motor_start();
                break;
   }
}    




int main( void)
{
   LED_ENABLE;
   LED_BE;
   MOTOR_LEFT;
   motor_stop();
   MOTOR_ENABLE;
   USART_SET_9600_8N1;
   IT_ENABLE;
   for(;;);
   return 0;
}




void motor_start( void)
{
   if( BTC( PORTB, 1)) BS(PORTB, 2);
   else BC( PORTB, 2); 
}




void motor_stop( void)
{
   if( BTC(PORTB, 1)) BC( PORTB, 2);
   else BS( PORTB, 2); 
}

Itt a vége, fussatok el vélem (én nem futok), legyetek az én vendégeim, innen letölthetitek a hozzávalókat összecsomagolva.