|
Autore |
Messaggio |
opzioni |
MB54
postato il: 09.07.2019, alle ore 18:11 |
accelerare una moltiplcazione
segue |
|
MB54
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
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
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
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
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...
... |
|
|