C2000-LaunchPad - Realizzare un voltmetro true rms

8 Anni 6 Mesi fa #1 da paoletto
C2000-TMS320F28377S LaunchPad è stato creato da paoletto
Salve a tutti, dopo una lunga pausa rieccomi sul sito di Mauro :)

Verrò subito al dunque, ho deciso di aprire un post su questa piattaforma della Texas Instruments perché trovo questo dispositivo molto interessante e mi piacerebbe che si diffondessero il suo utilizzo e le idee per farci qualcosa di utile.
Come la maggior parte saprà, si tratta di un microcontrollore\DSP a 32 bit pensato per fare controllo.
E' un microcontrollore piuttosto complesso che richiede un certo impegno, ma se uniamo le forze il suo studio diventa meno noioso e più semplice.
La potenza di calcolo è veramente notevole, siamo su 400MIPS a 200MHz di clock (per non parlare della versione dual core a 800 MIPS!!) e questo permette di chiudere loop di controllo anche a qualche decina di KHz. E' anche dotato di una piccola CPU (CLA) che è in grado di effettuare da sola il controllo di un sistema mentre la CPU principale può fare altro.
Esiste una ricca collezione di librerie e funzioni per il suo utilizzo ma non è semplice districarsi fra la documentazione. All'inizio può sembrare avvilente, ma se ci si sbatte la testa e osservando gli esempi di codice qualcosa si impara.
Uno studio dettagliato e sistematico è pressoché impossibile, servirebbe un corso a parte, quindi cerchiamo di fare il possibile imparando dagli esempi e studiando le parti che effettivamente interessano.

La scheda di sviluppo la trovate qui

www.ti.com/tool/LAUNCHXL-F28377S

Io ho deciso di usare CCS, il suo ambiente nativo, ma si può anche usare energia.
Non ci sono limitazioni sul codice prodotto dal compilatore, quindi è pianamente sfruttabile.

Dovrete installare anche la Controlsuite da cui potrete attingere gli esempi di codice e la documentazione.

In allegato troverete un esempio "blinky_cpu01.c" (importabile in CCS da Controlsuite) a cui ho aggiunto la libreria per il display LCD_44780 di Mauro scritta per il pic18 che ho adattato per questa piattaforma.
Non è cambiato molto, solo vanno ridefiniti i GPIO.
Per i delay ho usato le macro già messe a disposizione dall'ambiente.
La funzione itoa non è supportata dal compilatore ma è disponibile la ltoa che fa esattamente lo stesso.
Inoltre ho aggiunto una piccola funzione che permette di scrivere sul display un numero in virgola mobile: inizialmente volevo usare la sprintf, ma non sono riuscito a farla funzionare e quindi ho deciso di farne una ex novo.
La libreria non è divisa in file .c e .h ma è tutta nello stesso file perché volevo subito testare se funzionava correttamente.

@ Mauro: se ne hai voglia puoi scriverla meglio con le direttive di compilazione condizionale così la estendiamo anche al C2000.

Chi di voi abbi già esperienza o desideri cimentarsi con questa piattaforma si faccia sentire ;)

File allegato:

Nome del file: EsempioC20..._Mauro.c
Dimensione del file:19 KB



Ciao!
Paoletto
Allegati:

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • paoletto
  • Avatar di paoletto
  • Elite Member
  • Elite Member
Di più
8 Anni 6 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic C2000-TMS320F28377S LaunchPad
Bene, bene,

vedo che il lavoro continua.

vedo che la libreria è in effetti rimasta quasi intoccata.
In effetti LTlib, nel nome, non ha più un riferimento ai PIC visto che "vorrebbe" essere generica ed estendibile ad altre MCU.
Faccio spesso uso del solo C e le nuove librerie module_xxxxx isolano i dettagli di alcune periferiche specifiche della MCU.

Continua il lavoro.
...magari non fondere i file altrimenti mi rendi il lavoro più lungo.
Potresti modificare anche la libreria Delay e usare direttamente quella.

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
8 Anni 6 Mesi fa #3 da paoletto
Risposta da paoletto al topic C2000-TMS320F28377S LaunchPad
Ciao Mauro, seppure a singhiozzi voglio cercare di portare avanti il discorso.
In effetti non ho un'idea precisa su cosa sviluppare, ma ad esempio pensavo di fare tante piccole applicazioni che consentano di avere una panoramica generale del dispositivo: I2C, SPI, UART, ADC, DAC, insomma usare un poco tutte le periferiche e fare un po di esperimenti.
Penso che studiarsi tutto e bene da subito richieda un lavoro super e io non ho tutto questo tempo :D
quindi procediamo attingendo dagli esempi e modificandoli. Ovviamente dove serve, bisogna consultare la documentazione nel dettaglio ;)

Solo dopo avere una conoscenza di base allora possiamo pensare a qualcosa di complesso, ma per ora mi sembra inutile.

Che ne pensi?

Un appunto sulla sprintf: questa "simpatica" funzione va bene(verificato) se converti in stringa un numero intero, ma se specifichi un float non c'è verso, si pianta il codice.
Ho letto qualcosa sul wiki TI a riguardo, in effetti c'è qualche problema relativamente alla grandezza dello stack che deve essere ampliato. Io l'ho modificato da CCS ma deve anche essere fatta anche una modifica al linker che onestamente non vorrei toccare almeno per adesso.
In ogni caso sconsigliano di usarla dal momento che viene usata allocazione dinamica della memoria, ti risulta qualcosa? Hai qualche idea o suggerimento?

Ciao, al prossimo accrocco :D

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • paoletto
  • Avatar di paoletto
  • Elite Member
  • Elite Member
Di più
8 Anni 6 Mesi fa #4 da Mauro Laurenti
Risposta da Mauro Laurenti al topic C2000-TMS320F28377S LaunchPad
Dividi e conquista è un buon approccio.
Effettivamente per MCU complesse se si volesse fare uno studio passo passo si rischierebbe di non iniziare mai a programmare.

Buttarsi su degli esempi e studiare l'architettura in parallelo può aiutare ad avere velocemente dei risultati e mantenere alta la motivazione.

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
8 Anni 6 Mesi fa - 8 Anni 6 Mesi fa #5 da paoletto
Risposta da paoletto al topic C2000-TMS320F28377S LaunchPad
Il lavoro continua...

Usando il C2000 ho fatto un piccolo voltmetro a vero valore efficace (True RMS).
Con opportuno partitore resistivo e diodi di protezione può diventare un ottimo strumento di misura per tensioni e correnti periodiche di forma d'onda qualsiasi.
Prima di postare il codice spenderò giusto due parole sul valore efficace di un segnale.

Si definisce valore efficace di un segnale periodico qualsiasi la radice quadrata della potenza del segnale.
La potenza di un segnale periodico altro non è che la media (su uno o più periodi) del modulo del segnale al quadrato.
L'operazione di modulo è necessaria dal momento che i segnali possono anche essere funzioni complesse, ma ci limitiamo soltanto al caso dei segnali puramente reali: in tal caso il modulo non opera e rimane solo il quadrato del segnale.
Nel caso di un segnale analogico per valutare la media è necessario calcolare un integrale in cui l'intervallo di integrazione è pari proprio ad uno o a più periodi del segnale. Se poi si divide tale integrale per l'intervallo di integrazione si ottiene la media.
Fortunatamente nel caso di segnali a tempo discreto (che il nostro C2000 sa trattare molto bene :D) non occorre calcolare un integrale ma una semplice somma: basta sommare N campioni (in uno o più periodi) del nostro segnale e dividere questa somma per N stesso. Se poi sommo i quadrati del segnale e divido per N e poi estraggo la radice quadrata, ottengo il valore efficace del segnale.

In allegato troverete il file con il codice ottenuto a partire dall'esempio "adc_soc_epwm_cpu01.c" disponibile nella Controlsuite.

Nell'esempio, il convertitore ADC è azionato ogni 20us dal PWM sotto interrupt, ovvero campiona a 50kHz.
Se ora acquisiamo un segnale a 100Hz campionandolo a 50kHz occorre un buffer di 500 campioni per avere un periodo del segnale.
Ovviamente è una frequenza di campionamento altissima per un segnale così lento, ma per ora va bene così.
Nel seguito miglioreremo il programma e lo renderemo più generale.
Poiché però il convertitore è unipolare, è stato necessario sommare una componente continua (media) al segnale per non tagliare le semionde negative, e poi in SW è stata tolta.
Il calcolo del valore efficace è stato infine eseguito sul segnale a media nulla ottenuto da quello originario acquisito privato della media e infine plottato sul display.
Come prova ho usato una sinusoide a 100Hz di un volt di picco e come sappiamo il suo valore efficace è pari al valore di picco diviso la radice di due che guarda caso è proprio pari a 0.707 ...niente male vero?

Al prossimo accrocco :d

Paolo.


File allegato:

Nome del file: Truermsvoltmeter.txt
Dimensione del file:23 KB


Allegati:
Ultima Modifica 8 Anni 6 Mesi fa da paoletto. Motivo: Non ha inserito una foto

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • paoletto
  • Avatar di paoletto
  • Elite Member
  • Elite Member
Di più
Moderatori: Mauro LaurentiMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login