- Messaggi: 45
- Ringraziamenti ricevuti 0
Mondo reale
- Guido72
- Autore della discussione
- Anziano Utente
Less
Di più
9 Anni 1 Settimana fa #1
da Guido72
Mondo reale è stato creato da Guido72
Salve a tutti,
da poco nel mondo della programmazione dei pic (MBLAB XC8)mi ritrovo a scrivere , per ora sulla carta , un programmino per il quale avrei bisogno di un "aiutino".
In breve.
Ho due segnali analogici convertiti in digitale che definisco A e B.
A è fortemente variabile mentre B lo è molto meno.
Devo eseguire delle operazioni di comparazione tra A e B percui se A==B non succede niente , se A>B dovrò eseguire una operazione matematica A-B e se A<B dovrò eseguire B-A .
In entrambi i casi dovrò generare un treno di impulsi pwm proporzionale al valore risultante dalla sottrazione.
Qui casca l'asino :blush:
Come faccio a tradurre un valore "astratto" in un numero reale di impulsi ?
Se , ad esempio, il treno di impulsi serve a far girare un motore stepper per posizionarlo dovrò necessariamente sapere quanti pulses o step inviare al drive del motore.....
Qualche consiglio ?
Grazie
Guido
da poco nel mondo della programmazione dei pic (MBLAB XC8)mi ritrovo a scrivere , per ora sulla carta , un programmino per il quale avrei bisogno di un "aiutino".
In breve.
Ho due segnali analogici convertiti in digitale che definisco A e B.
A è fortemente variabile mentre B lo è molto meno.
Devo eseguire delle operazioni di comparazione tra A e B percui se A==B non succede niente , se A>B dovrò eseguire una operazione matematica A-B e se A<B dovrò eseguire B-A .
In entrambi i casi dovrò generare un treno di impulsi pwm proporzionale al valore risultante dalla sottrazione.
Qui casca l'asino :blush:
Come faccio a tradurre un valore "astratto" in un numero reale di impulsi ?
Se , ad esempio, il treno di impulsi serve a far girare un motore stepper per posizionarlo dovrò necessariamente sapere quanti pulses o step inviare al drive del motore.....
Qualche consiglio ?
Grazie
Guido
Si prega Accesso o Crea un account a partecipare alla conversazione.
9 Anni 6 Giorni fa #2
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Mondo reale
Avendo capito il problema per vie traverse, avvero controllare un motore stepper in funzione del valore della tensione assunta da due canali, quello che devi fare per seplificarti la vita è prendere un driver per motori stepper esterno.
In questo link ne trovi vari modelli in base alla corrente e modalità di controllo.
Quella più semplice è certamente ENable, Direction, Step.
In questo modo il driver controlla la corrente dello stepper e il microcontrollore non deve far altro che leggere le due tensioni e inviare un certo numero di Step al motor controller, dopo aver preventivamente selezionata la direzione di rotazione.
Ti consiglio prima di realizzare un setup in cui fai delle letture di una tensione.
Poi prendi un motore stepper e relativo controller e fallo girare con i segnale E, DIR, STP.
...poi unisci i due programmi.
Saluti,
Mauro
In questo link ne trovi vari modelli in base alla corrente e modalità di controllo.
Quella più semplice è certamente ENable, Direction, Step.
In questo modo il driver controlla la corrente dello stepper e il microcontrollore non deve far altro che leggere le due tensioni e inviare un certo numero di Step al motor controller, dopo aver preventivamente selezionata la direzione di rotazione.
Ti consiglio prima di realizzare un setup in cui fai delle letture di una tensione.
Poi prendi un motore stepper e relativo controller e fallo girare con i segnale E, DIR, STP.
...poi unisci i due programmi.
Saluti,
Mauro
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Guido72
- Autore della discussione
- Anziano Utente
Less
Di più
- Messaggi: 45
- Ringraziamenti ricevuti 0
9 Anni 6 Giorni fa #3
da Guido72
Risposta da Guido72 al topic Mondo reale
Salve Mauro,
grazie per le info.
Essendo veramente nuovo nel mondo pic e relativa programmazione i dubbi sono numerosi.
Credo , di aver individuato il modo in cui muovermi.
In pratica, la risultante delle mie operazioni maatematiche è un valore espresso in bits.
Dalla conversione ADC e relativa risoluzione sò a quanto equivale un bit in termini di tensione.
Conosco quale è il rapporto steps/spostamento lineare prodotto dal motore (stepgiro , passo vite ecc...) percui
scrivo una funzione che rapporti i bit con il numero di step necessari da inviare al drive....
Leggendo il libro XC8 step by step , mi pare di aver compreso che il valore della conversione ADC è memorizzato nei registri ADRESH e ADRESL. Se prelevo il valore in ADRESH e ignoro ADRESL, ottengo una valore come se la conversione fosse a 8 bit e non a 10.
Ora, la domanda chiarificatrice è la seguente.
Se prelevo il valore SOLO in ADRESH ed ho impostato il valore Vref pari a Vdd=5V , otterrò un valore proporzionale a
Vdd/255 ossia, per un segnale analogico in ingresso di 5V avrò 255 , per 2.5V avrò 127 .....e così via ?
Inoltre , perchè le cose vadano come sopra, in fase di impostazione del registro ADC , bisogna giustificare a destra o sinistra ?
Grazie
Guido
grazie per le info.
Essendo veramente nuovo nel mondo pic e relativa programmazione i dubbi sono numerosi.
Credo , di aver individuato il modo in cui muovermi.
In pratica, la risultante delle mie operazioni maatematiche è un valore espresso in bits.
Dalla conversione ADC e relativa risoluzione sò a quanto equivale un bit in termini di tensione.
Conosco quale è il rapporto steps/spostamento lineare prodotto dal motore (stepgiro , passo vite ecc...) percui
scrivo una funzione che rapporti i bit con il numero di step necessari da inviare al drive....
Leggendo il libro XC8 step by step , mi pare di aver compreso che il valore della conversione ADC è memorizzato nei registri ADRESH e ADRESL. Se prelevo il valore in ADRESH e ignoro ADRESL, ottengo una valore come se la conversione fosse a 8 bit e non a 10.
Ora, la domanda chiarificatrice è la seguente.
Se prelevo il valore SOLO in ADRESH ed ho impostato il valore Vref pari a Vdd=5V , otterrò un valore proporzionale a
Vdd/255 ossia, per un segnale analogico in ingresso di 5V avrò 255 , per 2.5V avrò 127 .....e così via ?
Inoltre , perchè le cose vadano come sopra, in fase di impostazione del registro ADC , bisogna giustificare a destra o sinistra ?
Grazie
Guido
Si prega Accesso o Crea un account a partecipare alla conversazione.
9 Anni 6 Giorni fa #4
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Mondo reale
Per i ragionamenti logici credo che sia corretto, ma per semplificarti la vita pensa al numero "digitale" come ad un numero semplice 9, 33.... La rappresentazione binaria con 0 e 1 non cambia nessun ragionamento.
a seconda che tu prenda 8 o 10 bit devi dividere 5V per 255 o 1023.
Per prendere 8 bit devi ignorare i due bit meno significativi, quindi selezioni la giustificazione a sinistra e prelevi solo ADRESH.
Prova a fare un esempio sulla carta. 10 bit e due registri da 8 bit.
In base a come giustifichi i due bit più significativi e meno significativi hanno posizioni diversi.
Quella a sinistra è usata per la conversione ad 8 bit, mentre quella a destra per quella a 10 (ma devi unire i due registri ad 8 bit in una variabile intera, come mostrato negli esempi del testo.
Saluti,
Mauro
a seconda che tu prenda 8 o 10 bit devi dividere 5V per 255 o 1023.
Per prendere 8 bit devi ignorare i due bit meno significativi, quindi selezioni la giustificazione a sinistra e prelevi solo ADRESH.
Prova a fare un esempio sulla carta. 10 bit e due registri da 8 bit.
In base a come giustifichi i due bit più significativi e meno significativi hanno posizioni diversi.
Quella a sinistra è usata per la conversione ad 8 bit, mentre quella a destra per quella a 10 (ma devi unire i due registri ad 8 bit in una variabile intera, come mostrato negli esempi del testo.
Saluti,
Mauro
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Guido72
- Autore della discussione
- Anziano Utente
Less
Di più
- Messaggi: 45
- Ringraziamenti ricevuti 0
9 Anni 3 Giorni fa - 9 Anni 3 Giorni fa #5
da Guido72
Risposta da Guido72 al topic Mondo reale
Ok, grazie.
Sto sperimentando con la Freedom II e credo di aver compreso che più letture consecutive del registro ADRESH e ADRESL con prelevamenti dopo ogni conversione possono essere eseguite ma non ho ancora capito se vi è una sovrascrittura della precedente lettura o c'è spazio per tutte.
Per fare il test ho usato il trimmer della scheda come ingresso analogico.
Ho eseguito x campionamenti distanziati l'uno dall'altro di 20ms.
Ho poi eseguito qualche operazione matematica semplice per verificare se effettivamente il registro catturava tutte le x conversioni. Di fatto cattura
Ma poichè il campionamento avveniva per valori uguali del segnale analogico (1 solo trimmer e campionamenti molto ravvicinati)non sò se il registro memorizza le x letture o semplicemente sovrascriveva il valore precedente.
Può funzionare una porzione di programma di questo tipo? :
Saluti
Guido
Sto sperimentando con la Freedom II e credo di aver compreso che più letture consecutive del registro ADRESH e ADRESL con prelevamenti dopo ogni conversione possono essere eseguite ma non ho ancora capito se vi è una sovrascrittura della precedente lettura o c'è spazio per tutte.
Per fare il test ho usato il trimmer della scheda come ingresso analogico.
Ho eseguito x campionamenti distanziati l'uno dall'altro di 20ms.
Ho poi eseguito qualche operazione matematica semplice per verificare se effettivamente il registro catturava tutte le x conversioni. Di fatto cattura
Ma poichè il campionamento avveniva per valori uguali del segnale analogico (1 solo trimmer e campionamenti molto ravvicinati)non sò se il registro memorizza le x letture o semplicemente sovrascriveva il valore precedente.
Può funzionare una porzione di programma di questo tipo? :
Code:
//*********************************************************************************
ADCON0bits.GO = 1; //Avvio la conversione
while(ADCON0bits.GO); //Attendo fine conversione
lettura1 = (((unsigned int) ADRESH) <<8) | ADRESL; //Prelevo il valore della prima conversione
__delay_ms (10); //Imposto ritardo tra le conversioni
ADCON0bits.GO = 1; //Avvio la conversione
while(ADCON0bits.GO); //Attendo fine conversione
lettura2 = (((unsigned int) ADRESH) << 8) | ADRESL; //Prelevo il valore della seconda conversione
__delay_ms (10); //Imposto ritardo tra le conversioni
ADCON0bits.GO = 1; //Avvio la conversione
while(ADCON0bits.GO); //Attendo fine conversione
lettura3 = (((unsigned int) ADRESH) << 8) | ADRESL; //Prelevo il valore della terza conversione
__delay_ms (10); //Imposto ritardo tra le conversioni
ADCON0bits.GO = 1; //Avvio la conversione
while(ADCON0bits.GO); //Attendo fine conversione
.......e così via...
Saluti
Guido
Ultima Modifica 9 Anni 3 Giorni fa da Mauro Laurenti.
Si prega Accesso o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, StefA
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Forum - Ultimi messaggi
-
- Freedom III e compilazioni fallite
- da Mauro Laurenti
-
- MODULO GSM SIM900A
- da FABRIZIO
-
- LTerminal - nuove funzioni
- da Mauro Laurenti
-
- Aggiornamento sito completato
- da Mauro Laurenti
-
- registro a scorrimento PIPO in cascata
- da Mauro Laurenti