home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


accelerare una moltiplcazione
     
Autore Messaggio opzioni
MB54




una ogni 100 livelli


postato il:
09.07.2019, alle ore 18:11
accelerare una moltiplcazione 

segue
MB54




una ogni 100 livelli


postato il:
09.07.2019, alle ore 18:26
Buon pomeriggio.

Ad un PIC18F45K22 devo far fare l' analisi di un segnale acquisito a 10 bit dall' ADC e OGNI TOT blocchiacquisiti devo fargli anche calcolare il valore Vrms e l' offset DC, fare la media mobile di VRMS ecc.

Il calcolo di Vrms però è molto lento. Ad esempio per blocchi di 25 valori campionati dall' ADC e salvati nel vettore testData. le istruzioni seguenti richiedono poco meno di 3,2 mS con Fosc a 32M.

for k = 0 to 24 ' rileggo testData e calcolo Vrms e Vdc
RMSQ = testData[k] * testData[k] + RMSQ 'longword 3,4 mS NN24
DC = testData[k] + DC 'circa 200 µS
next k

I valori in testData sono word a 16 bit, RMSQ è un intero a 32 bit.
Esiste una possibilità di ridurre significativamente il tempo di calcolo di RMSQ ? Come ultima spiaggia potrei passare per testData a byte anzichè word, ma preferirei mantenere la risoluzione del ADC a 10b.
Suggerimenti?
MB54




una ogni 100 livelli


postato il:
09.07.2019, alle ore 18:29
PS: non ho un quarzo a 16M, per cui non posso usare Fosc a 64MHz, anche perchè devo campionare con l' ADC alla frequenza piu' bassa possibile (Fosc=8M e Fosc/64 per il TAD dell' ADC)
caccamo2





postato il:
09.07.2019, alle ore 19:25
La serie 18 integra moltiplicatore 8x8 singolo ciclo, se vuoi andare veloce quindi devi limitare gli operandi a 8 bit.
Altrimenti e' normale che ci metta cosi tanto e non ci sono trucchi che puoi escogitare.
Un quarzo puoi comprarlo non costa molto, per la questione adc se non ricordo male dovresti avere la possibilita' di clockarlo da timer, svincolandoti cosi dal master clock.



...
caccamo2





postato il:
09.07.2019, alle ore 19:32
verifica anche il settaggio del livello di ottimizzazione se ce l'hai, e prova anche a scrivere quel tratto di codice in assembly per assicurarti che il limite non sia il compilatore, anche se non credo proprio sia lui.


...
MB54




una ogni 100 livelli


postato il:
09.07.2019, alle ore 19:58
caccamo2:
La serie 18 integra moltiplicatore 8x8 singolo ciclo, se vuoi andare veloce quindi devi limitare gli operandi a 8 bit.
Altrimenti e' normale che ci metta cosi tanto e non ci sono trucchi che puoi escogitare.


Ultima spiaggia, ma se non c'è di meglio

caccamo2:

Un quarzo puoi comprarlo non costa molto,

era per poter provare subito.

caccamo2:

per la questione adc se non ricordo male dovresti avere la possibilita' di clockarlo da timer, svincolandoti cosi dal master clock.


Non ci avevo pensato, grazie


caccamo2:
verifica anche il settaggio del livello di ottimizzazione se ce l'hai,

uso mikrobasic, ottimizzazione a manetta (level 5 nel caso specifico)


caccamo2:

e prova anche a scrivere quel tratto di codice in assembly

non conosco l' assembler.

Avevo anche provato a usare l' oscillatore interno, ma non sono riuscito a far funzionare il PLL. Avesse funzionato potevo usare 64M (16*4 PLL) per i calcoli e 8 (divviso poi per 64 ) per l' ADC. Domani riprovo, qualche cosa mi sfugge sull' uso del PLL con l' oscillatore interno: via codice non riesco ad abilitarlo (cosa che invece funziona usando un quarzo).

Domani provo anche a vedere la velocità con gli operandi a 8 bit.


MB54




una ogni 100 livelli


postato il:
09.07.2019, alle ore 20:14
Provato con oscillatore interno a 64M (Fosc= 4*16): ovviamente i tempi si dimezzano, da 3,4 mS a 1,7 mS per 24 cicli
Provato con operandi a 8 bit, i tempi si dimezzano ulteriormente scendendo a 800 µs per 24 cicli.

Mi sembra un buon risultato: ipotizzando di avere al massimo 66 cicli, basteranno 2,2 mS totali. Buon tempo
marsram




una ogni 100 livelli
una ogni 10 livelli


postato il:
09.07.2019, alle ore 20:58
Come tutti i PIC del genere, puoi usare come clock di conversione FRC, cioè l'oscillatore interno. E' indipendente dal clock è ha un tempo medio di 1.7us contro 1.0us per FOSC/64 @ 64NHz.

FRC si ottiene con ADCs<2:0>=011
rcc.roberto



[pagine pubblicate]

postato il:
09.07.2019, alle ore 21:29
Se il problema sta nel tempo impiegato in quel momento che fa i conti, puoi invece fare i conteggi singoli dopo ogni lettura, distribuendo così il tempo impiegato.

Considerando però che ti risparmi i tempi di scrittura e lettura, magari guadagni del tempo


for k = 0 to 24 ' rileggo testData e calcolo Vrms e Vdc

testData = acquisizioneADC

RMSQ = testData * testData + RMSQ 'longword 3,4 mS NN24
DC = testData + DC 'circa 200 µS
next k


i testData senza [k] perché utilizzati al momento, in uscita salvi i valori calcolati.


P.S.
perché testData * testData ?
caccamo2





postato il:
09.07.2019, alle ore 23:40
perche' per calcolare l'rms devi elevare i campioni al quadrato...


...
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale