Torna indietro   BaroneRosso.it - Forum Modellismo > Elettronica > Circuiti Elettronici


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 10 ottobre 11, 13:02   #1 (permalink)  Top
User
 
L'avatar di elicottero78
 
Data registr.: 14-05-2005
Residenza: bergamo
Messaggi: 1.278
quale calcolo o proporzione x questo adc-pic?

ciao,ancora una domanda x capire meglio la programmazione dei pic.....vi ricordo che sto tra mikroc e picgenius...quest ultimo mi sta semplificando la vita parecchio..essendo iin italiano poi....è una figata...ha i suoi limiti ma mi aiuta molto....

allora,sto usando un pic 16f676 con adc......e in base al valore del adc.....dato con il movimento di un trimmer.....muovo un servo

il mio problema è che ho gia tanti trimmer che però non mi portano adc da valore 0 a 1023......ma minimo partono da 320 a 1023

voglio mantenere questo problema xchè verrebbe fuori utile come programma base x i miei futuri progetti con altri tipi di sensori...e altre modalita

scrivo il programma in versione umana

ho iniziato cosi....pic collegato al lcd 16x2 e trimmer

accendo....valore=read_adc(0)

porto il trimmer al massimo...clicco il tasto n2
e salvo il valore adc come ADCMAX

porto il trimmer al minimo clicco il tasto n1
e salvo il valore adc come ADCMIN

ok ora so che
ADCMAX=1023

ora so che
ADCMIN=320
con altri trim avrei potuto avere altri valorei diversi

ora voglio che ADCMAX valga 210 inpulsi
e ADCMIN valga 90 inpulsi

gli inpulsi mi servono x il ciclo for tipo

OUTPUT1=1
for ciclo=0 to inpulsi
delay_precision_us(10)
endfor
OUTPUT1=0
delay_ms(20)

la mia domanda è...che proporzione o calcolo devo fare x far si che tra max e min
l adc e inpulsi si trovino in coincidenza?

io voglio che al trimer al minimo il servo è tutto a sinistra ma man mano che giro il trimmer verso il massimo ...il servo si deve muovere verso detra

spero di essere stato chiaro,grazie in anticipo e scusate le mie domande da ignorante

Ultima modifica di elicottero78 : 10 ottobre 11 alle ore 13:06
elicottero78 non è collegato   Rispondi citando
Vecchio 10 ottobre 11, 15:11   #2 (permalink)  Top
Adv Moderator
 
L'avatar di romoloman
 
Data registr.: 15-08-2007
Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.069
Citazione:
Originalmente inviato da elicottero78 Visualizza messaggio
ciao,ancora una domanda x capire meglio la programmazione dei pic.....vi ricordo che sto tra mikroc e picgenius...quest ultimo mi sta semplificando la vita parecchio..essendo iin italiano poi....è una figata...ha i suoi limiti ma mi aiuta molto....

allora,sto usando un pic 16f676 con adc......e in base al valore del adc.....dato con il movimento di un trimmer.....muovo un servo

il mio problema è che ho gia tanti trimmer che però non mi portano adc da valore 0 a 1023......ma minimo partono da 320 a 1023

voglio mantenere questo problema xchè verrebbe fuori utile come programma base x i miei futuri progetti con altri tipi di sensori...e altre modalita

scrivo il programma in versione umana

ho iniziato cosi....pic collegato al lcd 16x2 e trimmer

accendo....valore=read_adc(0)

porto il trimmer al massimo...clicco il tasto n2
e salvo il valore adc come ADCMAX

porto il trimmer al minimo clicco il tasto n1
e salvo il valore adc come ADCMIN

ok ora so che
ADCMAX=1023

ora so che
ADCMIN=320
con altri trim avrei potuto avere altri valorei diversi

ora voglio che ADCMAX valga 210 inpulsi
e ADCMIN valga 90 inpulsi

gli inpulsi mi servono x il ciclo for tipo

OUTPUT1=1
for ciclo=0 to inpulsi
delay_precision_us(10)
endfor
OUTPUT1=0
delay_ms(20)

la mia domanda è...che proporzione o calcolo devo fare x far si che tra max e min
l adc e inpulsi si trovino in coincidenza?

io voglio che al trimer al minimo il servo è tutto a sinistra ma man mano che giro il trimmer verso il massimo ...il servo si deve muovere verso detra

spero di essere stato chiaro,grazie in anticipo e scusate le mie domande da ignorante
mi spieghi solamente perchè utilizzi:

for ciclo=0 to inpulsi
delay_precision_us(10)
endfor


Il ciclo for si becca a 4Mhz di clock 2us (1 per l'incremento della variabile e 1 per il test) solo lui... lo esegui 90 volte hai 180us che se ne vanno...
Verifica con un'oscilloscopio...

premesso che non conosco picgenius e i limiti delle sue funzioni, meglio un
delay_precision_us(10*impulsi);

per quello che riguarda l'impulso:
la variazione fra min e max del segnale di un servo stando a specifiche è 1000 (minimo 1000 max 2000)

adcrange=adcmax-adcmin
impulsi=int((adcrange/(adcval-adcmin))*100+100)
uscita=1
delay_precision_us(10*impulsi);
uscita=0

considerando il range 900-2100

adcrange=adcmax-adcmin
impulsi=int((adcrange/(adcval-adcmin))*120+90)
uscita=1
delay_precision_us(10*impulsi);
uscita=0
__________________
Vivere in qeusto mondo e molto belo belo e vale la pena starci ma a volte in questa UNICA vita che ci apartiene posono succedere cose brute brute alora mi chiedo perche siete incazziati domani pole esere anche lultimo
Grazie "TRANQUILLO"
FAI 15766
romoloman non è collegato   Rispondi citando
Vecchio 10 ottobre 11, 21:27   #3 (permalink)  Top
User
 
L'avatar di ElNonino
 
Data registr.: 06-05-2007
Residenza: Tre Ville (Preore)
Messaggi: 3.605
Invia un messaggio via MSN a ElNonino
Alcuni consigli hw e sw:

- Il potenziometro deve avere un valore massimo di 2k2.
- Fra il cursore del potenziometro ed il pin del A/D metti una resistenza del valore compreso fra 330 e 680 ohm.
- Fra il pin del A/D e massa, molto vicino al pin del micro metti un condensatore ceramico da 100nF.

Poichè hai un tempo di refresh del PWM di 10..20ms puoi effettuare una media mobile su 8...64 campionamenti del A/D, poi accumulare per 16..32 volte tale media ed alla fine con uno shift a dx di 4 o 5 ottieni il valore della tensione del potenziometro bello stabile e pulito.

Se vuoi posso pubblicare 4 righe di codice.

Se hai il valore minimo di 300 circa occhio alla lunghezza che collega il terminale negativo del potenziometro a massa ed al punto di collegamento.

__________________
Peace & Love
Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein)
ElNonino non è collegato   Rispondi citando
Vecchio 10 ottobre 11, 21:55   #4 (permalink)  Top
User
 
L'avatar di elicottero78
 
Data registr.: 14-05-2005
Residenza: bergamo
Messaggi: 1.278
Citazione:
Originalmente inviato da romoloman Visualizza messaggio
mi spieghi solamente perchè utilizzi:

for ciclo=0 to inpulsi
delay_precision_us(10)
endfor


Il ciclo for si becca a 4Mhz di clock 2us (1 per l'incremento della variabile e 1 per il test) solo lui... lo esegui 90 volte hai 180us che se ne vanno...
Verifica con un'oscilloscopio...

premesso che non conosco picgenius e i limiti delle sue funzioni, meglio un
delay_precision_us(10*impulsi);

per quello che riguarda l'impulso:
la variazione fra min e max del segnale di un servo stando a specifiche è 1000 (minimo 1000 max 2000)

adcrange=adcmax-adcmin
impulsi=int((adcrange/(adcval-adcmin))*100+100)
uscita=1
delay_precision_us(10*impulsi);
uscita=0

considerando il range 900-2100

adcrange=adcmax-adcmin
impulsi=int((adcrange/(adcval-adcmin))*120+90)
uscita=1
delay_precision_us(10*impulsi);
uscita=0
ancora grazie,ora ci provo
elicottero78 non è collegato   Rispondi citando
Vecchio 10 ottobre 11, 21:59   #5 (permalink)  Top
User
 
L'avatar di elicottero78
 
Data registr.: 14-05-2005
Residenza: bergamo
Messaggi: 1.278
Citazione:
Originalmente inviato da ElNonino Visualizza messaggio
Alcuni consigli hw e sw:

- Il potenziometro deve avere un valore massimo di 2k2.
- Fra il cursore del potenziometro ed il pin del A/D metti una resistenza del valore compreso fra 330 e 680 ohm.
- Fra il pin del A/D e massa, molto vicino al pin del micro metti un condensatore ceramico da 100nF.

Poichè hai un tempo di refresh del PWM di 10..20ms puoi effettuare una media mobile su 8...64 campionamenti del A/D, poi accumulare per 16..32 volte tale media ed alla fine con uno shift a dx di 4 o 5 ottieni il valore della tensione del potenziometro bello stabile e pulito.

Se vuoi posso pubblicare 4 righe di codice.

Se hai il valore minimo di 300 circa occhio alla lunghezza che collega il terminale negativo del potenziometro a massa ed al punto di collegamento.

mamma mia,troppo tecnico,se mi posti 4 righe mi faresti un piacere...

cosa intendi con.... occhio alla lunghezza tra terminale a massa e punto di collegamento?
grazie mille
elicottero78 non è collegato   Rispondi citando
Vecchio 11 ottobre 11, 12:11   #6 (permalink)  Top
Adv Moderator
 
L'avatar di romoloman
 
Data registr.: 15-08-2007
Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.069
Citazione:
Originalmente inviato da elicottero78 Visualizza messaggio
ancora grazie,ora ci provo

Giusto per farti una cultura:
Chapter 9: Instruction Set - Book: PIC Microcontrollers
qui puoi trovare i tempi di esecuzione delle singole istruzioni.
tieni presente che ammesso che picgenius ottimizzi il codice un ciclo for è così costituito:
assegnazione del valore iniziale alla variabile usata per il loop 1usec
esecuzione del loop (variabile dipende dal codice che ci metti)
incremento della variabile (1us)
test con skip della prossima istruzione (1us)
jump ad inizio loop (2us)

quindi ogni ciclo di un loop vuoto scritto in assembly prende almeno 4us (non 2 come ti avevo detto, visto che mi ero dimenticato il jump) +1 per l'inizializzazione iniziale
anche il più stupido loop

for i=0 to 0
end for

prende 1us (assegnazione) + 1us (incremento) + 2us (test con skip della prossima istruzione visto che il PC viene modificato dato che il loop termina subito)

Se si vuole estrema precisione nei loop questi tempi vanno tenuti in considerazione.
Se ben implementata la delay_precision_us è molto più precisa di quanto tu non possa fare con un loop.
Altrimenti per generare impulsi precisi vanno usati gli interrupt e timer interni, ma non so se con picgenius si possa fare.
__________________
Vivere in qeusto mondo e molto belo belo e vale la pena starci ma a volte in questa UNICA vita che ci apartiene posono succedere cose brute brute alora mi chiedo perche siete incazziati domani pole esere anche lultimo
Grazie "TRANQUILLO"
FAI 15766
romoloman non è collegato   Rispondi citando
Vecchio 11 ottobre 11, 12:35   #7 (permalink)  Top
User
 
L'avatar di ElNonino
 
Data registr.: 06-05-2007
Residenza: Tre Ville (Preore)
Messaggi: 3.605
Invia un messaggio via MSN a ElNonino
Thumbs up

Prima l' hw: i fili che provengono dal potenziometro è bene che siano saldati sul c.s. il più vicino possibile ai piedini del PIC, quindi prossimi al pin del GND, Vcc, ed ingresso A/D; ciò per evitare di captare disturbi da (anelli di massa) ground-loop.

ed ecco un campione di codice che ho cercato di commentare al meglio, se non ti è chiaro chiedi:


Codice:

byte Tic    = 0,  // Contatore ciclo
     PunMMA = 0;  // Contatore puntatore tabella media mobile			


word ADrdAcc     = 0, // Buffer ultima lettura A/D converter
     Acc1A       = 0, // Valore media mobile
     Acc2A       = 0, // Accumulatore misura mediata
     VAlAcc      = 0, // Valore filtrato Acceleratore
     TabMMA[8] = {0}; // Tabella per media mobile



void MisAcc()
{
  ADCON0 = 0b00000001;        // Seleziona il canale Acceleratore
  Delay10TCYx(5);             // Ritardo per consentire la commutazione 
			      // ingresso A/D converter e stabilizzazione
  ADCON0bits.GO  = 1;         // Avvia la conversione A/D
  while(ADCON0bits.GO){}      // Attende la fine della conversione A/D
  ADrdAcc = ReadADC();        // Salva nel buffer il valore campionato
  PunMMA = (++PunMMA & 7);    // Incrementa il puntatore della tabella
		              // ciclandolo fra 0 -> 7, per altri valori
		              // sostituire con: ++PunMMA .... if(PunMMA == xx) PunMMA = 0;  
  Acc1A = Acc1A - TabMMA[PunMMA] + ADrdAcc; // Calcola la media mobile fra 8 (o xx) campionamenti
  TabMMA[PunMMA] = ADrdAcc;   // Aggiorna la media mobile con l'ultimo valore campionato
  Acc2A = Acc2A + Acc1A;      // Aggiorna il valore dell'accumulatore con l'ultima media
  ++Tic;                      // Incrementa il contatore ciclo
  if(Tic == 16)               // Media fra 16 valori filtrati
  {
    ValAcc = Acc2A / 16;      // Calcola il valore filtrato   Acceleratore (anche ValAcc = Acc2A >>4)
    Tic   = 0;                // Azzera il contatore ciclo
    Acc2A = 0;                // Azzera accumulatore 							 
  }
}
Ho letto ora 'Romoloman', condivido al 100% il consiglio ad usare un timer per le temporizzazioni precise del PWM in uscita.

__________________
Peace & Love
Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein)
ElNonino non è collegato   Rispondi citando
Rispondi

Bookmarks




Regole di scrittura
Non puoi creare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è Attivato
Le faccine sono Attivato
Il codice [IMG] è Attivato
Il codice HTML è Disattivato
Trackbacks è Disattivato
Pingbacks è Disattivato
Refbacks è Disattivato


Discussioni simili
Discussione Autore discussione Forum Commenti Ultimo Commento
Giusta proporzione pignone/corona Zephyr Automodellismo Mot. Elettrico Off-Road 2 16 marzo 11 16:20
aiuto utilizzo ADC x pic16f883 Milus Circuiti Elettronici 6 01 luglio 09 08:55
Quale Modello questo è il dilemma... Butterfly Aeromodellismo Principianti 48 13 ottobre 08 19:23
Proporzione da disegno kitaro Aeromodellismo Progettazione e Costruzione 16 10 gennaio 08 21:32
Pic, mio caro Pic.... fai4602 Circuiti Elettronici 7 24 novembre 03 19:34



Tutti gli orari sono GMT +2. Adesso sono le 04:36.


Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002