Elektrolab
wz




  • Jedeme pod
  • Firefox
  • Chrome
  • Opera

Ovladač hlavy kamerového jeřábu

Původní ovladač měl joystick řešený spínači a střída PWM se nastavovala externími potenciometry pro každou osu zvlášť. Nebylo tedy jednoduché plynule ovládat pohyby hlavy v jedné ose, natož pak ve dvou. Cílem tohoto projektu tedy bylo sestavit lepší, přesněji řečeno jednodušší ovládání dvouosé kamerové hlavy a nahradit do té doby používaný ryze analogový ovladač. Navrhnul jsem tedy ovládání řízené µP (mikroprocesorem).


Obrázek

Princip je velice jednoduchý. µP čte hodnoty na svých analogových vstupech, ke kterým je připojen dvouosý joystick a fader (tahový potenciometr). K faderu se dostanu později. Analogové hodnoty napětí v rozsahu 0 V - 5 V se převedou na digitální v rozsahu osmi bitů, tedy 0 - 255. Protože jsem pro řízení použil driver L6203 a jednoduchý pasivní LP filtr před každým A/D vstupem, nemusí se provádět další sw (softwarové) úpravy a jedoduše se přečtená hodnota překopíruje do příslušného osmibitového T/C (Timer/Counter) registru. T/C jsou v módu 8 bit fast PWM. Více v odstavci o software.


Obrázek Obrázek

Jezdce potenciometrů jsou ve stabilní poloze uprostřed své trasy. To odpovídá analogové hodnotě napětí zhruba 2.5 V » ta odpovídá digitálním hodnotám 127 - 128 a tyto hodnoty reprezentují střídu PWM kolem 50 %. Jelikož se jedná o bipolární řízení, pohon při takové hodnotě stojí. Při hodnotách vzdalujících se od 50 % se pohon roztáčí a zrychluje na jednu (49 % - 0 %), nebo druhou (51 % - 100 %) stranu.
Bipolární řízení je řízení, kdy se na svorkách pohonu neustále přepíná polarita. Při 50 % je k motoru stejně dlouho připnuto "+/-" i "-/+". Využívá se indukčnosti vinutí jako akumulačního prvku a (v ideálním případě) při střídě 50 % motorem neprotéká žádný proud, protože střední hodnota napětí je nulová.

Zdroje
Původně jsem měl v plánu pořídit toroidní transformátor 12 V / 50 VA, ale po přepočítání financí a zvážení ostatních aspektů (váha, rozměry, teplo) vyšlo najevo, že bude daleko snažší pořídit hotový pulzní zdroj s výstupnímy parametry 12 V / 4 A. Při návrhu bylo třeba promyslet i podmínky a místa, na kterých se zařízení bude používat. Pro snažší práci v terénu, nebo pro případ vzdálené zásuvky jsem se rozhodl do ovladače implementovat Li-Pol baterii o dostatečné kapacitě, která dokáže zařízení napájet celé hodiny. Aby se ušetřila kabeláž, umístil jsem napájecí zdroj i nabíječku baterie do krabičky ovladače. Oba zdroje nemají vlastní krabičku. Abych vytvořil (nějaké) stínění mezi oběma zdroji a hlavně mezi zdroji a destkou s µP, naohýbal jsem plechy z PC zdroje a vytvořil tak alespoň základní stínění a pospojování důležitých míst na DPS se zemí. Nula sekundární strany zdroje se zemí spojena není.


Obrázek Obrázek

Jelikož se jedná o Li-Pol baterii, je třeba hlídat napětí jednotlivých článků. Ochranu proti poškození vybitím obstarává tlačítkem programovatelný modul s displayem a bzučákem. Modul při přivedení napájení zapípá, detekuje počet článků, pak postupně zobrazuje napětí celé baterie a jednotlivých článků. Tlačítkem je možné nastavit hodnotu napětí (pro články), při které se spustí alarm. Tento modul je možné sehnat v běžném modelářství za velice příznivou cenu, obvykle kolem stokoruny.

Prvky na horním panelu
Pro snížení odebíraného proudu a prodloužení provozuschopnosti zařízení obsahuje ovladač červené Enable tlačítko. Toto tlačítko při stisku zemní pin D7. Sw se pak při jeho stisku nahodí log. "1" na pinu B0 a tím přivede 5 V na EN (enable) vstupy motorových driverů. Zároveň se rozsvítí červená LED dioda umistěná nad tlačítkem. Všimnout si můžete také tří dvoubarevných LED diod, které jsou součástí nabíječky. Při zapnutí nabíječky indikují červeně nabíjení a zeleně ukončené nabíjení. Mezi nimi a modulovým hlídačem napětí je umístěn čtyřpólový přepínač, který určuje, zdali se bude zařízení napájet z baterie, nebo zdroje. Zároveň přepíná jednotlivé články k nabíječce, nebo hlídači napětí.


Obrázek Obrázek

Fader je zde pro ovládání třetí osy. Původně navržený pro třetí pohon otáčející prstencem clony, protože byl problém s cloněním přes LANC. Nakonec se tato osa využila také pro ovládání motorizovaného slideru.

Otočným přepínačem (4 polohy, 3 cesty) se přepínají kapacity LP (low pass) filtrů na výstupech z joysticku a faderu. Prodlužuje, nebo zkracuje se tak časová konstanta přechodového děje a tím mění plynulost rozjezdu a dojezdu pohonů. Pro lepší představu jsem zakreslil jednu cestu, například od faderu jako snímače polohy k třetímu pinu A/D převodníku. Jedná se o integrační článek s časovou konstantou R × C. Jednoduše se tak dají určit hodnoty R i C pro různě zpožděné reakce. Vylepšením by pak bylo mít místo R potenciometr, který by možnosti nastavení přivedl na ještě vyšší úroveň.


Obrázek

Prvky na zadním panelu
Na zadním panelu se nachází veškeré konektory. Napájecí síťový, RCA výstupy pro pohony, pouzdro pro pojistku, konektor s 12 V pro napájení externích zařízení (např. náhledový monitor) a servisní 9 pin D-Sub pro programování procesoru a případné ovládání z PC po USARTu. Není pak problém přes miniaturní USB převodník ovládat naklopení kamery stiskem šipek na klávesnici počítače.


Obrázek Obrázek

Procesor a EMC
Veškeré signály zpracovává stará dobrá ATmega8 běžící na 8 MHz. Pro minimalizaci rušení jsou veškeré vodiče pro rozvod PWM stíněné, napájecí smyčky plakticky nulové, desky jsou bohaté na blokovací kapacity a po DPS je rozlitá "nula".
Jak tak zpětně vzpomínám na bádání při prvním programování, dám si za úkol napsat článek o základním naprogramování tohoto procesoru, pokud jde o prostředí, překlad, vlastní programování a nastavení pojistek. Mohl bych tak rozšířit hromádku webů, na kterých takový popis je. Bohužel ne všechny popisy jsou kvalitní.


Obrázek Obrázek

Software
Program je skutečně velice jednoduchý. Po zapnutí napájení proběhne základní inicializace a rozsvítí se zelená LED dioda. V hlavní smyčce se pouze testuje stisk EN tlačítka. Veškerá obsluha probíhá v přerušení, které je vyvoláno vždy po dokončení A/D převodu.

Přikládám kód inicializace procesoru, která probíhá v hlavní funkci "main()" před "while(1)". Snažil jsem se to hezky rozepsat, abych méně zkušeným ušetřil bádání hlavně pokud jde o nastavování PWM a A/D převodu. Platí pro fosc 8 MHz, protože AD převod má podle datasheetu pracovat v rozsahu 50 kHz - 200 kHz a T/C mají nastaveny předděličky tak, že se PWM nachází nad slyšitelným pásmem. Regulace motorů se tak jeví jako naprosto tichá.

Jen bokem. Co dělá např. ACSR |= (1<<ACD);? Znamená to, že v registru ACSR (Analog Comparator Control and Status Register), který obsahuje osm bitů, které nesou názvy ACD, ACBG, ACO, ACI, ACIE, ACIC, ACIS1 a ACIS0 se nastaví, neboli zapíše se jednička do sedmého bitu. Ten nese krycí název ACD (Analog Comparator Disable). Z názvu už vyplývá, že nastavením tohoto bitu se vypíná analogový komparátor. Ostatní bity zůstanou v původním stavu.
Pro zpřehlednění částí kódu jsem použil zbarvení, které známe z vývojového prostředí AVR studia 5.

int main(void){

sei();// Povolení všech přerušení - ve své podstatě nastavní sedmého bitu v registru SREG

ACSR |= (1<<ACD);// Analogový komparátor vypnut

OCR1AL = 127;    // Defaultně střída cca 50 % na všech kanálech
OCR1BL = 127;    // ...
OCR2 = 127;      // ...
TCCR1A = 0b10100001;// OC1A i OC1B > non invert mode - Nastavení pro 8 bit fast PWM společně s TCCR1B[4:3]
TCCR1B = 0b00001001;// Jednička na konci určuje připojení na Fosc bez předděličky - z toho plyne PWM s frekvencí cca 32 kHz
TCCR2 = 0b01101001;// non inverting mode, fast pwm, fosc/1

DDRB |= (1<<PB0);    // jako výstup (pro Enable LED)
DDRB |= (1<<PB1);    // jako výstup (pro PWM X)
DDRB |= (1<<PB2);    // jako výstup (pro PWM Y)
DDRB |= (1<<PB3);    // jako výstup (pro PWM Iris)

DDRD |= (1<<PD1);    // PD1 jako výstup pro TX (USART)
DDRD |= (1<<PD6);    // PD6 jako výstup pro zelenou LED

ADMUX |= (1<<ADLAR);  // Zarovnání 10 bit převodu z leva = 8 MSB v ADCH
ADMUX |= (1<<REFS0);  // Napájení ADC z AVCC s kapacitou na AREF pinu
ADCSRA |= (1<<ADEN);  // Povolení ADC
ADCSRA |= (1<<ADIE);  // Povolení přerušení od ADC
ADCSRA |= (1<<ADPS2); // ..
ADCSRA |= (1<<ADPS1); // Tyhle 3 nastavují max. možné dělení Fosc/128 =
ADCSRA |= (1<<ADPS0); // = 62500 Hz, což je v rozsahu 50 - 200 kHz.
ADCSRA |= (1<<ADSC);  // Start prvního AD převodu

PORTD |= (1<<PD6);    // Rozsvícení zelené LEDky

while(1){             // Vždy je kam se vrátit :)

  // Tady se testuje stisk EN tlačítka na D7 a ovládá port B0 (vývod č. 14)

}
}

Rutina přerušení:

ISR(ADC_vect){
static unsigned char i;

switch(i){
case 0:
OCR1AL = (~ADCH);    // Přiřazení hodnoty, ale otočený směr chodu
ADMUX |= 0b00000001; // Příště další kanál
break;
case 1:
ADMUX &= 0b11110000; // Smazání 2. poloviny MUXu
ADMUX |= 0b00000010; // Příště další kanál
OCR1BL = (~ADCH);    // ...
break;
case 2:
OCR2 = (~ADCH);      // ...
ADMUX &= 0b11110000; // Zpět na nultý kanál
break;
}

if(i == 2) i = 0;        // Při posledním kanálu shodit "i" na nulu
else i++;

ADCSRA |= (1<<ADSC);     // Start dalšího AD převodu
}


Z předešlého je patrná velká výhoda proti analogovému ovladači. Pokud například potřebujeme upravit směr otáčení motorů, stačí propojit ovladač s počítačem a smazat z programu tildu (vlnovku - negaci). Nebo místo lineárního převodu přidat funkci exponenciálního či logaritmického rozjezdu, připrogramovat širší či užší nulu atd. Procesor má navíc několik volných pinů nejen u A/D převodu. Není proto problém přidat další ovládací prvky, další funkce.


Obrázek Obrázek Obrázek


Web produkce

Sestavil a otestoval Jerry[mj]
20. 3. 2014


V případě jakýchkoliv připomínek nebo dotazů pište zde.