Citazione:
Originalmente inviato da elicottero78 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