Vývojové a programovacie prostredie CodeWarrior



ŽILINSKÁ UNIVERZITA V ŽILINE ELEKTROTECHNICKÁ FAKULTA

Katedra výkonových elektrotechnických systémov Ak. rok 2007/2008

ZADANIE BAKALÁRSKEJ PRÁCE

Meno: Zdeno BIEL

Študijný program: Elektrotechnika

Téma bakalárskej práce: Úvod do programovania DSP

Pokyny pre vypracovanie bakalárskej práce:

1. DSP a jeho uplatnenie v elektrických pohonoch

2. Oboznámenie sa s architektúrou vybraného typu DSP

3. Vytvorenie jednoduchých aplikačných modulov s DSP

Zoznam odbornej literatúry:

[1] Motorola, DSP56800_Quick_Start User's Manual, Targeting Motorola DSP56F80x Platform

[2] Motorola, Motor Control Library, lst Edition for 56F8xx Motorola Hybrid Controllers

Predpokladaný rozsah práce: 30 strán

Vedúci bakalárskej práce: Ing. Pavol Makyš

Recenzent bakalárskej práce:

Dátum odovzdania bakalárskej práce: 6. 6. 2008

prof. Ing. Juraj ALTUS, PhD.

vedúci katedry

Žilina 30. 10. 2007

ZÁVEREČNÁ BAKALÁRSKA PRÁCA

Názov práce: Úvod do programovania DSP

Fakulta elektrotechnická Katedra výkonových elektrotechnických systémov

Priezvisko a meno: Biel Zdeno rok: 2008

Počet strán: 45 Počet obrázkov: 26 Počet tabuliek: 0

Počet grafov: 0 Počet príloh: 4 Použitá lit.: 5

Kľúčové slová : digitálny signálový procesor, periférie, šírkovo impulzová modulácia, analógovo číslicový prevodník, strieda, jednosmerný motorček, regulácia

Anotácia v slov.jazyku :

Práca popisuje úvod do programovania DSP rodiny Freescale 56F800, konkrétne 56F801. Popisuje šesť úloh, ktoré sú realizované na vývojovej doske PBMCUSLK s modulom CSM – 56F801. Úlohy sú zamerané na využívanie periférií tohto DSP. V každom príklade je stručná charakteristika použitých periférií, podrobný popis ich nastavení v ConfigTool doplnený obrázkami, kód programu v jazyku C a popis použitých funkcií.

Anotácia v anglickom jazyku:

Work deals with introduction to programming DSP Freescale 56F800 family, concretely 56F801. It describes six excercises, that are realized on development kit PBMCUSLK with CSM – 56F801 module. Excercises are target the utilization of peripherals. In every excercise are short description of used peripherals, detailed description of settings in ConfigTool with pictures, program code in C laguage and description of used functions.

Vedúci bakalárskej práce : Ing. Pavol Makyš

Školiteľ : ...................................................

Oponent : ..................................................

Dátum odovzdania práce : 6. 6. 2008

Obsah

ÚVOD 1

1 VLASTNOSTI DSP 56F801 2

2 VÝVOJOVÉ A PROGRAMOVACIE PROSTREDIE CODEWARRIOR 4

2.1 Popis a štruktúra programu v CodeWarrior 4

3 VYTVORENIE PÍLOVÉHO PRIEBEHU A JEHO VIZUALIZÁCIA V PROGRAME FREEMASTER 6

3.1 Zobrazenie priebehu premennej pomocou programu FreeMASTER 7

4 BLIKANIE LED S VYUŽITÍM PORTU A ČASOVAČA 13

4.1 Nastavenie portu v Graphical Configuration Tool 13

4.2 Nastavenie časovača v Graphical Configuration Tool 16

5 ANALÓGOVO ČÍSLICOVÝ PREVODNÍK (ADC) 22

5.1 Nastavenie ADC v Graphical Configuration Tool 22

5.2 Vytvorenie programu na prevod analógového signálu 24

6 ŠÍRKOVO IMPULZOVÝ MODULÁTOR (PWM) 26

6.1 Šírkovo impulzová modulácia (PWM) 27

6.2 Generovanie PWM signálu 27

6.3 Nastavenie PWM v Graphical Configuration Tool 29

6.4 Zmena intenzity svitu LED pomocou PWM 31

7 RIADENIE OTÁČOK JEDNOSMERNÉHO MOTORČEKA POMOCOU PWM 33

8 REGULÁCIA PRÚDU MOTORČEKA 36

8.1 Meranie prúdu kotvy motorčeka 36

8.2 PI regulátor 38

Zoznam použitých skratiek a symbolov

ADC Analog to Digital Converter – analógovo číslicový prevodník

DSP Digital Signal Processor – digitálny signálový procesor

GPIO General Purpose Input/Output – univerzálny vstup/výstup

IM Impulzový menič

LED Light Emitting Diode – dióda vyžarujúca svetlo

PC Personal Computer – osobný počítač

PI Proporcionálno-integračný

PWM Pulse Width Modulation – šírkovo impulzová modulácia

QT Quad Timers – kvadratúrny časovač

USTR Stredná hodnota napätia

TZ Doba zopnutia meniča

TV Doba vypnutia meniča

T Perióda PWM signálu

λ Pomerná doba zopnutia meniča

I*a Žiadaná hodnota prúdu kotvy

Ia Prúd kotvy

eIa Regulačná odchýlka prúdu

Ra Odpor kotvy

La Indukčnosť kotvy

Me Elektromagnetický moment

ω Uhlová rýchlosť

Mz Záťažový moment

Ui Indukované napätie

yn Výstupná (filtrovaná) veličina

yn-1 Výstupná veličina v predchádzajúcom výpočtovom kroku

xn Vstupná veličina filtra

e(k) Regulačná odchýlka vo výpočtovom kroku k

w(k) Žiadaná hodnota vo výpočtovom kroku k

m(k) Skutočná hodnota vo výpočtovom kroku k

u(k) Výstup regulátora vo výpočtovom kroku k

uP(k) Proporcionálna zložka výstupu v kroku k

uI(k) Integračná zložka výstupu v kroku k

uI(k-1) Integračná časť výstupu v kroku k-1

TI Integračná časová konštanta

T Perióda vzorkovania

KC Zosilnenie regulátora

Úvod

V poslednom období stále rýchlejšie narastá počet aplikácií digitálnych signálových procesorov. Vo veľkej miere sú DSP využívané v priemyselných aplikáciách, v komunikačnej technike a hlavne v automobilovom priemysle, kde ich počet narastá najrýchlejšie. Už dnes ich môžeme nájsť v jednom automobile niekoľko desiatok. Taktiež sa začínajú častejšie využívať aj v oblasti spotrebnej elektroniky. Toto smerovanie vývoja techniky samozrejme vyžaduje nadobúdanie vedomostí z tejto oblasti.

Vývojom a výrobou DSP sa v súčasnosti zaoberá viac firiem. Jednou z nich je aj firma Freescale, ktorá má vo svojej širokej ponuke aj DSP rodiny 56F800, ktoré v sebe kombinujú výpočtový výkon signálových procesorov s vlastnosťami mikroprocesorov určených pre riadiace aplikácie. Preto sú označované aj ako DSC – Digital Signal Controller. Tento procesor vďaka veľkému počtu periférií nachádza uplatnenie najmä v aplikáciách ako riadenie jednosmerných, striedavých, krokových motorov, napájacie zdroje, regulácia teploty, automatizácia výrobných postupov atd. V práci je využívaný DSP tejto rodiny s označením 56F801.

1 Vlastnosti DSP 56F801

56F801 je členom rodiny procesorov 56800. Kombinuje na jednom čipe pracovný výkon DSP a funkčnosť mikroradiča so sadou periférnych zariadení a vytvára tak extrémne ekonomické riešenie. Tento procesor obsahuje mnoho periférnych zariadení ktoré sú užitočné pre aplikácie ako riadenie pohybu, krokové motory, kodéry, tachometre, koncové vypínače, automobilová kontrola, priemyslová regulácia, automatizácia. [5]

Jadro

• 16-bitové jadro s dvojitou Harvardskou architektúrou

• 40 miliónov inštrukcií za sekundu (MIPS) a 80Mhz kmitočet jadra

• Jednoduchý cyklus 16 × 16 - bitový paralelný Multiplier - Accumulator (MAC)

• Dva 36- bitový akumulátory vrátane bitového rozšírenia

• 16 - bitový obojsmerný posunovač

• Paralelný inštrukčný súbor s jedinečnými DSP adresovými režimami

• Tri vnútorné adresové zbernice a jedna externá adresová zbernica

• Štyri vnútorné dátové zbernice a jedna externá dátová zbernica

• Softwarový podprogram a zásobník prerušenia s hĺbkou obmedzenou iba pamäťou

Pamäť

• Harvardská architekt povolí až tri súčasné prístupy do programu a dátovej pamäti

• Čipová pamäť zahrnuje lacné high-volume flash riešenie :

8K × 16 bit Programová Flash

1K × 16-bit Programová RAM

2K × 16-bit Datová Flash

1K × 16-bit Datová RAM

2K × 16-bit Boot Flash

Periférie pre 56F801

• Šírkovo impulzový modulátor (PWM) so šiestimi PWM výstupmi, dvoma chybovými vstupmi

• Dva 12-bitové AD prevodníky, AD prevodník a PWM môžu byť synchronizované

• Štvornásobný časovač: Timer D

• Sériové komunikačné rozhranie (SCI)

• Sériové periférne rozhranie (SPI)

• Externé resetovanie

• Externé prerušenie

• JTAG/EONCE ladiace programové rozhranie pre real – time

Energetické informácie

• Veľkokapacitné CMOS s 5V toleranciou

• Režimy WAIT a STOP

• Každá periféria môže byť vyradená a zmenší tak spotrebu

2 Vývojové a programovacie prostredie CodeWarrior

Tvorba programu pre danú aplikáciu môže byť realizovaná:

1. Využitím jazyka symbolických adries – Inštrukcie, adresy a dáta sú reprezentované abecednočíslicovými symbolmi. Jazyk symbolických adries je potom do strojového kódu preložený špeciálnym programom – assemblerom.

2. Prostredníctvom tzv. vyššieho programovacieho jazyka . V súčasnej dobe sa používa takmer výhradne jazyk C. Vytvorený zdrojový text programu je preložený prekladačom jazyka C do jazyka symbolických adries a z neho pomocou assembleru do strojového kódu.

Firma Metrowerks sa špecializuje na vývoj programovacích prostredí. Jedným z jej produktov je aj programovacie prostredie pre vývoj aplikácií pre signálové procesory Motorola (CodeWarrior for motorola DSP Embedded Systems).

2.1 Popis a štruktúra programu v CodeWarrior

Vytvorenie nového projektu:

1. Spustíme program CodeWarrior IDE

2. Zvolíme File – New

3. V záložke Project zvolíme šablónu MC56F801

4. Pomenujeme projekt a určíme miesto, kam sa má uložiť

Teraz sa už v ľavej časti obrazovky (obr.2.1.) zobrazí prednastavená štruktúra nového projektu, ktorá obsahuje nevyhnutné súbory a knižnice. Pre nás je v tejto chvíli najdôležitejší súbor main.c, kde sa píše vlastný užívateľský kód a súbor appconfig.h, kde sa prevádzajú konfigurácie periférií.

Štruktúra programu

Program je písaný v programovacom jazyku C a jeho kód sa nachádza v súbore main.c .

Keď tento súbor otvoríme zobrazí sa jeho obsah v pravej časti obrazovky (obr.2.1.). Súbor už obsahuje príkazy preprocesora pre vloženie hlavičkových súborov, deklaráciu funkcie

InitProject, funkciu main v ktorej sú volané funkcie InitProject a pcmasterRecorder a nakoniec definíciu funkcie InitProject.

Funkcia InitProject vykonáva inicializáciu a sprístupnenie periférií obsiahnutých na čipe DSP. Obsahuje príkazy pre inicializáciu jednotlivých periférií (PWM, ADC, GPIO atd.)

Funkcia už obsahuje tieto preddefinované príkazy:

ioctl(ITCN, ITCN_INIT_GPRS, NULL); - nastavenia stupňa priority prerušenia podľa definícií v súbore appconfig.h.

ioctl(ITCN, ITCN_INIT_IPR, NULL); - aktivuje prerušovacie kanály a vykoná konfiguráciu externých prerušení podľa definícií v súbore appconfig.h.

ioctl(SCI_0, SCI_INIT, NULL); - inicializácia sériového komunikačného rozhrania.

archEnableInt(); - aktivácia prerušení.

Funkcia pcmasterRecorder umožňuje vzorkovanie žiadaných premenných, využíva vnútorný buffer recorderBuff, definovaný v súbore pcmaster.c. V spolupráci s programom FreeMASTER umožňuje zobrazovať obsahy daných premenných a ich zmenu počas chodu programu. Funkcia je periodicky volaná vo funkcií main.

Funkcia main je miesto kde píše užívateľ kód vlastného programu.

Syntax príkazu ioctl má nasledovný tvar:

ioctl(peripheral_module_identifier, command, command_specific_parameter);

Kde parameter :

peripheral_module_identifier je bázová adresa periférneho modulu, kde môžeme namiesto priameho napísania adresy (napr.0x0D60) použiť preddefinované symbolické konštanty ako GPIO_A, QTIMER_C0, PWM_A, ADC_A atd.

Command špecifikuje činnosť, ktorá sa má vykonať v danom perifernom module.

3 Vytvorenie pílového priebehu a jeho vizualizácia v programe FreeMASTER

Tu bude na jednoduchom príklade ukázaná práca s programom FreeMaster, a popísané hlavné nastavenia, ktoré je potrebné v programe vykonať.

Program FreeMASTER umožňuje v reálnom čase zobraziť obsah premenných pri odlaďovaní programov, ich editovanie a zadávanie obsahu. Umožňuje tiež grafické zobrazenie priebehu premennej v závislosti od času, alebo v závislosti od inej premennej.

Pílový priebeh vytvoríme tak, že budeme cyklicky inkrementovať obsah celočíselnej premennej typu integer a keď dosiahne danú maximálnu hodnotu tak jej obsah vynulujeme.

Ak už máme v programe CodeWarrior vytvorený nový projekt a otvorený súbor main.c môžeme začať s písaním programu. Najskôr vykonáme deklaráciu premennej ktorá je v tomto príklade nazvaná inkr. Pre inkrementáciu tejto premennej využijeme cyklus while, ktorý sa už nachádza vo funkcií main. V tomto cykle je periodicky volaná funkcia pcmasterRecorder , ktorá zabezpečuje vzorkovanie danej premennej a komunikáciu s PC.

int inkr=0; /* deklarácia premennej */

/* main function definition */

void main (void)

{

/* initialize hardware */

InitProject ();

while (1)

{

pcmasterRecorder();

inkr++; /* inkrementácia premennej */

if(inkr>1000) /* ak premenná presiahla hodnotu 1000 */

inkr=0; /* jej obsah sa vynuluje */

}

}

Program spustíme buď kliknutím na ikonu debug, klávesom F5, alebo zvolíme Project – Debug. Pokiaľ je program napísaný správne, potom sa skompiluje a nahrá do programovej pamäte v DSP. Po nahraní programu sa zobrazí okno debuggera, kde je možné program krokovať alebo spustiť jeho vykonávanie. Vykonávanie programu spustíme buď pomocou ikony Run, alebo opäť klávesom F5, alebo zvolíme Project – Run. Teraz sa už zobrazí hlásenie že program sa vykonáva. Program je možné zastaviť pomocou ikony Break v menu debuggera, alebo zvolíme Debug – Break. Okno debuggera môžeme zavrieť pomocou ikony Kill Thread. Program sa však bude aj naďalej vykonávať.

3.1 Zobrazenie priebehu premennej pomocou programu FreeMASTER

- Spustíme program FreeMASTER

- V menu zvolíme položku Project – Options

- Zobrazí sa okno nastavení. V záložke Comm sa vykonávajú nastavenia parametrov komunikácie medzi programom a vývojovou doskou. Tu by mala byť nastavená komunikácia Direct RS232, príslušný port COM ku ktorému je vývojová doska pripojená, a komunikačná rýchlosť.

- Ďalej je potrebné v záložke MAP Files zadať umiestnenie súboru z ktorého budú načítané premenné použité v projekte (Default symbol file:). Tu nastavíme cestu k súboru xFlash.elf , ktorý sa nachádza v podadresári Debug adresára projektu. Napr. C:\ProgramFiles\Metrowerks\prvy projekt\Debug\xFlash.elf (obr.3.1.)

- Formát súboru (File format:) zvolíme :Binary ELF with DWARF1 or DWARF2 dbg format

- Potvrdíme – OK

Pridanie premennej pre zobrazenie

- V pravom dolnom okne (obr. 3.6.), kde sa zobrazujú premenné a ich hodnoty, klikneme pravým tlačidlom myši a zvolíme Create New Watched Var...

- Zobrazí sa okno nastavení (obr. 3.2.).

- V položke Address vyberieme zo zoznamu premennú, ktorú chceme zobraziť, v tomto prípade zvolíme premennú inkr. Typ premennej (Type:) ponecháme unsigned fixed point a veľkosť (Size:) ponecháme 2 bytes.

- V položke pre nastavenie periódy vzorkovania (Sampling period:) zvolíme možnosť fastes.

Ďalej je možné vykonať nastavenia (pre tento príklad ponecháme predvolené hodnoty):

- Show as: -formát, v akom má byť premenná zobrazená (DEC, HEX, BIN, ASCII, REAL).

- V skupine Bit fields je možné pomocou shift it: a mask with: vybrať bity z premennej ktoré chceme zobraziť.

- V sekcií Show sú na výber možnosti:

- val – zobrazuje sa aktuálna hodnota premennej

- min- zobrazuje sa minimálna hodnota premennej

- max - zobrazuje sa maximálna hodnota premennej

- Real type transformation – vykonáva transformáciu celočíselnej premennej

- Linear: ax+b – Hodnota premennej bude y=ax+b, kde a,b sú zadané konštanty alebo premenné

- Lin: two points – Lineárna transformácia je zadaná pomocou súradníc dvoch bodov (x1,y1),(x2,y2).

- hyp: d/(ax+b) + c: - Hyperbolická transformácia y= d/(ax+b) + c

V záložke Modifying je možné nastaviť:

- Modifying mode:

- Don’t allow any modifications – Premenná je iba načítavaná, ostatné nastavenia sú deaktivované.

- Any value within proper limits – Môže byť zadaná minimálna a maximálna hodnota, ktorú bude možné zapísať do premennej.

- One of listed values only – Umožňuje špecifikovať hodnoty, ktoré sa budú dať zapísať do premennej. Tieto hodnoty je možné nastaviť v skupine Pre-Defined values.

- Edit stile – Tu je možné meniť štýl editácie premennej.

- Write - Nastavenie štýlu zápisu premennej.

- Ak sme vykonali potrebné nastavenia, potvrdíme - OK

- Teraz sa už premenná inkr zobrazí a môžeme sledovať ako sa mení jej obsah.(obr. 3.6.)

Grafické zobrazenie časového priebehu premennej

Pre zobrazenie časového priebehu premennej môže byť použitý:

Scope - Umožňuje vizualizáciu premennej v reálnom čase podobne ako na osciloskope. V tomto prípade je však frekvencia obmedzená rýchlosťou sériového komunikačného rozhrania. Hodnota premennej je periodicky načítavaná a zobrazovaná graficky.

Recorder – Umožňuje vizualizovať premennú, ktorej hodnota sa mení rýchlejšie ako je vzorkovacia frekvencia pri požití Scope. Hodnota premennej je navzorkovaná do pamäte v DSP a až potom sú dáta vyslané do PC a zobrazené ako časový priebeh. Tento spôsob umožňuje oveľa kratšiu periódu vzorkovania.

Keďže sa hodnota premennej inkr, ktorej priebeh chceme zobraziť mení rýchlejšie ako je vzorkovacia frekvencia pri použití Scope, použijeme pre jej vizualizáciu Recorder.

- V menu zvolíme položku Item – CreateRecorder

- Zobrazí sa okno nastavení pre Recorder

V záložke Main (obr. 3.3.) je potrebné nastaviť:

- Name – Tu môžeme napísať názov

- Recorder global properties:

- Time base multiple – Nastavenie násobiacej konštanty časovej základne pre zväčšenie periódy vzorkovania. Nastavíme tu hodnotu 30 aby sa zobrazili asi tri periódy priebehu.

- Recorded samples – Počet zosnímaných vzoriek ktoré budú naraz odoslané do PC.

Maximálna hodnota závisí od veľkosti pamäte recordera vývojovej dosky. Tu môžeme ponechať hodnotu 100.

Ďalej je možné nastaviť:

- Legend location – Umiestnenie legendy.

- Grid – Zobrazenie vertikálnej a horizontálnej mriežky

- Graph type – Typ grafu: Time graph –Časová závislosť , X-Y graph – Závislosť X-Y

- Graph setup: X-axis label – popis osi X , X-axis units – jednotky osi X

Záložka Setup (obr. 3.4.):

- V položke Graph vars: vyberieme premenné, ktoré chceme graficky zobraziť. V tomto prípade máme na výber len premennú inkr.

- V skupine Y-block Left Axis môžeme nastaviť minimálnu a maximálnu hodnotu osi Y (tu môžeme ponechať aktivované auto) a štýl grafu.

- Left axis label – Popis osi Y

- Assign vars to block – Zoskupenie premenných do bloku.

Záložka Trigger (obr. 3.5.):

Umožňuje definovať podmienky, kedy sa začne premenná zaznamenávať.

- Trigger variable – Premenná, ktorá bude spúšťať záznam. Nastavíme premennú inkr.

- Threshold value – Hodnota premennej, pri ktorej bude spustený záznam. Nastavíme napr. hodnotu 1.

- Treshold value is in the raw format (no shift, masking and transformations) – Hraničná hodnota je v základnom tvare ( nie je posunutá, nie je použitá transformácia ). Toto platí pre premennú inkr, preto označíme túto možnosť.

- Back translate the trshold value into raw treshold value –Spätný preklad hodnoty do základného tvaru.

- Treshold crossing slope – Nastavenie sklonu priebehu na ktorom bude zosnímaná hodnota pre spustenie záznamu. Nastavíme možnosť positiv slope.

- Pretrigger samples – Nastavenie počtu vzoriek, ktoré budú uložené a zobrazené pred spúšťacou hodnotou. Zadáme hodnotu 0.

- Auto run

- Auto run mode (reactivate trigger after signal download) – Po zistení spúšťacej hodnoty sa naplní buffer a hodnoty sú poslané do PC a zobrazené. Ak je Auto run mode aktivovaný, po opätovnom zistení spúšťacej hodnoty sa cyklus opakuje. (Ponecháme aktivovaný)

- Hold triggered signal – Nastavenie čakacej doby medzi zobrazením hodnôt a spustením ďalšieho vzorkovania. Pre tento príklad môžeme ponechať hodnotu 1sec.

- Automatic stopping – Nastavenie času, počas ktorého ak nie je detekovaná spúšťacia hodnota, vzorkovanie bude zastavené a zobrazí sa aktuálny obsah buffera. (Môžeme ponechať prednastavenú hodnotu 10sec)

Ak sme vykonali potrebné nastavenia - potvrdíme - OK

Teraz by sa už mal na obrazovke zobraziť pílový priebeh premennej inkr (obr. 3.6.).

4 Blikanie LED s využitím portu a časovača

Na príklade blikania LED na vývojovej doske budú ukázané potrebné nastavenia vstupno-výstupného portu (GPIO - General Purpose Input Output) a časovača (QT – Quad Timer ).

Na vývojovej doske Microcontroller Student Learning Kit (MCUSLK) vodičom prepojíme pin 13 konektora J6 (MCU PORT) s pinom označeným ako LED 1 na konektore J10 (USER I/O). Tým privedieme signál z pinu 1 portu A na LED1.

Pre nastavenie parametrov týchto periférií použijeme softvérový nástroj Graphical Configuration Tool, ktorý umožňuje jednoduché a rýchle nastavovanie parametrov periférií prostredníctvom grafického prostredia. Graphical Configuration Tool pracuje so súborom appconfig.h. Podľa vykonaných nastavení v grafickom prostredí vygeneruje hodnoty, ktoré budú zapísané do príslušných registrov DSP pre konfiguráciu periférií.

GPIO - General Purpose Input Output

DSP 56F801 - Nemá žiadne vyhradené GPIO, ale má 11 multiplexovaných pinov, tri na porte A (PA0 – PA2) a osem na porte B (PB0 – PB7).

Tieto piny sú využívané perifériami, ktoré sú na čipe. Ak tieto periférie nie sú pre danú aplikáciu potrebné môžu sa využiť ako vstup alebo výstup.

Každý GPIO pin môže byť nakonfigurovaný ako:

1. Vstupný s alebo bez pull-up

2. Vstup externého prerušenia

3. Výstup

4.1 Nastavenie portu v Graphical Configuration Tool

Otvoríme  program CodeWarrior a vytvoríme si nový projekt. V menu zvolíme položku Config tool – Config tool. Zobrazí sa okno Graphical Configuration Tool (obr. 4.1.)

V ľavej časti okna sa nachádza zoznam periférií DSP 56F801. Rozbalíme položku GPIO- General Purpose I/O Port ,pod ktorou sa nachádzajú položky GPIO_A- General Purpose I/O Port A a GPIO_B- General Purpose I/O Port B. Ak klikneme na jednu z možností, v pravom okne sa zobrazia konfiguračné nastavenia pre port A alebo B (obr. 4.1.).

V časti Operation  je možné nastaviť parametre každého pinu zvlášť.

Mode - Nastavenie režimu pinu:

- Peripheral – pin je využívaný príslušnou perifériou

- GPIO – pin je využívaný ako vstup alebo výstup

Tu nastavíme pin1 portu A , ktorý bude privedený na LED, do režimu GPIO.

Direction - Nastavenie smeru signálu:

- Input – pin je nastavený ako vstup

- Output – pin je nastavený ako výstup

Pin1 portu A nastavíme ako výstupný (Output)

Pull – up :

- Enable – aktivovaný

- Disable – deaktivovaný

Initialization - Inicializácia :

- 0 – počiatočná hodnota na danom pine bude log.0

- 1 – počiatočná hodnota na danom pine bude log.1

Inicializačnú hodnotu pinu1 portu A nastavíme na hodnotu 0.

V časti Interrupts je možné nastaviť piny portu ako vstupy vonkajšieho prerušenia.

Ak sme vykonali všetky potrebné nastavenia je ešte potrebné v ľavom okne zaškrtnúť GPIO- General Purpose I/O Port aj - General Purpose I/O Port A . Teraz môžeme nastavenia uložiť (File - Save).

Inicializácia portu

Nastavenia portu, ktoré sme vykonali v Graphical Configuration Tool je potrebné zapísať do príslušných registrov v DSP. Tento zápis vykoná príkaz ioctl( GPIO_A, GPIO_INIT, NULL); Príkaz napíšeme do tela funkcie InitProject, kde sa vykonávajú inicializácie periférií.

static void InitProject (void)

{

/* PC Master initialization */

pcmasterInit();

/* ITCN initialization - set GPR and IPR according to the */

/* definitions in appconfig.h */

ioctl(ITCN, ITCN_INIT_GPRS, NULL);

ioctl(ITCN, ITCN_INIT_IPR, NULL);

ioctl( GPIO_A, GPIO_INIT, NULL); /* Inicializácia portu A */

/* SCI initialization */

ioctl(SCI_0, SCI_INIT, NULL);

archEnableInt();

}

[pic]

Pre blikanie LED použijeme príkaz ioctl( GPIO_A, GPIO_TOGGLE_PIN, BIT_1); , ktorý mení logickú hodnotu pinu1 portu A na opačnú. Príkaz napíšeme do cyklu while vo funkcií main.

void main (void)

{

/* initialize hardware */

InitProject ();

while (1)

{

pcmasterRecorder();

/* negácia hodnoty pinu 1 portu B */

ioctl( GPIO_A, GPIO_TOGGLE_PIN,BIT_1);

}

}

Ak teraz program spustíme LED bude svietiť, pretože frekvencia blikania je vysoká. Pomocou debuggera môžeme program krokovať . Teraz môžeme vidieť ako sa LED rozsvecuje a zhasína.

Ďalej bude popísané použitie časovača pre určenie periódy blikania LED.

4.2 Nastavenie časovača v Graphical Configuration Tool

V ľavom okne rozbalíme položku QT – Quad Timers pod touto položkou sú dve skupiny časovačov QT_C – Quad Timer C a QT_D – Quad Timer D. V každej skupine sú štyri časovače. Ak si zvolíme napr. časovač QT_C0 – Counter 0, v pravom okne sa zobrazia nastavenia pre tento časovač (obr. 4.2.).

V časti Operation je možné vykonávať tieto nastavenia:

Count mode – Režim čítania:

- Count rising edges of primary source – Číta vzostupné hrany impulzov z primárneho zdroja

- Count rising and falling edges of primary source - Číta vzostupné aj zostupné hrany impulzov z primárneho zdroja

- Count rising edges of primary source while second input high active – Číta vzostupné hrany impulzov z primárneho zdroja pokiaľ je druhý vstup na vysokej log. úrovni

- Quadrature count mode, uses primary and secondary sources – Číta impulzy primárneho aj sekundárneho zdroja

- Count primary source rising edges, secondary source specifies direction – Číta nábežné hrany primárneho zdroja, sekundárny zdroj udáva smer čítania.

- Edge of secondary source triggers primary count till compare – Sekundárny zdroj spúšťa čítanie impulzov primárneho zdroja

- Cascaded counter mode (up/down) – Vstup čítača je pripojený na výstup druhého

Tu nastavíme režim Count rising edges of primary source.

Primary count source: – Tu je možné nastaviť ako zdroj primárnych impulzov buď niektorý vstupný pin (napr. Counter #0 input pin) , výstup iného časovača (napr.Counter #0 otput), alebo vnútorný hodinový signál delený preddeličom (napr. Prescaler (IPB clock/4) ).

Ako vstupné impulzy nastavíme hodinový signál delený 8 (Prescaler (IPB clock/8)). Potom bude frekvencia čítania 5MHz.

Secondary count source: - Nastavenie zdroja sekundárnych impulzov. Pri nastavení režimu Count rising edges of primary source sa sekundárny zdroj nevyužíva.

Input capture mode: – režim zachytávania ( Capture register – zachytáva hodnotu čítača)

- Capture disabled, input edge flag INT disabled – Zachytávanie je vypnuté

- Load the capture register on rising edge of input – Načítanie hodnoty do capture

registra pri nábežnej hrane vstupu.

- Load the capture register on falling edge of input – Načítanie hodnoty do capture

registra pri dobehovej hrane vstupu.

- Load the capture register on both edges of input – Načítanie hodnoty do capture

registra pri oboch hranách vstupu.

Nastavíme možnosť Capture disabled, input edge flag INT disabled.

Output mode: – Režim výstupného signálu (OFLAG –výstupný signál, ktorý je nastavovaný/ nulovaný ak čítač dosiahne naprogramovanú hodnotu)

- Asserted while counter is active – Nastavený pokiaľ je čítač aktívny

- Clear OFLAG output on successful compare – Vynuluje OFLAG pri úspešnom porovnaní

- Set OFLAG output on successful compare – Nastaví OFLAG pri úspešnom porovnaní

- Toggle OFLAG output on successful compare – Zmení OFLAG pri úspešnom porovnaní

- Toggle OFLAG output using alternating compare registrers – Zmení OFLAG pri zmene porovnávacích registrov.

- Set on compare, cleared secondary source input edge – Nastavený porovnaním nulovaný hranou sekundárneho vstupu.

- Set on compare, cleared on counter rollover - Nastavený porovnaním, nulovaný pretečením čítača.

- Enable Gate Clock output while counter is active – Aktivuje hodinový výstup pokiaľ je čítač aktívny

Nastavíme možnosť Asserted while counter is active.

Count once:

- Count until compare and stop – Číta, dokedy nedosiahne hodnotu v compare registri a potom sa čítanie zastaný.

- Count repeatedly – Číta opakovane.

Nastavíme možnosť Count repeatedly

Count lenght:

- Count until compare, then reinitialize - Číta, dokedy nedosiahne hodnotu v compare registri, a potom sa znova inicializuje.

- Roll over – Počíta až do pretečenia.

Tu nastavíme Count until compare, then reinitialize

Count direction:

- Count up – Číta vpred

- Count down – Číta vzad

Zvolíme Count up

Ďalej zapíšeme do porovnávacieho registra (Compare register1) hodnotu 5000, čo znamená, že pri frekvencií čítača 5 MHz dosiahne túto hodnotu za 1ms. Potom aj prerušenie od tohto časovača bude vyvolávané každú milisekundu.

V časti Interrupts zaškrtneme možnosť Compare, čo znamená, že prerušenie od časovača sa vykoná, keď dosiahne hodnotu, ktorá je zapísaná v Compare registri.

V položke ISR name zadáme názov pre obsluhu prerušenia (napr. COUNTinterrupt). Tento názov bude použitý pri písaní kódu programu. Pod ním budú inštrukcie, ktoré sa majú vykonať pri prerušení.

V položke Priority zvolíme stupeň priority prerušenia aspoň 1 (Level 1).

Tým sme vykonali potrebné nastavenia časovača a nesmime zabudnúť ešte zaškrtnúť v ľavom okne položky QT_C – Quad Timer C a QT_C0 – Counter 0.

Teraz môžeme nastavenia uložiť. Zvolíme File - Save .

V programe CodeWarrior v ľavom okne klikneme pravým tlačidlom myši na súbor appcofig.h, ktorý sa nachádza v zložke ApplicatinConfig, a zvolíme Preconpile.

Podobne ako pri nastavení portu je potrebná aj pri časovači inicializácia pomocou príkazu ioctl( QTIMER_C0, QT_INIT, NULL); vo funkcií InitProject.

[pic]

Keďže prerušenie od časovača sa vykonáva každú milisekundu, a my chceme aby perióda blikania LED bola 1sekunda (0,5s svieti, 0,5s nesvieti), musíme zabezpečiť, aby až každé päťsté prerušenie vyvolalo zmenu log. úrovne na pine 1 portu A . Toto dosiahneme tak, že pri každom prerušení budeme inkrementovať obsah premennej i a keď dosiahne hodnotu 500 zmení sa log. úroveň na pine 1 portu A .

Kód programu pre obsluhu prerušenia napíšeme až nakoniec za funkciu InitProject.

COUNTinterrupt()

{

#pragma interrupt

i++;

if (i>500)

{

ioctl( GPIO_A, GPIO_TOGGLE_PIN,BIT_1);

i=0;

}

ioctl(QTIMER_C0, QT_CLEAR_FLAG, QT_COMPARE_FLAG);

}

Direktíva #pragma interrupt vykonáva uloženie obsahu registrov a ich obnovu po ukončení obsluhy prerušenia a návrat z prerušenia. Príkaz ioctl(QTIMER_C0, QT_CLEAR_FLAG, QT_COMPARE_FLAG); vykonáva vynulovanie príznaku porovnania, ktorý je nastavený ak čítač dosiahol hodnotu v compare registri.

Výpis program BlikanieLED:

#include "types.h"

#include "arch.h"

#include "periph.h"

#include "mc.h"

#include "appconfig.h"

#include "adc.h"

#include "cop.h"

#include "gpio.h"

#include "itcn.h"

#include "occs.h"

#include "pwm.h"

#include "qtimer.h"

#include "sci.h"

#include "scihl.h"

#include "spi.h"

#include "sys.h"

#include "pcmaster.h"

#include "mclib.h"

/* definition of static function */

static void InitProject (void);

int i;

/* main function definition */

void main (void)

{

/* initialize hardware */

InitProject ();

while (1)

{

pcmasterRecorder();

}

}

static void InitProject (void)

{

/* PC Master initialization */

pcmasterInit();

/* ITCN initialization - set GPR and IPR according to the */

/* definitions in appconfig.h */

ioctl(ITCN, ITCN_INIT_GPRS, NULL);

ioctl(ITCN, ITCN_INIT_IPR, NULL);

ioctl( GPIO_A, GPIO_INIT, NULL); /* Inicializacia portu A */

ioctl( QTIMER_C0, QT_INIT, NULL); /* Inicializacia casovaca C0*/

/* SCI initialization */

ioctl(SCI_0, SCI_INIT, NULL);

archEnableInt();

}

COUNTinterrupt()

{

#pragma interrupt

i++;

if (i>500) /* Ak i>500 zmeni sa log.hodna */

{

ioctl( GPIO_A, GPIO_TOGGLE_PIN,BIT_1); /* pinu 1 portu A */

i=0;

}

/* vynulovanie priznakoveho bitu */

ioctl(QTIMER_C0, QT_CLEAR_FLAG, QT_COMPARE_FLAG);

}

5 Analógovo číslicový prevodník (ADC)

DSP56F801 disponuje ôsmimi analógovými vstupmi, ktoré sú privedené na dvojitý 4-kanálový 12-bitový A/D prevodník, ktorý umožňuje:

• vzorkovanie s rýchlosťou až 1,66 MHz

• synchronizáciu s PWM modulátorom

• súčasné, alebo postupné vzorkovanie

• jednoduché alebo diferenciálne vstupy

Činnosť A/D prevodníka bude predvedená na príklade, kde napätie z potenciometra bude privedené na analógový vstup AN1. Toto napätie bude prevedené pomocou ADC a hodnota sa uloží do premennej R0. Potom môžeme pomocou programu FreeMASTER zobraziť priebeh tohto napätia, ktorého hodnota sa bude meniť s natáčaním potenciometra. Ďalej budú popísané potrebné nastavenia pre ADC v Graphical Configuration Tool.

5.1 Nastavenie ADC v Graphical Configuration Tool

V ľavom okne zvolíme položku ADC_A - Analog-to-Digital Converter A. V pravom okne sa zobrazia nastavenia pre ADC A. (Obr. 5.1.)

V skupine Clock nastavíme deliteľ (Divisor) IP/8, čomu zodpovedá frekvencia 5MHz.

Cannel Configuration:

- Single ended – Analógové vstupy sú nakonfigurované ako jednoduché

- Differential - Analógové vstupy sú nakonfigurované ako diferenciálne

Vstupy ponecháme nastavené ako Single ended.

Channel to Sample Mapping:

- Scan Lenght – zvolíme hodnotu 1, potom budú vzorkované len dva analógové

vstupy

- SMP0 – zvolíme AN1- bude vzorkovaný analógový vstup AN1, na ktorý je pripojený potenciometer

- Scan Mode – Režim vzorkovania

- Once Sequential – Po štarte sú vzorky odoberané postupne počnúc SMP0, a ak sú aktivované SMP0 – SMP7 ukončí sa prevod po SMP7.

- Once Simultaneous – Po štarte sú snímané dvojice vzoriek súčasne SMP0/4, SMP1/5, SMP2/6, SMP3/7, prevod sa ukončí po SMP3/7

- Loop Sequential – Podobne ako u Once Sequential, ale prevod sa vykonáva opakovane dokiaľ nie je nastavený STOP bit.

- Loop Simultaneous - Podobne ako u Once Simultaneous, ale prevod sa vykonáva opakovane dokiaľ nie je nastavený STOP bit.

- Triggered Sequential – Ako Once Sequential, ale prevod je spúšťaný pomocou Trigger source

- Triggered Simultaneous – Ako Once Simultaneous, ale prevod je spúšťaný pomocou Trigger source

Tu nastavíme Triggered Simultaneous.

Operation:

- Mode – Zvolíme možnosť Normal

- Trigger source – Nastavíme Software start pre spúšťanie prevodu z prugramu.

Zerro crossing detection: – Tu je možné nastaviť detekciu prechodu vzoriek nulou.

Ponecháme deaktivované (disabled).

Low Limit Registers: – Ak hodnota vzorky je menšia ako hodnota v danom registri, vyvolá sa prerušenie.

High Limit Registers: - Ak hodnota vzorky je väčšia ako hodnota v danom registri, vyvolá sa prerušenie.

Toto prerušenie v danom príklade nevyužívame, preto ponecháme nulové hodnoty.

Interrupts: – Zaškrtneme možnosť Conversion complete – Prerušenie sa vyvolá po ukončení prevodu

-ISR name – Zvolíme názov pre obsluhu prerušenia napr. ConvComplete

-Priority – Zvolíme stupeň priority prerušenia 2 (Level2).

Po vykonaní týchto nastavení zaškrtneme v ľavom okne položku ADC_A - Analog-to-Digital Converter A a nastavenia uložíme

[pic]

5.2 Vytvorenie programu na prevod analógového signálu

Prevod bude spúšťaný z programu pomocou príkazu ioctl(ADC_A, ADC_START, NULL). Pre určenie periódy spúšťania AD prevodníka použijeme časovač C0 . Prevod bude potom spúšťaný po vyvolaní prerušenia od časovača C0. Môžeme použiť rovnaké nastavenia časovača ako v príklade blikania LED, potom sa bude odoberanie a prevod vzorky uskutočňovať každú milisekundu. Po ukončení prevodu každej vzorky sa vykoná prerušenie od ADC, kedy bude hodnota zapísaná do premennej R0 pomocou príkazu R0=ioctl(ADC_A, ADC_READ_SAMPLE, 0). Premenná R0 bude teda obsahovať aktuálnu hodnotu vstupného analógového signálu, v našom prípade napätia, ktoré je na vstup AN1 privedené z potenciometra. Na koniec je potrebné v prerušení od ADC ešte vynulovať príznakový bit EOSI (End of Scan Interrupt), ktorý indikuje ukončenie prevodu, príkazom ioctl(ADC_A, ADC_CLEAR_STATUS_EOSI, NULL)

Výpis kódu programu:

/* definition of static function */

static void InitProject (void);

int R0; /* deklaracia premennej R0 */

/* main function definition */

void main (void)

{

/* initialize hardware */

InitProject ();

while (1)

{

pcmasterRecorder();

}

}

static void InitProject (void)

{

/* PC Master initialization */

pcmasterInit();

/* ITCN initialization - set GPR and IPR according to the */

/* definitions in appconfig.h */

ioctl(ITCN, ITCN_INIT_GPRS, NULL);

ioctl(ITCN, ITCN_INIT_IPR, NULL);

ioctl(ADC_A, ADC_INIT, NULL); /* Inicializacia ADC */

ioctl( QTIMER_C0, QT_INIT, NULL); /* Inicializacia casovaca C0 */

/* SCI initialization */

ioctl(SCI_0, SCI_INIT, NULL);

archEnableInt();

}

COUNTinterrupt() /* Prerusenie od casovaca */

{

#pragma interrupt

ioctl(ADC_A, ADC_START, NULL); /* Spustenie ADC */

/*vynulovanie priznakoveho bitu */

ioctl(QTIMER_C0, QT_CLEAR_FLAG, QT_COMPARE_FLAG);

}

ConvComplete () /* Prerusenie od ADC */

{

#pragma interrupt

/* priradenie hodnoty do premennej R0 */

R0 = ioctl(ADC_A, ADC_READ_SAMPLE, 0);

/* vynulovanie priznakoveho bitu */

ioctl(ADC_A, ADC_CLEAR_STATUS_EOSI, NULL);

}

Obsah premennej R0 a jej časový priebeh zobrazíme pomocou programu FreeMASTER. Pridáme premennú pre zobrazenie (R0) ,postupom ktorý bol už popísaný pri zobrazovaní pílového priebehu. Teraz môžeme vidieť ako sa mení jej hodnota s natáčaním potenciometra v rozsahu 0 – 32767, čo zodpovedá rozsahu vstupného analógového napätia 0 - 3,3V.

Pre zobrazenie časového priebehu premennej použijeme Scope. V menu programu FreeMASTER zvolíme Item – Create Scope. Zobrazí sa okno nastavení. V položke Period zvolíme 0ms. V záložke Setup zadáme v položke Graph vars premennú R0. V položke Y-block Left Axis zadáme rozsah osi Y 0 – 33000. Nastavenia potvrdíme stlačením OK. Teraz sa už zobrazí časový priebeh premennej R0.

6 Šírkovo impulzový modulátor (PWM)

DSP 56F801 obsahuje jeden šírkovo impulzový modulátor PWMA, ktorý má 6 signálových výstupov (PWM0 – PWM5), ktoré môžu byť združené do troch komplementárnych párov. V komplementárnom móde činnosti je možné vypnúť oba signály v komplementárnom páre (vkladať deadtime ). PWM môže byť nakonfigurovaný na 1,2,3 alebo žiadny komplementárny pár. Ostatné PWM výstupy sú potom navzájom nezávislé. Komplementárny režim činnosti je využívaný pre spínanie trojfázového striedača, ktorý riadi trojfázové striedavé motory.

6.1 Šírkovo impulzová modulácia (PWM)

Šírkovo impulzová modulácia skr. PWM (z angl. Pulse width modulation) je modulácia periodického signálu zmenou striedy (šírky impulzu) v závislosti od nejakej vstupnej veličiny za účelom prenosu informácie, alebo vysoko efektívnej regulácie elektrického výkonu, dodávaného do záťaže. Frekvencia generovaného signálu je konštantná, mení sa len doba zopnutia (šírka impulzu). Vysoká účinnosť pri regulácii výkonu je daná tým, že regulátor je (v ideálnom prípade) vždy buď úplne uzavretý, alebo úplne otvorený. Nevznikajú v ňom preto tepelné straty v dôsledku úbytku napätia na regulačnom prvku.

[pic]

6.2 Generovanie PWM signálu

Okamžitá hodnota vstupného signálu (modrý priebeh obr. 6.3a,b) sa komparátorom porovnáva s okamžitou hodnotou pomocného signálu s pílovitým priebehom (zelený priebeh obr. 6.3a,b). Ak je hodnota vstupného signálu väčšia než pílovitého, PWM výstup (červený priebeh obr.6.3a,b) je v aktívnom stave (log.1), v opačnom prípade v neaktívnom (log.0).

PWM generátor v DSP 56F801 obsahuje 15-bitový obojsmerný čítač, ktorého hodnota je v registri PWMCNT a v čase reprezentuje pílový (trojuholníkový) priebeh. Okamžitá hodnota registra PWMCNT sa porovnáva s hodnotou registra PWMVAL, na základe čoho sú generované PWM impulzy.

PWM signály môžu byť pri zmene striedy (duty cycle ) zarovnávané na stred (center-aligned) (obr. 6.4.), alebo na hranu (edge-aligned) (obr. 6.5.). Pri generovaní signálov zarovnaných na stred čítač číta najskôr nahor, keď dosiahne max. hodnotu, ktorú určuje modulus , potom číta smerom nadol. Pri generovaní signálov zarovnaných na hranu číta čítač len smerom nahor a po dosiahnutí max. hodnoty sa vynuluje.

6.3 Nastavenie PWM v Graphical Configuration Tool

V ľavom okne klikneme na PWM_A – PulseWidth Modulator A. V pravom okne sa zobrazia nastavenia pre PWM A (obr. 6.6.)

Nastavenia v skupine Clock:

- Prescaler – Nastavíme najmenšiu hodnotu IP/1, potom bude perióda hodinového signálu pre PWM 25ns.

- Modulus – Zadáme hodnotu 2000, čo zodpovedá frekvencií PWM 10kHz a perióde 100μs.

- Alignment – Nastavíme center – zarovnanie na stred.

- Dead Time Value – Zadáme hodnotu 40. Doba vypnutia oboch tranzistorov v komplementárnom páre bude potom 1μs.

Operation:

- PWM Reload Frequency – V tejto položke môžeme nastaviť, v ktorých intervaloch sa bude môcť vykonávať zmena striedy. Je možné nastaviť Every opportunity (pri každej príležitosti ) až Every 16 opportunity (pri každej šestnástej príležitosti ). Nastavíme možnosť Every opportunity.

- Correction method – Tu môžeme nastaviť metódu korekcie hodnoty Dead time na základe zosnímaného prúdu. Zvolíme Manual Correction (No correction).

Channel Pairs:

- Cannel Coupling – Nastavenia PWM signálov ako komplementárne dvojice (Complementary) alebo nezávislé (Independent). Nastavíme režim činnosti Complementary.

- Top polarity – Nastavenie polarity PWM impulzov pre horné tranzistory z dvojice. Nastavíme kladnú polaritu –Positive.

- Bottom polarity – Nastavenie polarity PWM impulzov pre spodné tranzistory z dvojice. Nastavíme tiež kladnú polaritu –Positive.

Disable PWM Pin by FAULT:

V tejto položke je možné nastaviť, ktoré výstupné PWM piny budú zablokované pri poruche, ktorá je detekovaná na pine FAULT 0.

Pre náš príklad toto zablokovanie deaktivujeme (možnosti nebudú zaškrtnuté).

Software Control on Pin:

Tu je možné aktivovať softvérové riadenie výstupného PWM signálu na pinoch 0 – 5.

Tieto nastavenia ponecháme deaktivované.

Interrupts:

Zaškrtneme možnosť Reload, potom sa prerušenie vyvolá v okamihoch, kedy je možná zmena striedy PWM signálu. Zadáme ISR Name napr. PWMReload a stupeň priority Level1.

Na koniec ešte zaškrtneme PWM Module Enable a Output Pad Enable.

6.4 Zmena intenzity svitu LED pomocou PWM

Výstupné komplementárne PWM signály PWMA0 a PWMA1, ktoré sú na pinoch 30 a 32 konektora J6 (MCU PORT), privedieme vodičmi na piny označené LED1 a LED2 konektora J10 (UISER I/O). Potom budeme zmenou hodnoty premennej compVal meniť striedu PWM signálov. Zmenou striedy PWM signálu sa mení intenzita svitu LED. Keďže sú signály privedené na LED komplementárne, tak pri maximálnom svite jednej LED bude vždy druhá zhasnutá a naopak.

Hodnotu striedy PWM komplementárnych signálov PWMA0 a PWMA1 určuje premenná compVal.pwmChannel_0_Value, ktorá môže nadobúdať hodnoty 0 – 32767, čím meníme striedu v rozsahu 0 - 100%. Do premennej compVal.pwmChannel_0_Value priradíme

premennú pwm0, ktorej hodnotu budeme zadávať v programe FreeMASTER. Zmena striedy PWM signálu sa vykoná príkazom ioctl( PWM_A, PWM_UPDATE_VALUE_REGS_COMPL, &compVal );

Výpis programu

#include "types.h"

#include "arch.h"

#include "periph.h"

#include "mc.h"

#include "appconfig.h"

#include "adc.h"

#include "cop.h"

#include "gpio.h"

#include "itcn.h"

#include "occs.h"

#include "pwm.h"

#include "qtimer.h"

#include "sci.h"

#include "scihl.h"

#include "spi.h"

#include "sys.h"

#include "pcmaster.h"

#include "mclib.h"

/* definition of static function */

static void InitProject (void);

int pwm0;

pwm_sComplementaryValues compVal; /* deklaracia premennej compVal*/

/* main function definition */

void main (void)

{

/* initialize hardware */

InitProject ();

while (1)

{

pcmasterRecorder();

}

}

static void InitProject (void)

{

/* PC Master initialization */

pcmasterInit();

/* ITCN initialization - set GPR and IPR according to the */

/* definitions in appconfig.h */

ioctl(ITCN, ITCN_INIT_GPRS, NULL);

ioctl(ITCN, ITCN_INIT_IPR, NULL);

ioctl( PWM_A, PWM_INIT, NULL ); /* inicializacia PWM */

/* SCI initialization */

ioctl(SCI_0, SCI_INIT, NULL);

archEnableInt();

}

PWMReload () /* prerusenie od PWM */

{

#pragma interrupt

/* priradenie hodnoty premennej compVal.pwmChannel_0_Value */

compVal.pwmChannel_0_Value = pwm0;

/* zmena striedy PWM signalu */

ioctl( PWM_A, PWM_UPDATE_VALUE_REGS_COMPL, &compVal );

/* vynulovanie priznakoveho bitu */

ioctl( PWM_A, PWM_CLEAR_RELOAD_FLAG, NULL );

}

7 Riadenie otáčok jednosmerného motorčeka pomocou PWM

Pre riadenie otáčok jednosmerného motorčeka použijeme jednokvadrantový menič (obr. 7.1.), ktorý bude zostavený na kontaktnom poli vývojovej dosky. Do bázy tranzistora bude privedený PWM signál z výstupu PWMA4 (pin 38 konektora J6). Tranzistor T bude periodicky spínať motorček, čím sa budú plynule riadiť otáčky.

Keď je tranzistor T zopnutý, motorček je pripojený na napätie U a prúd kotvou v dôsledku jej indukčnosti exponenciálne narastá. Pri zatvorenom tranzistore T je motorček odpojený od napätia U a do motorčeka prúd zo zdroja netečie. Prúd naakumulovaný v indukčnosti kotvy sa teraz uzatvára cez diódu D a jeho hodnota klesá až do okamihu, kedy je tranzistor T znova zopnutý. Tvary priebehov napätia a prúdu motorčeka pri hodnote striedy 25% a 75% sú na obr. 7.3a,b. Zmenou striedy PWM signálu sa mení aj stredná hodnota prúdu motorčeka. Menič pracuje v režime neprerušovaných prúdov, čo znamená, že prúd kotvou motorčeka nepoklesne na nulovú hodnotu počas intervalu, kedy je tranzistor T zatvorený. Zvlnenie prúdu závisí od frekvencie PWM signálu a od veľkosti indukčnosti kotvy.

Hodnota striedy PWM signálu a tým aj otáčky motorčeka budú zadávané pomocou potenciometra, ktorý privádza napätie v rozsahu 0 – 3,3V na analógový vstup AN1 (obr. 7.2.). Toto napätie je prevedené A/Č prevodníkom na číslicovú hodnotu v rozsahu 0 – 32767. Následne túto hodnotu priradíme premennej compVal.pwmChannel_4_Value, ktorá určuje striedu PWM signálu kanála 4 na ktorý je pripojený menič.

V tomto príklade použijeme A/Č prevodník a PWM modulátor. Nastavenia týchto periférií v Graphical Configuration Tool budú rovnaké ako v predchádzajúcich príkladoch.

ADC bude spúšťaný v prerušení od PWM (PWMReload), po ukončení prevodu sa vyvolá prerušenie od ADC (ADCcomplete) a hodnota, ktorá reprezentuje žiadané otáčky, sa zapíše do premennej pwm4. Pri ďalšom prerušení od PWM sa opäť spustí A/Č prevod a hodnota pwm4 sa priradí do premennej compVal.pwmChannel_4_Value čím sa zmení strieda PWM signálu podľa natočenia potenciometra.

Výpis programu

#include "types.h"

#include "arch.h"

#include "periph.h"

#include "mc.h"

#include "appconfig.h"

#include "adc.h"

#include "cop.h"

#include "gpio.h"

#include "itcn.h"

#include "occs.h"

#include "pwm.h"

#include "qtimer.h"

#include "sci.h"

#include "scihl.h"

#include "spi.h"

#include "sys.h"

#include "pcmaster.h"

#include "mclib.h"

/* definition of static function */

static void InitProject (void);

int pwm4;

pwm_sComplementaryValues compVal; /* deklaracia premennej compVal*/

/* main function definition */

void main (void)

{

/* initialize hardware */

InitProject ();

while (1)

{

pcmasterRecorder();

}

}

static void InitProject (void)

{

/* PC Master initialization */

pcmasterInit();

/* ITCN initialization - set GPR and IPR according to the */

/* definitions in appconfig.h */

ioctl(ITCN, ITCN_INIT_GPRS, NULL);

ioctl(ITCN, ITCN_INIT_IPR, NULL);

ioctl(ADC_A, ADC_INIT, NULL); /* Inicializacia ADC */

ioctl( PWM_A, PWM_INIT, NULL ); /* inicializacia PWM */

/* SCI initialization */

ioctl(SCI_0, SCI_INIT, NULL);

archEnableInt();

}

ADCcomplete () /* Prerusenie od ADC */

{

#pragma interrupt

/* priradenie hodnoty z ADC do premennej pwm4 */

pwm4 = ioctl(ADC_A, ADC_READ_SAMPLE, 0);

/* vynulovanie priznakoveho bitu */

ioctl(ADC_A, ADC_CLEAR_STATUS_EOSI, NULL);

}

PWMReload () /* prerusenie od PWM */

{

#pragma interrupt

ioctl(ADC_A, ADC_START, NULL); /* Spustenie ADC */

/* priradenie hodnoty do premennej compVal.pwmChannel_4_Value */

compVal.pwmChannel_4_Value = pwm4;

/* zmena striedy PWM signalu */

ioctl( PWM_A, PWM_UPDATE_VALUE_REGS_COMPL, &compVal );

/* vynulovanie priznakoveho bitu */

ioctl( PWM_A, PWM_CLEAR_RELOAD_FLAG, NULL );

}

8 Regulácia prúdu motorčeka

V tomto príklade bude pomocou PI regulátora (naprogramovaného v DSP) regulovaný prúd kotvy motorčeka na žiadanú hodnotu . Keďže pre moment js motora platí vzťah Me=CΦIa, potom aj moment bude regulovaný na konštantnú hodnotu.

Na základe skutočnej hodnoty prúdu Ia (regulovanej veličiny) a žiadanej hodnoty prúdu I*a (riadiacej veličiny) a zadaných parametrov regulátora, vypočíta PI regulátor výstupnú hodnotu (akčnú veličinu). Táto hodnota bude priradená do premennej compVal.pwmChannel_4_Value, ktorá určuje striedu PWM signálu. Akčnou veličinou bude teda pomerná doba otvorenia λ impulzového meniča IM. Poruchovou veličinou vstupujúcou do sústavy je záťažový moment Mz. Regulačná štruktúra pre reguláciu prúdu je znázornená na obr 8.1.

8.1 Meranie prúdu kotvy motorčeka

Aby sme mohli realizovať reguláciu prúdu, musíme získať skutočnú hodnotu prúdu kotvy motorčeka.

Do obvodu meniča zapojíme rezistor (obr. 8.2.), potom bude úbytok napätia na tomto rezistore úmerný prúdu prechádzajúcemu kotvou motorčeka počas periódy zopnutia tranzistora T. Toto napätie bude privedené na vstup AN0 (pin 18 konektora J6) a pomocou ADC prevedené na číselnú hodnotu, ktorá bude reprezentovať veľkosť prúdu. Aby zmeraná hodnota prúdu bola rovná jeho strednej hodnote Is, musíme zabezpečiť, aby bola vzorka prúdu odoberaná v strede napäťového impulzu (obr. 8.3.). Keďže pri generovaní PWM impulzov zarovnaných na stred, sa vyvoláva prerušenie od PWM v strede napäťového impulzu, môžeme toto prerušenie využiť pre spúšťanie ADC.

Pretože zosnímaný prúd je značne zašumený (zašumenie prúdu je spôsobené komutáciou v motorčeku), je potrebné použiť číslicový filter. V príklade je použitý exponenciálny filter, ktorého matematické vyjadrenie je nasledovné:

[pic]

Pre realizáciu tohto filtra použijeme nasledovný zápis Isk=add(Isk,mult(kf,sub(I,If))), kde I je premenná ktorá obsahuje zmeranú hodnotu prúdu a premenná Isk obsahuje vyfiltrovanú hodnotu.

Premenné sú typu Frac16, čo je zlomkový tvar. Zlomkový aj celočíselný typ sú v podstate rovnaké, teda celočíselné, rozdiel je v ich reprezentácií a v práci s matematickými operáciami. Prepočet medzi 16 bitovým zlomkovým a celo číselným tvarom je: Zlomkový=Celočíselný/215, z toho vyplýva, že najmenšie fraction číslo je 0,000030517578125.

Konštanta k bola určená skusmo tak aby bola zabezpečená dostatočná filtrácia prúdu, ale aby filtrácia nespôsobovala príliš veľké oneskorenie. Bola určená hodnota k=0,005 typu Frac16.

8.2 PI regulátor

PI regulátor, ktorý je realizovaný v číslicovej forme sa tiež nazýva PS regulátor (Proporcionálno-sumačný). V príklade využijeme PI regulátor naprogramovaný v knižnici Motor Control Library for 56F800 Motorola Hybrid Controllers.

Funkcia MCLIB_ControllerPI vypočítava PI algoritmus podľa nasledovného vzťahu:

Vlastnosti PI regulátora nastavíme zápisom hodnôt do nasledujúcich premenných:

PIparams.ProportionalGain = FRAC16(0.8); - proporcionálna konštanta

PIparams.ProportionalGainScale = 0; - proporcionálna mierka

PIparams.IntegralGainScale = 0; - integračná mierka

PIparams.IntegralGain = FRAC16(0.01); - integračná konštanta

PIparams.PositivePILimit = FRAC16(0.9); - kladné ohraničenie výstupu regulátora

PIparams.NegativePILimit = FRAC16(-0.9); - záporné ohraničenie výstupu regulátora

PIparams.IntegralPortionK_1 = 0; - integračná zložka

Pre výpočet konštánt regulátora platí:

Funkcia pre výpočet výstupnej hodnoty PI regulátora má nasledovný tvar:

PIoutput = MCLIB_ControllerPI (Iz,Isk, &PIparams); ,kde Iz je premenná, ktorá obsahuje žiadanú hodnotu prúdu a Isk obsahuje skutočnú hodnotu prúdu.

Premennú PIoutput následne priradíme do premennej compVal.pwmChannel_4_Value. Potom výstup z regulátora bude ovplyvňovať pomernú dobu zopnutia meniča λ (striedu) a tým regulovať prúd v obvode.

Na obr. 8.4 je zosnímaný priebeh prúdu Isk pomocou programu FreeMASTER. V čase 39,6s je žiadaná hodnota prúdu Iz skokom zmenená z hodnoty 0 na 0,5A. Z priebehu vidno odozvu skutočnej hodnoty prúdu na túto skokovú zmenu (prechodovú charakteristiku). V čase 44s je motorček zaťažený záťažovým momentom. Prúd na okamih stúpne, ale zásahom regulátora je opäť vyregulovaný na žiadanú hodnotu 0,5A.

Výpis programu

#include "types.h"

#include "arch.h"

#include "periph.h"

#include "mc.h"

#include "appconfig.h"

#include "adc.h"

#include "cop.h"

#include "gpio.h"

#include "itcn.h"

#include "occs.h"

#include "pwm.h"

#include "qtimer.h"

#include "sci.h"

#include "scihl.h"

#include "spi.h"

#include "sys.h"

#include "pcmaster.h"

#include "mclib.h"

/* definition of static function */

static void InitProject (void);

/* deklaracie premennych */

Frac16 I=FRAC16(0.0),kf=FRAC16(0.005),Isk=FRAC16(0.0);

Frac16 Iz=FRAC16(0.0),PIoutput=FRAC16(0.0);

pwm_sComplementaryValues compVal;

mc_sPIparams1_limitSc PIparams;

/* main function definition */

void main (void)

{

/* initialize hardware */

InitProject ();

while (1)

{

pcmasterRecorder();

}

}

static void InitProject (void)

{

/* PC Master initialization */

pcmasterInit();

/* ITCN initialization - set GPR and IPR according to the */

/* definitions in appconfig.h */

ioctl(ITCN, ITCN_INIT_GPRS, NULL);

ioctl(ITCN, ITCN_INIT_IPR, NULL);

ioctl(ADC_A, ADC_INIT, NULL); /*inicializacia ADC */

ioctl( PWM_A, PWM_INIT, NULL ); /*inicializacia PWM */

/* SCI initialization */

ioctl(SCI_0, SCI_INIT, NULL);

/*zadavanie parametrov regulatora */

PIparams.ProportionalGain = FRAC16(0.8);

PIparams.ProportionalGainScale = 0;

PIparams.IntegralGainScale = 0;

PIparams.IntegralGain = FRAC16(0.01);

PIparams.PositivePILimit = FRAC16(0.9);

PIparams.NegativePILimit = FRAC16(-0.9);

PIparams.IntegralPortionK_1 = 0;

archEnableInt();

}

ADCcomplete () /*prerusenie od ADC */

{

#pragma interrupt

/* priradenie zmeranej hodnoty prudu do premennej I */

I = ioctl(ADC_A, ADC_READ_SAMPLE, 0);

Isk= add(Isk,mult(kf,sub(I,Isk))); /*filtracia prudu */

/* vypocet vystupnej hodnoty PI regulatora */

PIoutput = MCLIB_ControllerPI (Iz,Isk, &PIparams);

compVal.pwmChannel_4_Value =PIoutput ;

ioctl(ADC_A, ADC_CLEAR_STATUS_EOSI, NULL);

}

PWMReload () /*prerusenie od PWM */

{

#pragma interrupt

ioctl(ADC_A, ADC_START, NULL); /*spustenie ADC */

/*zmena striedy PWM podla hodnoty v compVal.pwmChannel_4_Value */ ioctl( PWM_A, PWM_UPDATE_VALUE_REGS_COMPL, &compVal );

ioctl( PWM_A, PWM_CLEAR_RELOAD_FLAG, NULL );

}

Záver

Práca sa zaoberá úvodom do programovania DSP rodiny Freescale 56F800. V prvej kapitole je charakteristika DSP 56F801.V druhej je popísaný vývojový program CodeWarrior a štruktúra programu v jazyku C. Ďalej je v práci popísaných šesť príkladov, na ktorých je ukázaná práca s perifériami tohto DSP. Prvý príklad ukazuje prácu s programom FreeMASTER, ktorý umožňuje v reálnom čase editovanie a zobrazovanie obsahu premenných. V druhom príklade je vytvorený program pre blikanie LED, na ktorom sú vysvetlené potrebné nastavenia portu a časovača. Tretí príklad je zameraný na použitie A/Č prevodníka. Ďalší príklad využíva PWM modulátor na reguláciu jasu LED. Piaty príklad ukazuje prácu s PWM modulátorom pre riadenie otáčok jednosmerného motorčeka. V poslednom príklade je popísané využitie PWM a PI regulátora pre reguláciu prúdu jednosmerného motorčeka. Všetky príklady sú realizované na vývojovej doske PBMCUSLK, na ktorej je pripojený modul CSM – 56F801.

ČESTNÉ PREHLÁSENIE

Prehlasujem, že som zadanú bakalársku prácu vypracoval samostatne, pod odborným vedením vedúceho bakalárskej práce Ing. Pavla Makyša a používal som len literatúru uvedenú v práci.

V Žiline dňa 6. 6. 2008 podpis študenta

Literatúra

[1] Motorola, DSP56800_Quick_Start User's Manual, Targeting Motorola DSP56F80x Platform

[2] Motorola, Motor Control Library, lst Edition for 56F8xx Motorola Hybrid Controllers

[3] Motorola, DSP 56F80x User’s Manual

[4] Freescale Semiconductor, MCU Project Board Student Learning Kit (PBMCUSLK)

[5] Freescale Semiconductor, Freescale komunikační procesory

-----------------------

Obr. 2.1. Užívateľské rozhranie programu CodeWarrior

Obr. 3.1. Okno základných nastavení

Obr. 3.2. Okno nastavení premennej

Obr. 3.3. Hlavné nastavenia pre Recorder

Obr. 3.4. Nastavenia v záložke Setup

Obr. 3.5. Nastavenia v záložke Trigger

Obr. 3.6. Základná obrazovka programu FreeMASTER so zobrazeným priebehom premennej inkr.

Obr. 4.1. Nastavenia portu A

Obr. 4.2. Nastavenia časovača C0

Obr. 5.1. Nastavenia ADC

0

1

2

3

4

Up/Down Counter

Modulus = 4

PWM Value = 0

0/4 = 0%

PWM Value = 1

1/4 = 25%

PWM Value = 2

2/4 = 50%

PWM Value = 3

3/4 = 75%

PWM Value = 4

4/4 = 100%

1

2

3

4

Up Counter

Modulus = 4

PWM Value = 0

0/4 = 0%

PWM Value = 1

1/4 = 25%

PWM Value = 2

2/4 = 50%

PWM Value = 3

3/4 = 75%

PWM Value = 4

4/4 = 100%

Obr. 6.4. Generovanie PWM impulzov zarovnaných na stred

Obr. 6.5. Generovanie PWM impulzov zarovnaných na hranu

Obr. 6.6. Nastavenia PWM

T

TZ

TV

U

USTR

U – amplitúda impulzov

USTR – stredná hodnota napätia

TZ – doba zopnutia

TV – doba vypnutia

T – perióda PWM signálu

λ – pomerná doba zopnutia

+

-

Komparátor

+3,3V

PWM A4

+U

T

M

D

DSP

R1

P

AN1

Obr. 1.1. Bloková schéma 56F801

Obr. 7.1. Zapojenie meniča

Obr. 7.2. Zapojenie potenciometra

Obr. 7.3a Priebeh napätia a prúdu motorčeka pri hodnote striedy 25%

Obr. 7.3b Priebeh napätia a prúdu motorčeka pri hodnote striedy 75%

I*a

Ia

eIa

PI reg.

λ

IM

Ra

La

Ui

Me,ω

Mz

Obr. 8.1 Regulačná štruktúra pre reguláciu prúdu

[pic]

yn – výstupná (filtrovaná) veličina

yn-1 – výstupná veličina v predchádzajúcom výpočtovom kroku

xn – vstupná veličina

M

D

R1

+U

PWM A4

T

R2

AN0

Obr. 6.1. Časový priebeh PWM signálu

Obr. 6.2. Princíp tvorby PWM signálu

Obr. 6.3a Modulácia konštantného signálu

Obr. 6.3b Modulácia časovo premenlivého signálu

Obr. 8.2 Pripojenie rezistora na meranie prúdu kotvy

Obr. 8.3 Časový priebeh prúdu a jeho stredná hodnota

[pic]

e(k) – reg. odchýlka vo výpočtovom kroku k

w(k) – žiadaná hodnota vo výpočtovom kroku k

m(k) – skutočná hodnota vo výpočtovom kroku k

u(k) – výstup regulátora vo výpočtovom kroku k

uP(k) – proporcionálna zložka výstupu v kroku k

uI(k) – integračná zložka výstupu v kroku k

uI(k-1) – integračná časť výstupu v kroku k-1

TI – integračná časová konštanta

T – perióda vzorkovania

KC – zosilnenie regulátora

[pic]

Obr. 8.4 Časový priebeh strednej hodnoty prúdu

................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download