Vai al contenuto
PLC Forum


Contatori veloci


roberto8303

Messaggi consigliati

Avrei necessità di leggere 6 sensori effetto hall per contare gli rpm di motori da 0 a 4000, ma arduino non puo arrivare a 6 interrupt, esiste un altro modo?oppure dei dispositivi che mi diano in uscita una tensione analogica in proporzione agli rpm letti tramite il sensore.

Link al commento
Condividi su altri siti


  • Risposte 127
  • Created
  • Ultima risposta

Top Posters In This Topic

  • roberto8303

    56

  • ilguargua

    32

  • Livio Orsini

    26

  • GiRock

    9

Devi tarae gli RC per avere 10V alla massima freqeunza corrispondente ai 4000 rpm. Se fai bene il circuito l'uscita è abbastanza lineare ed abbastanza ripetitiva.

 

Aziende come SIEI e SCS avevano a catalogo convertitori F-V basati su integrati simili per convertire proprio i segnali di encoders in 0-10V

Link al commento
Condividi su altri siti

ok grazie a tutti, li ho ordinati appena mi arrivano li provo e vi chiederò come tararli ma secondo voi se mi fermo a 3000rpm e li leggo con arduino uno cioe con 1024 punti su 5 volt riesco ad ottenere un risoluzione di circa +/- 10rpm?

Link al commento
Condividi su altri siti

un impulso a giro, poi ci dovrebbe essere anche un tachimetro da 69 impulsi 5mt per sapere la velocità in km/h

Però sto pensando se utilizzo un arduino per ogni contatore  cioe 5 in totale,forse tolgo tutti i problemi e faccio il conteggio direttamente da arduino senza questi convertitori.

E dal punto di vista di funzionalità e anche meglio cosi se si ferma un display gli altri funzionano sempre.

Link al commento
Condividi su altri siti

4 ore fa, roberto8303 scrisse:

un impulso a giro

 

Sono 50Hz a 3000 rom, troppo pochi per avere un'uscita attendibile.

50Hz sono 20 ms se campioni gli ingressi normali con un clock di 5ms, tempo più decente, puoi contare direttamente i tuoi 5 encoders.

Link al commento
Condividi su altri siti

3 ore fa, roberto8303 scrisse:

quindi senza utilizzare gli interrupts?

No, usando l'interrupt di un timer. Ho buttato giù un esempio veloce, compila senza errori, ma premetto che sono un po' arruginito, quindi prendilo con le molle :

#include <MsTimer2.h>

volatile int rpms[5] = {0,0,0,0,0};
volatile int cnt = 1;
char buf[40];

void t2isr(void)
{
  byte pb = PINB & B00111110;
  pb >> 1;
  byte ndx=1;
  for(byte i=0;i<5;i++)
  {
    ndx << i;
    if(pb & ndx) rpms[i]++;
  };
  cnt++;
}


void setup() {
  // put your setup code here, to run once:
  for(byte i=0;i<5;i++) pinMode(9+i, INPUT);
  Serial.begin(9600);
  MsTimer2::set(5,t2isr);
  MsTimer2::start();

}

void loop() {
  // put your main code here, to run repeatedly:
  if(cnt == 200)
  {
    MsTimer2::stop();
    snprintf(buf,40,"1:%i 2:%i 3:%i 4:%i 5:%i",rpms[0] * 60,
                                               rpms[1] * 60,
                                               rpms[2] * 60,
                                               rpms[3] * 60,
                                               rpms[4] * 60);
    for(byte i=0;i<5;i++) rpms[i]=0;
    cnt=1;
    MsTimer2::start();
    Serial.println(buf);
  }
  }
  

Come ingressi usa i pins da 9 a 13 , che sono i bit 1-5 della porta B.  Non credo sarebbe male far precedere i sensori da uno squadratore tipo 74hc14 o 40106.

 

Ciao, Ale.

Link al commento
Condividi su altri siti

grazie, a dire il vero ho trovato una libreria per il conteggio frequenza, mi potreste aiutare a pulire il segnale di un proximity con un 74hc14? mi occorre uno schema elettrico per i collegamenti...

Link al commento
Condividi su altri siti

Intanto posto una correzione :

void t2isr(void)
{
  static byte prev_pb = 0;
  byte pb = PINB & B00111110;
  pb >> 1;
  byte ndx=1;
  for(byte i=0;i<5;i++)
  {
    ndx << i;
    if(pb & ndx && !(prev_pb & ndx)) rpms[i]++;
  };
  cnt++;
  prev_pb = pb;          
}

Il 74hc14 consiste di 6 inverter con trigger di schmitt, basta che colleghi il sensore in ingresso e l'uscita all'arduino. Piuttosto, come e a quanti volt sono alimentati i sensori? Se sono alimentati esternamente credo sia meglio usare un fotoaccoppiatore.

 

74HC14.jpg

 

Ciao, Ale.

Link al commento
Condividi su altri siti

Quote

 Piuttosto, come e a quanti volt sono alimentati i sensori

Bravo giusta osservazione, allora i sensori possono essere alimentati sia esternamente da batteria 12volt che con alimentazione di arduino a 5volt, ma visto che i cavi sono lunghi almeno 5metri e il sensore sarà un m10 quelli npn pnp credo convenga alimentarli con la 12volt, che tipo di fotoaccoppiatore dovrei utilizzare? e senza trigger?

Il progetto è cambiato ora comprende 12 arduino ognuno con il suo display a segmenti da 4 cifre con comunicazione i2c.

Ci sono 5 sensori di velocità, poi sensori di temperatura e un tachimetro. 

Avrò un unica fonte di alimentazione la batteria di questo mezzo con eventuali disturbi dell alternatore ed attuatori..

Si devono accendere tutti i display e gli arduino con l accensione del quadro a bordo macchina.

Per filtrare il tutto posso costruirmi un filtro? posso utilizzare un convertitore step down 12volt 9 volt è gia protetto contro i disturbi? 

Conviene utilizzare un solo convertitore per alimentare tutti i 12 arduino?

Devo ordinare tutte le idee

 

Link al commento
Condividi su altri siti

12 minuti fa, roberto8303 scrisse:

posso utilizzare un convertitore step down 12volt 9 volt è gia protetto contro i disturbi? 

 

No meglio utilizzare un regolatore serie. Ci metti un LM7809 che ti da la tensione giusta in modo che il regolatore di arduino non scaldi.

All'uscita del 7809 metti un filtro pgreco con condensatore da 470µF + 0.1µF, in duttanza da 220µHy, condensatori 470µF + 0.1µF (i valori non sono critici). Questo dovrebbe abbattere molto i disturbi condotti sull'alimentazione.

Meglio mettere un filtro per ogni arduino il più vicino possibile ad arduino.

Link al commento
Condividi su altri siti

userò questo filtro su ogni arduino,

Per quanto riguarda i sensori proximity li alimento a 12vdc avrò la massa in comune con il gnd di arduino e il segnale di ritorno come lo adatto al pin 5 volt di arduino?

filtro_pigreco_01_large.png

Link al commento
Condividi su altri siti

2 ore fa, roberto8303 scrisse:

il sensore sarà un m10 quelli npn pnp credo convenga alimentarli con la 12volt, che tipo di fotoaccoppiatore dovrei utilizzare? e senza trigger?

 

Se alla fine tutto è alimentato dalla stessa batteria usare i fotoaccoppiatori è abbastanza inutile, a meno di non alimentare gli arduino con un convertitore cc/cc isolato. I trigger invece li lascerei, garantiscono un segnale più pulito. Ti conviene buttare giù un prototipo e vedere come reagisce sul campo, sopratutto per quanto riguarda i disturbi.

 

Ciao, Ale.

Link al commento
Condividi su altri siti

Quote

Se alla fine tutto è alimentato dalla stessa batteria usare i fotoaccoppiatori è abbastanza inutile

quindi basta una resistenza dopo il trigger per portare il valore di 12volt del sensore  a 5 volt in ingresso di arduino? giusto?

Link al commento
Condividi su altri siti

3 minuti fa, roberto8303 scrisse:

quindi basta una resistenza dopo il trigger per portare il valore di 12volt del sensore  a 5 volt in ingresso di arduino? giusto?

 

No.

Il 74HC14 lo devi alimentare a 5V.

Il segnale del sensore che avraà ampiezza di 12 V lo devi ridurre con un partitore di tensione, ad esempio 6800 + 4700 ohm, con la resistenza da 4700 colelgata a 0V ed quella da 6800 ohm collegata la sensore, il punto di unione dei 2 resistori va ad un ingresso del 74HC14

Link al commento
Condividi su altri siti

Se i sensori sono NPN open collector ti basta una resistenza sull'ingresso del trigger verso il positivo 5V, qualcosa tra i 2 e i 5k può andare bene.

 

Ciao, Ale.

 

Edit: Ops, ci siamo sovrapposti con Livio. Hai un datasheet dei sensori che intendi usare? Altrimenti le ipotesi si moltiplicano...

Link al commento
Condividi su altri siti

Certo i sensori che intendo utilizzare sono questi del tipo pnp

http://datasheet.octopart.com/BES011C-Balluff-datasheet-57225021.pdf

 

Il 74HC14 puo leggere 6 sensori giusto? quindi me ne occorre soltanto uno e le uscite filtrate dei vari sensori ognuna ad un arduino diverso?

il 74hc14 é possibile alimentarlo con i 5 volt di arduino nano? cioè alimentando arduino con i 9 volt dalla scheda posso prelevare i 5 volt per il trigger e acnhe per il display cioe esattamente questo?

https://www.adafruit.com/product/880

oppure conviene utilizzare anche un regolatore 7805 per questi altri dispositivi? scusate tutte queste domande ma piu informazioni metto e piu ci possiamo capire.

Link al commento
Condividi su altri siti

45 minuti fa, roberto8303 scrisse:

Certo i sensori che intendo utilizzare sono questi del tipo pnp

Allora procedi come indicato da Livio. Tieni conto nel software che all'uscita del 7414 hai il livello invertito, 0 (LOW) quando il sensore è impegnato.

 

48 minuti fa, roberto8303 scrisse:

Il 74HC14 puo leggere 6 sensori giusto? quindi me ne occorre soltanto uno e le uscite filtrate dei vari sensori ognuna ad un arduino diverso?

Si, in linea di massima se il negativo è in comune va bene. Se te ne rimane uno inusato collega l'ingresso a massa. Lo puoi alimentare con i 5V di un arduino, dovrebbe consumare pochissimo. Ricordati di mettere un condensatore da 0.1 uF di disaccoppiamento sull'alimentazione.

Dal link del display non sono riuscito a risalire ad un valore di assorbimento, in linea di massima se l'alimentazione esterna dell'arduino è 9V penso che lo puoi alimentare direttamente con i 5V dell'arduino, accertati dopo una decina di minuti di funzionamento che il regolatore sulla scheda non scaldi troppo.

 

Ciao, Ale.

Link al commento
Condividi su altri siti

@ilguargua

 

ATTENZIONE!!!

 

Ho simulato il codice e sono presenti degli errori di scrittura anche se lo compila senza problemi, inoltre ho notato che legge solo i primi 3 INPUT (9, 10, 11), gli altri sono sempre a 0...

 

Per poter leggere tutti gli ingressi ho dovuto modificare il codice così:

 

void t2isr(void)
{
  static byte prev_pb = 0;
  byte pb = (PINB & B00111110);
  pb >>= 1; // <---(pb >> 1;)(?)
  for(byte i=0;i<5;i++)
  {
    byte ndx = (digitalRead(9+i) << i); // <---(ndx << i;)(?)
    if((pb & ndx) && !(prev_pb & ndx)) rpms[i]++;
  }
  cnt++;
  prev_pb = pb;
}

 

P.S. Nonostante varie prove, questo è il solo metodo funzionante!!!

Link al commento
Condividi su altri siti

Grazie, immaginavo potessero esserci magagne non potendo provare in pratica

28 minuti fa, GiRock scrisse:

pb >>= 1; // <---(pb >> 1;)(?)

:thumb_yello:

29 minuti fa, GiRock scrisse:

ndx << i;)(?)

Questo non funge nemmeno mettendoci l'uguale come sopra? Ora purtroppo non ho tempo per fare delle prove (talvolta i miei datori di lavoro hanno l'assurda pretesa che io lavori!) , cosa usi per la simulazione?

32 minuti fa, GiRock scrisse:

inoltre ho notato che legge solo i primi 3 INPUT (9, 10, 11), gli altri sono sempre a 0...

Strano... mi piacerebbe capire perchè... gli ultimi 2 bit della porta B (6 e 7) sono collegati al quarzo quindi non ha molto senso leggerli, ma il il 4 e il 5 sono normali in/out (se non si usa SPI).

 

A quanto pare Roberto ha deciso per una soluzione diversa, comunque hai fatto benissimo da intervenire e farmi notare gli errori.

 

Ciao, Ale.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

×
×
  • Crea nuovo/a...