il circuito è composto da 3 parti: alimentazione, controllo e una di potenza.
la prima e la terza sono state ottimate, il problema rimane sulla scheda di controllo, cotituita da un PIC16F690.
Come saprete il motore per girare deve ricevere un vettore di 4 bit che regola l eccitazione delle bobine in modo tale da ruotare in modo ben preciso. Io ho improvvisato un ADC che mi legge il valore di un potenziometro e mi assegna tale valore alla variabile che regola la velocità del motore.
Ho poi inserito 2 pulsanti che mi permettono uno di fare marcia-arresto e uno l inversione di marcia.
purtroppo mi trovo ad affrontare alcuni problemi che non riesco a risolvere, ovvero:
- CONFIGURAZIONE PULSANTI
- la risposta alla pressione non è interpretata correttamente il 100% delle volte
- mancanza di antirimbalzo
- errato codice di interpretazione del pulsante
CONVERTITORE A/D - quando il potenziometro è ruotato completamente la conversione del DAC sballa
- possibile configurazione errata dei registri
Ecco il codice in MikroC:
- Codice: Seleziona tutto
void main(void) {
int clockwise[]={5,9,10,6}; //numero porta output in decimale MOTORE AVANTI
int counter_clockwise[]={6,10,9,5}; //numero porta output in decimale MOTORE INDIETRO
int velocity = 100; //velocita' di stepping
int switchedOn=0; //decide quando accendere spegnere il dispositivo
int spin_clockwise=1;
int i;
char resV = 0;
/*Init PORTx*/
TRISA = 0b00000100; // Input for RA2
TRISC = 0b01100000; //RC5, sono input, le altre output
/* Init ADC */
ANSELH = 0; // Set PORT AN8 to AN11 as Digital O
ADCON0=0b10001001; // select right justify result. ADC port channel 2 ETC P115
ADCON1=0b00010000; // Select the FRC for 8 MHz
PORTC = 0x00; //azzero la PORTC
while (1) {
if (switchedOn==0) //questa parte è la routine che mi ferma
while (PORTC&0x32) switchedOn=1; //e mi fa partire il motore, controllando
} //lo stato di RC5 che determina la marcia
else { //o l' arresto.
while (PORTC&0x32) {switchedOn=0; PORTC = 0x00;}
}
if (switchedOn==1) { //qua invece controllo lo stato di rotazione
if (spin_clockwise==1) //del motore, invertendo la variabile spin_clockwise
while (PORTC&0x64) spin_clockwise=0; //tra 0(pulsante non premuto) o 1(il pulsante è stato premuto)
else
while (PORTC&0x64) spin_clockwise=1;
}
/*ADC CONVERSION START*/
resV=ADC_Read(2) >> 6; //scrivi in resV solo i 4 BIT PIù SIGNIFICATIVI
velocity = resV*20;
/*ADC CONVERSION STOP*/
if(switchedOn==1) //questa parte è quella che da l' uscita
for(i=0; i<=3; i++) { //per l azionamento del motore, controllando lo stato
if (spin_clockwise) //delle variabili switchedOn(marcia o arresto)
PORTC = clockwise[i]; //e spin_clockwise(avanti o indietro)
else
PORTC = counter_clockwise[i];
if (velocity==0) velocity=1;
Vdelay_ms(velocity); //Vdelay_ms(velocity) è il ritardo che mi regola così la
} //velocità di eseguzione del for quindi la velocità
} //del motorino
}
questo invece è lo schema elettrico che rappresenta i collegamenti dei pulsanti e del potenziometro:
COME POSSO QUINDI RISOLVERE I PROBLEMI DI MALFUNZIONAMENTO DEI PULSANTI??? AVETE QUALCHE CONSIGLIO SULLA GESTIONE DELLE FUNZIONI NEL CODICE?
è una delle prime esperienze con i micro e spesso mi perdo in un bichier' d'acqua! scusate le possibili eresie nel codice! GRAZI PER L' AIUTO!

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)









