Mini Pulser Eberline MP-1

Avatar utente
eliocor
Senior
Messaggi: 430
Iscritto il: 10/10/2015, 23:28
Località: Europe
Contatta:

Re: Mini Pulser Eberline MP-1

Messaggio da eliocor » 12/03/2017, 22:57

Da qualche parte ho il codice completo (per arduino) e qualcuno di questo forum dovrebbe avere ancora qualcuno degli shield che avevo fatto a suo tempo.

Avevo anche una versione più completa che simulava l'impulso generato dal Ludlum 500 (che è diverso da quello dei normali pulser) ma non ho mai avuto il tempo di completarre l'aggeggio per limiti intrinseci dell'HW arduino.
Magari posso tirare di nuovo fuori il progetto e ristrutturarlo per un Maple Mini che mi permetterebbe di generare gli impulsi come dovuto (due timer 16 bit messi in cascata).
È da un pezzetto che ci sto pensando: interessa lo schema? Il progetto sarebbe compatibile con le funzionalità del 500 ma con più opzioni (impulsi casuali, regolazione tensione impulso via SW, ...)


٩(•̮̮̃•̃)۶ - Excusatio non petita, accusatio manifesta

Avatar utente
Datman
Messaggi: 410
Iscritto il: 29/09/2016, 22:33
Località: ROMA
Contatta:

Re: Mini Pulser Eberline MP-1

Messaggio da Datman » 12/03/2017, 23:23

Fanno tutto i timer dell'atmega328?
Mi piacerebbe vederlo, perché ancora non li ho studiati. Non ho ancora avuto bisogno di usarli seriamente. Ho solo provato un frequenzimetro e ne ho capito le potenzialità.
D'altra parte, una cosa simile non si può fare contando con millis() che va a passi di 1 millisecondo, salvo per i tempi più lunghi. Ad esempio:
10mS=6000cpm
11mS=5455cpm
12mS=5000com
quindi la regolazione sarebbe molto grossolana. Usando delay(), invece, tra un impulso e l'altro si ferma tutto. Si potrebbe ovviare mettendo il pulsante su un ingresso di interrupt, in modo che interrompa comunque il delay() ogni volta che viene premuto, permettendo le regolazioni. Si potrebbe anche usare delay() per e pause brevi e millis() per quelle più lunghe.
Ultima modifica di Datman il 13/03/2017, 0:25, modificato 2 volte in totale.


Gianluca
Canale Youtube: [External Link Removed for Guests]

Avatar utente
eliocor
Senior
Messaggi: 430
Iscritto il: 10/10/2015, 23:28
Località: Europe
Contatta:

Re: Mini Pulser Eberline MP-1

Messaggio da eliocor » 12/03/2017, 23:34

è appunto quello uno dei limiti dell'ATMEGA328 (beh, se è per quello ha molti altri limiti...): 16 bit per generare un impulso non sono sufficienti a mantenere la dinamica dei tempi come nel 500: [External Link Removed for Guests]" onclick="window.open(this.href);return false;
puoi risolvere utilizzando un monostabile, ma se vuoi evitarlo dovresti usare un timer a 32 bit (che l'STM32F103 ti può permettere).

Tra l''altro la schedina è molto più potente di un arduino e ti costa molto di meno: [External Link Removed for Guests]" onclick="window.open(this.href);return false;
Beh, un arduino nano costa ancora di meno: [External Link Removed for Guests]" onclick="window.open(this.href);return false; e secondo i miei parametri è più adatto (dimensioni) per la maggioranza dei dispositivi.

P.S.: vedo se riesco a recuperare lo schema: è in un vecchio PC che ha problemi ad avviarsi.


٩(•̮̮̃•̃)۶ - Excusatio non petita, accusatio manifesta

Avatar utente
Datman
Messaggi: 410
Iscritto il: 29/09/2016, 22:33
Località: ROMA
Contatta:

Re: Mini Pulser Eberline MP-1

Messaggio da Datman » 12/03/2017, 23:39

Beh... si può anche lavorare con un duty cycle del 50% e poi derivare l'impulso. Il problema è che per impostare i cpm bisogna calcolare 1/x e, per avere una variazione di 1, vengono variazioni infinitesime.
Ultima modifica di Datman il 13/03/2017, 0:23, modificato 1 volta in totale.


Gianluca
Canale Youtube: [External Link Removed for Guests]

Avatar utente
eliocor
Senior
Messaggi: 430
Iscritto il: 10/10/2015, 23:28
Località: Europe
Contatta:

Re: Mini Pulser Eberline MP-1

Messaggio da eliocor » 13/03/2017, 0:06

OK, trovati gli schemi delle due versioni:
Pulser2 è quella più semplice e qualcuno del forum dovrebbe avere ancora gli shield. Questo funziona senza alcun problema con arduino. Il condensatore serie/parallelo è solo per la sperimentazione dei valori. In allegato anche layout PCB nel caso qualcuno volesse farsi lo shield.
Pulser4 è la versione che richiede impulsi di larghezza ben specifica (per comportarsi esattamente come un 500) che arduino non può riuscire a dare in tutto il range dato che ad un certo punto bisogna usare il prescaler. Attenzione che nello schema ci sono dei componenti fittizi, usati nel mio prototipo e non richiesti nella versione definitiva.

Disponibile per eventualli chiarimenti.
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.
Ultima modifica di eliocor il 14/03/2017, 5:26, modificato 1 volta in totale.


٩(•̮̮̃•̃)۶ - Excusatio non petita, accusatio manifesta

Avatar utente
Datman
Messaggi: 410
Iscritto il: 29/09/2016, 22:33
Località: ROMA
Contatta:

Re: Mini Pulser Eberline MP-1

Messaggio da Datman » 13/03/2017, 0:26

In realtà potrei fare un contatore che si incrementa rapidissimamente, fino a raggiungere il valore desiderato. L'unità di tempo sarà alcuni cicli di clock, quindi frazioni di uS, quindi si risolve il problema della granularità. Certo, uno bravo farebbe con un timer... :-)

...e con ciò... Buona notte a tutti!


Gianluca
Canale Youtube: [External Link Removed for Guests]

Avatar utente
eliocor
Senior
Messaggi: 430
Iscritto il: 10/10/2015, 23:28
Località: Europe
Contatta:

Re: Mini Pulser Eberline MP-1

Messaggio da eliocor » 13/03/2017, 0:30

è una cosa aberrante fare con un loop stretto!!!
Se usi lo schema Pulser2 non hai alcun problema* e puoi avere praticamente qualsiasi valore.
Sono solo pochissime righe di codice ed hai qualcosa che è molto più elegante e preciso!

*) Solo pulser4 richiede un impulso di larghezza ben precisa.


٩(•̮̮̃•̃)۶ - Excusatio non petita, accusatio manifesta

Avatar utente
eliocor
Senior
Messaggi: 430
Iscritto il: 10/10/2015, 23:28
Località: Europe
Contatta:

Re: Mini Pulser Eberline MP-1

Messaggio da eliocor » 13/03/2017, 1:03

OK, qualche maggiore dettaglio:
IMG_2293a.jpg
prototipo shield arduino della versione Pulser2
5usPulse.jpg
forma del segnale generato da un Ludlum 500 gentilmente fattami da GEO (K0FF): come si può notare, l'impulso ha il picco "piatto" al contrario della forma degli altri pulser.
Ludlum500.png

Simulazione LTSpice del segnale generato da Pulser4


In allegato anche il codice (non propriamente commentato) di come si possono generare impulsi col PWM dell'arduino (Pulser2).
Il range è compreso da 0.25CPS a 50000CPS (15CPM to 3000000CPM) che ritengo sia sufficiente per i tipici utilizzi. La precisione è data solo dalla base dei tempi di arduino. Più i tempi si allungano, più la granularità è grossolana (dovuta al prescaler applicato al timer) ma è più che sufficiente per ogni utilizzo.
Non lamentarti troppo su come ho scritto il codice: è stato "buttato giù" in pochissimo tempo. I commenti sono in inglese, dato che sono da sempre stato abituato a fare così. La prima parte è in italiano, dato che tale codice sarebbe dovuto andare in altre mani.
Anche qui non ho problemi a dare chiarimenti.
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.


٩(•̮̮̃•̃)۶ - Excusatio non petita, accusatio manifesta

Avatar utente
Datman
Messaggi: 410
Iscritto il: 29/09/2016, 22:33
Località: ROMA
Contatta:

Re: Mini Pulser Eberline MP-1

Messaggio da Datman » 14/03/2017, 0:42

Fino a 300.000 cpm sta entro il 3% :) :
[External Link Removed for Guests]" onclick="window.open(this.href);return false;

Gli impulsi sono positivi, larghi 10uS. Con un NPN diventano chiusure a massa di 10uS.


Gianluca
Canale Youtube: [External Link Removed for Guests]

Avatar utente
eliocor
Senior
Messaggi: 430
Iscritto il: 10/10/2015, 23:28
Località: Europe
Contatta:

Re: Mini Pulser Eberline MP-1

Messaggio da eliocor » 14/03/2017, 2:12

Non stai usando Fortran 77 od ancora peggio RPG: le variabili, specialmente se globali, dovrebbero avere dei nomi un po' più autoesplicativi e non avere lunghezza di un solo carattere; non dico di usare la [External Link Removed for Guests], ma....
È una cosa che ho già notato in un tuo altro progetto.
La funzionalità del programma sarà eccellente, ma la leggibilità è discutibile....
Ti consiglio, almeno nella definizione delle variabili, di mettere un commento su cosa fanno/servono.

Riguardo al funzionamento del programma, ho capito male, oppure ad ogni accesso al menù/interfaccia utente, la frequenza di ripetizione va a farsi benedire?

Ho visto che ieri sera ti sei scaricato l'esempio che ti ho fornito: come ti pare la sua logica?
Forse un po'più complicata a causa della programmazione diretta dei registri, ma hai la completa indipendenza della generazione degli impulsi dalla gestione del micro. Fai partire il generatore e te ne dimentichi sino alla prossima riconfigurazione dei suoi parametri (e quando genera gli impulsi consuma lo 0% di CPU).
Niente strane costanti (1.1/1.05/0.98) con cui dover correggere l'esecuzione del programma. E se tu dovessi aggiungere dell'altro codice? Devi ricalcolare le costanti? E se il povero malcapitato* che ha scaricato il SW non avesse un oscilloscopio/frequenzimetro per controllare la temporizzazione, che fa? crede che sia tutto OK mentre invece i timing sono completamente sballati?
Altre possibilli situazioni:
1) l'IDE di arduino viene aggiornata con un compilatore più efficiente o con un migliore ottimizzatore: i tuoi numeri e calcoli 'hardcoded' gestiranno correttamente le temporizzazioni?
2) viene utilizzato un modello di arduino a 3.3V ([External Link Removed for Guests], [External Link Removed for Guests], ...): la loro frequenza di lavoro non è più 16MHz ma 8MHz (vedi [External Link Removed for Guests]" onclick="window.open(this.href);return false; pagina 369). Anche qui l'ignaro utilizzatore del SW avrà valori sballati.

Sicuramente ti sarò sembrato impietoso ma di professione, oltre a sviluppare HW scrivo anche firmware e non mi posso permettere in alcun modo di trascurare simili particolari. Dato che vedo che ti dai da fare con la piattaforma di arduino mi permetto di darti qualche dritta perché vedo che dietro c'è interesse.

Un esempio per tutti: lo [External Link Removed for Guests] di implementazione di un contatore geiger che ho fatto a suo tempo# è stato pensato fin dall'inizio pensando alla portabilità su altri dispositivi. È sufficiente intervenire in pochissime parti del codice ed il codice è pronto per un altro micro.
Anche tu hai espresso perplessità sul porting di Geigerino su Simple Geiger 2:
Portare che cosa del mio?...
Non c'è l'encoder e il display è diverso, quindi bisogna rifare un bel po'...
Se si tratta solo di cambiare i pin, volentieri. Non è immediato, ma basta lavorarci un po'.
Tanto di cappello per ciò che hai fatto, ma se tu avessi scritto il codice in maniera ortogonale e portabile, non avresti risposto così. Non usi un encoder? dov'è il problema? cambi le funzioni di I/O utente e le adatti ai pulsanti. Questa procedura è chiamata incapsulamento o anche astrazione.
Nei miei limiti di tempo non ho problemi a darti la mia disponibilità per discutere di queste cose in maniera costruttiva.


*) basta leggere i forum dedicati ad arduino per rendersi conto che il 95% di coloro che lo usano non hanno la più pallida idea di come cambiare anche una sola linea di codice! Non osiamo pensare ad analizzare il funzionamento di un programma che sia un poco più complicato del fare lampeggiare un LED! :shock:
#) buttato giù anche quello in molta fretta


٩(•̮̮̃•̃)۶ - Excusatio non petita, accusatio manifesta

Rispondi

Torna a “Elettronica”