Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
UNIVERSITATEA "POLITEHNICA" DIN
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 :
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
Copyright © 2024 - Toate drepturile rezervate