Segnale non linerare in ingresso come lo importo?

Ciao a tutti ,
dovrei acqusire in ingresso un segnale che ha una fequenza fissa di 970 hz ma varia in questa finestra in modo non linerare assomiglia quasi ad una rampa.
Io vorrei calcolare il valore medio ho letto che si puo usare pulsein ma se nn sbaglio è valida solo quando il segnale è digitale.
Sapete dirmi una soluzione.
ps: ho pensato ad un sensore ad effetto hall ma mi son posto il problema se si puo fare con arduino.

ciao spank_78
non ti spieghi in modo che io capisco qualcosa.
Hai un PWM alla frequenza 970 HZ?
oppure hai un segnale modulato in ampiezza (varia l'ampiezza dei segnale)?

  • Per il primo basta che fai con un operazionale un comparatore (metti un patitore resistivo su un entrata del operazionale e la tua tensione sul altro. Quando superi la socgli l' uscita cambia e va di nuovo sotto la soglia ritorna allo stato precedente.
  • Per il secondo fai un filtro ( una resistenza in serie e un condensatore a massa) e leggi con un entrata analogica.

Ciao Uwe

Cerco di spiegarmi meglio con un immagine vedi link:http://viewer.zoho.com/docs/dbbLUc segnale in alto con rumore.
per quano riguarda la soluzione con filtro rc non posso prenderla n considerazione perchè il segnale è prelevato da una resistenza di sensing, quindi assorbirebbe corrente ed è un problema.
Non vedere la PWM per me è solo un riferimento.

l'unica cosa che mi viene in mente è campionare molte volte e poi fare la media dei campioni tipo

media = 0;
for(i = 0; i < 1024; i++)
{
  media += ADC;
}
media /= 1024;

naturalmente adattandolo in modo che campioni la tua finestra temporale

Ciao spank_78

Non ha senso che ci fai vedere un segnale di appena 100mVpp con un disturbo di alta frequenza di 1Vpp (qua é da vedere se il disturbo non é ancora piú ampio, ma non viene visualizzato bene a causa dello campionamento del oscilloscopio digitale). :wink:

Per favore spiegaci cosa vuoi misurare con possibile schema elettrico e come hai fatto il circuito per misurarlo.

Ciao Uwe

sto utilizzando questo integrato L6227 DMOS DUAL FULL BRIDGE DRIVER WITH PWM CURRENT CONTROLLER (http://www.st.com/stonline/products/literature/ds/9453/l6227.pdf)
Io vorrei misurre la tensione ai capi della Rsense,poi dividere per R=0.56 per ottenere infini la corrente media.
Come spiega il datasheet a pag 12 figure 11, nella Rsense scorre la corrente solo quando mi trovo nella configurazione A) ON TIME.
"frog " grazie avevo pensato pure io ad una cosa simile ma poi il mio dubbio è su come dire campiona solo per il periodo di 1ms.

ma scusa, tu non generi un segnale per dirgli "accenditi!" ?
il vero problema è: il numero di campioni che riesci ad avere in 1ms è sufficiente ad avere una media decente verosimile?
pagina 250 del datasheet:

Up to 76.9 kSPS (Up to 15 kSPS at Maximum Resolution)

ciao spank_78

presumo che l'utenza che piloti é un piccolo motorino. Dal grafico che hai inviato la corrente é di ca 150mA.
Se vuoi pilotare propio quel motorino Ti consiglio un altro integrato che é disegnato per potenze minori tipo il l3967 (schedina easydriver 4.1) per 750mA Easy Driver stepper motor driver

Puoi anche mettere una resistenza Rsense Piú grande per avere uan tensione piú grande. Tanto la tensione masima con un corente di 1,4A e 0,6 Ohm é di 0,84V. Se la corrente del motorino é bassa puoi anche aumentare la resistenza per avere la tensione sulla resistenza di 0,8V e percui potrebbe essere anche intorno i 3 Ohm.
È possibile (come previsto su altri integrati simili) di mettere in paralello alla Rsense un condensatore di ca 0,1µF.

Puoi mettere un amplificatore operazionale che amplifica il segnale a 5V e con un RC eliminare i disturbi di alta frequenza derivanti dalle comutazioni.

ciao Uwe

ma perchè non raddrizzi la tensione ai capi della resistenza di sense e poi misuri in continua?(andrebbe bene anche una semionda)

ciao brainbooster
Il segnale non é una tensione alternata ma una continua con tanti disturbi sopra.
Ciao Uwe

"uwefed" l'integrato l6227 è sttao scelto per il tipo di controllo ,cmq ti ringrazio per il suggerimento chissa mi potrà servire in futuro.
poi per quanto riguarda la Rsense , con in parallelo una capacità
,proverò e vi farò sapere.
Cmq io devo pilotare due motori brushless.
Ma il problema relativo su come aquisirlo resta!mannaggia sto vedendo eventuali soluzioni ma nn sono venuto a capo ancora.

ciao spank_78
Diamo per dato il motore e l'integrato.

Il motore quanto assorbe a pieno carico? mi mandi il modello del motore e descrivi il carico.

Prendiamo quel dato per dimensionare la resistenza Rsense in modo che a pieno carico ci sono 0.8V (calcolato dai dati tecnici per 0,6Ohm e 1,4 A nominali)
Comunque per eliminare gli disturbi metterei sia un condensatore da 0,1 µF sia in paralello al motore che in paralello alla resistenza Rsense. metterei anche una piccola induttanza in serie ai due cavi del motore. Puó bastare un anello di ferrite sul quale é avvolto 2-3 volte il cavo di alimentazione del motore . Questo messo nelle vicinanze del motore.

Poi vuoi calcolarti la media col programma o fai un circuito RC che fa la media?

Ciao Uwe

Ok.
allora i dati di un motore sono 24 V 600 mA.
Poi voglio calcoare la corrente che circola nel motore con Arduino e pensavo di calcolarla ai capi di Rsense.
Domani mattina metto in pratica i tuoi suggerimenti e ti ringrazio sia te (uwefed) , frog e tutti gli altri che perteciperanno a questo post.
:).

Ciao spank_78
La tua idea é giusta.
Solo che ci sono molti disturbi a causa della comutazione del motore.
Ciao Uwe

Ciao,
Purtroppo anche con l'inserimento dei condensatori il risultato nn cambia.
per quanto riguarda l'acquisizione del segnale, avendo un ampiezza dell'ordine dei milli volt dovrei prima amplificarla nel range 0, 5 V e poi campionarla.
questo è il codice ma ho dei dubbi .

void corrente(){
               for(i = 0; i < 86; i++)
              {
                
               tensione= analogRead(rsense);
                mediatensione += tensione;
                delayMicroseconds(11.7);
                
              }
                mediatensione =mediatensione/86;
                Serial.print("mediat=");
                Serial.println(mediatensione);
                Serial.print("Corrente=");
                Serial.println(mediatensione/0.56);//Rsense=0.56 ohm
 
}

Nel "for" ho messo i<86 perchè se faccio 86*DelayMicro(11,7)=ottengo il periodo di 1 ms che corrisponde a circa 970Hz.
Il mio dubbio e se campiono a 10 bit ho una risoluzione di 4,9 mV , da qui suppongo che devo amplificare il mio segnale.
Dopodichè come faccio a capire l'ordine di grandezza?
mi spiego meglio per il sensore di temperatura si ragionava in questo modo Arduino Playground - Sensori
e il riferiemnto era 5 v.
ora nel mio caso qual'è il riferimento?.
spero di essere sttao chiaro :wink:

ci sono un paio di cose che non mi sconfinferano:

  • inizializzare mediatensione prima del ciclo for
  • io farei direttamente mediatensione += analogRead(rsense)
  • il ciclo for dura ben più di 86*DelayMicro(11,7) perché c'è anche la durata delle altre operazioni. non avevi un segnale che abilita la finestra temporale di 1ms? se possibile io fare una cosa tipo
mediatensione = 0;
tmp = 0;
for(segnale_abilitazione_attivo)
{
  mediatensione += analogRead(rsense);
  tmp += 1;
}
mediatensione /= tmp

per il riferimento dipende dall'entità del tuo segnale, per quello che avevi postato puoi anche impostare il riferimento interno di 1,1Vdc analogReference() - Arduino Reference.
di solito, comunque, si cerca di condizionare il segnale da acuisire in modo che vari nel range 0...Vref in modo da sfruttare tutta la risoluzione dell'AD

Grazie Frog sei sempre troppo gentile.
non sapevo dell'utilizzo di Aref.
Siccome nel progetto ci sta pure un sensore di temperatura , cambiare Aref non è che mi influisce sul campionamento sensore di temperatua lm35dz su analog(0) ?
per quanto rigurda il codice il segnale_abilitazione_attivo potrebbe essere la variazione del duty ; nel codice da te postato non faccio la media sul periodo o mi sbaglio.

il riferimento dell'analogica è una per tutti i canali dell'AD, quindi è meglio se li equalizzi tutti su un range simile in modo da utilizzare lo stesso riferimento piuttosto che cambiarlo ogni volta (non so che tempi di assestamento ci siano)

ehm... nel codice precedente non ci va un for() ma un while(). fatto come l'ho scritto io fa la media partendo quando la funzione viene chiamata e per l'intervallo di tempo durante il quale il segnale di abilitazione è alto.

tu devi fare la media di un intero periodo o della parte in cui l'integrato viene abilitato?

Nel periodo.
frog ma nn potevi essere mio padre cosi mi davi delle dritte!!! :slight_smile: :slight_smile: :wink: :smiley:

suppongo tu debba fare la media su tutti i periodi (uno dopo l'altro). in questo caso devi pensare a qualcosa di diverso dal mero "sommo i campioni e poi divido" perché non avresti poi il tempo per elaborare la media prima di partire con il successivo periodo. prova a cercare se ci sono soluzioni circuitali per fare una media hardware, in questo modo andresti a campionare solo una volta ogni millisecondo.

al massimo potresti sperare di essere mio fratello