Ho voluto provare un servomotore di quelli senza fine, che non hanno un feedback da un potenziometro.
Questi motori hanno un potenziometro solo per una calibrazione fatta a mano. Detto questo, il mio motore, su impulsi distanti fino a 20ms (nel programma sono 10 ms, circa 100Hz) riceve appunto impulsi, il duty cycle del segnale, di valori da 1.3ms a 1.7ms, dove su 1.5ms il motore è fermo e negli altri due gira nelle due direzioni.
Il programma genera correttamente i miei impulsi ogni 10ms ma sul mio oscilloscopio c'è qualcosa che non torna per il duty cycle: sono impulsi generati correttamente distanziati di 0.2ms per incremento ma tutti sono più lunghi di 0.1ms. Quindi ho 1.4ms, 1.6ms e 1.8ms
Volevo chiedervi se c'è qualcosa che non torna nel codice che posto qui sotto. Tenendo conto del troncamento, avrei un errore dell'1% del valore. Ma evidentemente mi sbaglio. Credo sia lì l'inghippo, perché i 100Hz sembrano essere corretti. E grazie a tutti anticipatamente!
Le funzioni usate:
- Codice: Seleziona tutto
void timer0_init(void)
{
/* include anche i suoi interrupt*/
/* off
* 16bit
* fosc/4
* 256 prescaler
*
*
*
*/
T0CON = 0b00000111;
/* abilita interrupts e il timer int, bit 2 IF timer 0*/
INTCON = 0b11100000;
}
void InitApp() {
/* interrupt enable di tutto il resto, PIE*/
/* interrupt priority per ogni periferica IPR*/
/*The RCON register contains bits used to determine the
cause of the last Reset or wake-up from Idle or Sleep
mode. RCON also contains the bit that enables
interrupt priorities (IPEN).*/
RCONbits.IPEN = 1;
TRISDbits.TRISD4 = 1; //
TRISDbits.TRISD5 = 1; // pulsanti
RPINR1 = 22; // RD5 - usa HW esterno e polling in INT per usare piu pulsanti
RPINR2 = 21; // RD4
INTCON2bits.INTEDG1 = 0;
INTCON3bits.INT1P = 1; // prior
INTCON3bits.INT1E = 1; // attiva
INTCON3bits.INT1IF = 0; // no int all'inizio
INTCON2bits.INTEDG2 = 0;
INTCON3bits.INT2P = 1; // prior
INTCON3bits.INT2E = 1; // attiva
INTCON3bits.INT2IF = 0; // no int all'inizio
TRISDbits.TRISD7 = 0;
PORTDbits.RD7 = 0;
TRISDbits.TRISD6 = 0;
PORTDbits.RD6 = 0;
}
void freq_t0(long f, long presc){ // LA FUNZIONE INDAGATA!
int timer = (int) (65536 - (FCY)/(f*presc));
TMR0H = timer >> 8;
TMR0L = timer;
}
dove FCY è 12000000
e il main, seguito dalla gestione di interrupt:
- Codice: Seleziona tutto
int duty = 0;
int count =-1;
volatile bool periodo_lungo = 1;
int i = 0;
void main(void)
{
ConfigureOscillator();
InitApp();
usart_init();
timer0_init();
freq_t0(1, 256);
/*min duty = 769
* middle duty = 667 Hz
* max duty = 588
*/
T0CONbits.TMR0ON = 1;
while(1)
{
}
}
- Codice: Seleziona tutto
if(INTCONbits.TMR0IF == 1)
{
/* resetta timer 3 e imposta valore per avere 1.5 ms (variabili), alterna il
flag e quindi controllandone il valore imposta per avere 20ms (fissi).
* Pilota un'uscita o usa il CCP pin.
*/
// resetta il timer automaticamente
T0CONbits.TMR0ON = 0;
// freq_t0(1, 256);
// duty++;
// if (duty >= 8) duty=0;
// T0CONbits.TMR0ON = 1;
if (periodo_lungo == 1){ // impulso breve
freq_t0((long)duty, 256);
periodo_lungo = 0;
PORTDbits.RD6 = 1;
}
else if (periodo_lungo == 0) { // impulso lungo
freq_t0(100, 256);
periodo_lungo = 1;
PORTDbits.RD6 = 0;
}
T0CONbits.TMR0ON = 1;
INTCONbits.TMR0IF = 0;
/* Clear Interrupt Flag 1 */
}
else if(INTCON3bits.INT1IF)
{
__delay_ms(15);
count ++;
if (count <= 0){
duty = 580;
}
else if (count == 1)
{
duty = 666;
}
else if (count ==2){
duty = 770;
count= -1;
}
INTCON3bits.INT1IF = 0;
} // ISR
else if(INTCON3bits.INT2IF)
{
__delay_ms(15);
PORTDbits.RD7 = ~PORTDbits.RD7; // accendo e spengo solo un led, non c'entra con il resto
INTCON3bits.INT2IF = 0;
} // ISR

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)



