Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

Fizica


Index » educatie » Fizica
» Generarea unui semnal sinusoidal cu ajutorul programului code composer


Generarea unui semnal sinusoidal cu ajutorul programului code composer


UNIVERSITATEA "POLITEHNICA" DIN TIMISOARA

FACULTATEA DE ELCTRONICA SI TELECOMUNICATII

PROIECT EEA



GENERAREA UNUI SEMNAL SINUSOIDAL CU AJUTORUL PROGRAMULUI CODE COMPOSER

INTRODUCERE

In cadrul "magaziei" generatoarelor de semnale de la Texas Instruments gasim un cuprinzator set de module pentru generarea de semnale sinusoidale cum ar fi cu un singur canal sau cu doua canale. Aceste doua module se gasesc la randul lor in trei forme : Standard THD (SGENT_xx), Low THD (SGENTI_xx) si versiunea de inalta precizie (SGENHP_xx).

In versiunea Standard THD (SGENT_1, SGENT_2, SGENT_3 & SGENT_3D) generatorul de sinus este implementat utilizand in mod direct tehnica look-up table ce foloseste un numarator pe 16 biti.

In versiunea Low THD (SGENTI_1, SGENTI_2, SGENTI_3 & SGENTI_3D) generatorul de sinus este implementat folosind tehnicile look-up table si cea a interpolarii liniare ce utilizeaza un numarator pe 16 biti.

In fine, in cadrul versiunii de inalta precizie (SGENHP_1 & SGENHP_2) generatorul de sinus este implementat folosind tehnicile din versiunea anterioara, dar in acest caz numaratorul este pe 32 biti.

Insa, in cadrul proiectului vom folosi doar SGENT_1 pe care il vom trata in continuare.

2. SGENT_1

Acest modul genereaza pe un singur canal digital un semnal sinus folosind tehnica look-up table directa.

Modulul de fata este disponibil in doua variante de interfatare :

  1. versiunea in limbaj de asamblare (Direct ASM)
  2. versiunea in limbaj C

Tipul modulului este : independent de tinta si dependent de aplicatie.

Numele fisierelor in limbaj de asamblare : sgt1a.asm, sgen.asm, sintb360.asm

Datorita faptului ca proiectul este tratat doar in limbaj de asamblare, in continuare ne vom referi doar la aceasta parte.

Structura obiectelor SGENT_1 este definita in felul urmator:

SGENT_1 .struct

freq .int

step_max .int

alpha .int

gain .int

offset .int

out .int

SGENT_1_LEN .endstruct

Nume    Descriere Format Valoare(Hex)

intrare

freq frecventa in hertz intre Q15 0-7FFF

[0, FMAX] normalizata la

[0,1]

offset     offsetul de c.c. in Q15 8000-7FFF

semnalul sinusoidal

gain castigul semnalului sinusoidal Q15 0-7FFF

step_max    FMAX = [step_max × FS ]/65536 Q0 0000-7FFF

valoarea este setata la 1000

pentru a genera frecventa

maxima de 305.17Hz folosind

20kHz frecventa de esantionare

iesire

out    iesirea semnalului sinusoidal Q15 8000-7FFF

Simboluri speciale

SGENT_1_LEN - acest symbol contine marimea totala a structurii si este folosit pentru a rezerva spatiu in memoria de date pentru modul in timpul curent.

SGENT_1 - acest simbol este asociat cu inceputul structurii si este folosit cu directiva .tag pentru a furniza caracteristicile structurii locatiilor de date rezervate cu ajutorul simbolului SGENT_1_LEN.

Rutine ASM

SGENT_1_calc - aceasta functie implementeaza generarea semnalului sinusoidal SIN pe un singur canal digital, folosind tehnica look-up table directa.

Folosirea modulului

Pasul 1 : se include sgen.asm in fisierul main si se aduc fisierele sgt1a.asm  si sintb360.asm in proiect

.include "sgen.asm"

Pasul 2. : referinta modulului generatorului de semnal

.ref SGENT_1_calc

Pasul 3. : exemplificarea modulului de generator de semnal

sgen .usect "SGEN", SGENT_1_LEN,1

sgen .tag SGENT_1

Pasul 4.: se definesc simbolurile pentru a initializa modulul generator de semnal (modulul generator de semnal este initializat pentru a genera un semnal sinusoidal de 50Hz avand o frecventa de esantionare de 20kHz).

SGEN_OFFSET .set 9333h ; offset = -0.15

SGEN_GAIN .set 5333h ; gain = 0.65 in Q15

SGEN_FREQ .set 1999 ; freq = (5/25)*2^15 = 1999

SGEN_STEP_MAX .set 6000 ; FMAX = [step_max × FS ]/65536

; = [6000 × 20k]/65536 = 1831

Pasul 5.: initializarea modulului generator de semnal

LDP #sgen

SPLK #SGEN_STEP_MAX, sgen.step_max

SPLK #SGEN_GAIN, sgen.gain

SPLK #SGEN_OFFSET, sgen.offset

SPLK #SGEN_FREQ, sgen.freq

SPLk #0, sgen.alpha

Pasul 6.: se invoca modulul generator de semnal in ISR

MAR *,AR1 ;invocarea modulului generator de semnal

SPLK #sgen,*+

CALL SGENT_1_calc

MAR *-

Pasul 7.: se editeaza fisierul de comanda pentru linker, in scopul de a plasa look-up table in memoria program

Exemplu :

Urmatorul pseudo-cod exemplifica pentru modulul SGENT_1 generarea unui semnal sinusoidal cu frecventa de 50Hz.

.include "sgen.asm"

.ref SGENT_1_calc ; referinta externa pentru functie

sgen .usect 'SGEN',SGENT_1_LEN,1

sgen .tag SGENT_1

SGEN_OFFSET .set 0000h ; offset = 0

SGEN_GAIN .set 7FFFh ; gain = 1 in Q15

SGEN_FREQ .set 5369 ; freq = (50/305.17)*2^15 = 5369

SGEN_STEP_MAX .set 1000 ; FMAX = [step_max × FS ]/65536

; = [1000 × 20k]/65536 = 305.17

main:

; initializarea modulului

LDP #sgen

SPLK #SGEN_STEP_MAX, sgen.step_max

SPLK #SGEN_GAIN, sgen.gain

SPLK #SGEN_OFFSET, sgen.offset

SPLK #SGEN_FREQ, sgen.freq

SPLK #0, sgen.alpha

isr20k:

; invocarea calculului rutinei in ISR a generatorului de semnal

MAR *,AR1 ; Invoke the Signal Generator module

SPLK #sgen,*+

CALL SGENT_1_calc

MAR *-

3. DATE DE PROIECTARE

f = 5Hz

fmax = 25Hz

amplitudinea (gain) = 0.65

componenta continua (offset) =-0.15

4. CALCULUL VALORILOR

Datele primite mai sus se calculeaza in modul de reprezentare Q15 pentru a fi introduse in proiect.

Mai intai, conform tabelului, vom calcula frecventa freq

freq = (5/25) * 2^15 = 6553

freq in Q15=1999h

Amplitudinea, o vom calcula in felul urmator :

gain = 32768 * 0.65 = 21299

Acest rezultat, care este in zecimal trebuie sa-l transformam in hexa. Pentru aceasta :

21299=0101.0011.0011.0011= 5333h

Astfel rezulta ca amplitudinea (gain) in Q15 este 5333h.

In continuare calculam offsetul ca mai sus :

-4915 = 1001.0011.0011.0011 = 9333h

Deci offset-ul este 9333h

Ultimul calcul il vom face, in scopul de a gasi step_max, cu ajutorul formulei FMAX = [step_max × FS ]/65536 din care rezulta

step_max = [FMAX * 65536]/FS = [25 * 65536]/ 20000 = 81

In ANEXA1 este prezentat programul si modul de introducere a rezultatelor provenite din calculele efectuate mai sus, iar in ANEXA2 sunt prezentate rezultatele simularii.

ANEXA1.1

ANEXA1.2

ANEXA1.3

ANEXA2





Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate