spacer.png, 0 kB

Torna indietro   Roboitalia.com - Il primo portale in Italia sulla robotica amatoriale > Robotica di base > Meccanica e materiali

Rispondi
 
Strumenti discussione Modalità  visualizzazioe
  #1  
Vecchio 11-07-2008, 00.09.47
BQuadra BQuadra non è collegato
Robottaro gold
 
Data registrazione: 10-07-2008
Residenza: nel mio mondo
Messaggi: 123
Potenza reputazione: 49
BQuadra E' per ora ancora un mistero
Predefinito idea codice controllo multi pwm

è solo una idea:

Codice:
#define false 0
#define true 1

/* Queste semplici linee di codice vogliono utilizzare il timer
 * del pic 16f84a per generare un pwm software, e dato la mia necessità
 * di pilotare due motori in pwm ho pensato di utilizzare questo modo.
 * Suppongo di avere un quarzo a 20Mhz.
 *
 * FUNZIONAMENTO PWM
 *
 *___________           "___________           "
 *           |          "           |          "
 *           |          "           |          "
 *           |          "           |          "
 *           |          "           |          "
 *           |          "           |          "
 *           |__________"           |__________"
 ***********************"**********************"
 *<---- P -------------> <---- P ------------->
 *<---- D --><--- D ---> <---- D --><--- D --->
 *
 * P = Periodo
 * D = Duty Cicle ( 50% )
 */

int periodo = 0 // ? qui quanto metto come periodo ?

/* ? per il timer devo scegliere una scala adeguata ? */
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

/* variabile boolean che contiene se voglio abilitare il pwm per il motore */
int bl_pwm_M1 = false;
int bl_pwm_M2 = false;

/* variabili che contengono la durata del duty cicle per il relativo motore */
int cicle_M1 = 0;
int cicle_M2 = 0;

/* contatori che decrementiamo */
int tmp_periodo = 0;
int tmp_cicle_M1 = 0;
int tmp_cicle_M2 = 0;

void main()
{
   set_motor_speed(1, 80);
   set_motor_speed(2, 50);
}

/* motorId = 1, 2: indice del motore
 * speed = percentuale velocità. (ex: 25 = 25%, 100 = 100%) */
void set_motor_speed(int motorId, int speed)
{
   int cicle;

   cicle = (periodo / 100) * speed;
   
   if (motorId == 1)
   {
      cicle_M1 = cicle;
      bl_pwm_M1 = true;
   }
   else if (motorId == 2)
   {
      cicle_M2 = cicle;
      bl_pwm_M2 = true;
   }
}

#int_TIMER0

void TIMER0_isr()
{
   /* quando tmp_periodo è 0 allora il periodo è terminato,
    * quando invece vale 'periodo' allora è appena iniziato */
   if (tmp_periodo == 0)
   {
      tmp_periodo = periodo;     // resetto il contatore del periodo
      
      /* resetto i contatori del cicle dei motori */
      tmp_cicle_M1 = cicle_M1;
      tmp_cicle_M2 = cicle_M2;
   }
   else
   {
      /* è passato un nuovo periodo, quindi decremento i contatori */
      tmp_periodo--;
      
      if (tmp_cicle_M1 > 0)
         tmp_cicle_M1--;
         
      if (tmp_cicle_M2 > 0)
         tmp_cicle_M2--;
   }

   /* se ho abilitato il pwm per il motore 1 */
   if (bl_pwm_M1 == true)
   {
      if (tmp_cicle_M1 > 0)      // se il cicle non è terminato
         output_high(PIN_B1);    // pin B1 alto
      else
         output_low(PIN_B1);      
   }
   
   /* se ho abilitato il pwm per il motore 2 */
   if (bl_pwm_M2 == true)
   {
      if (tmp_cicle_M2 > 0)      // se il cicle non è terminato
         output_high(PIN_B2);    // pin B2 alto
      else
         output_low(PIN_B2);      
   }
}
per avere il syntax highlight: http://rafb.net/p/Hl57n167.html

è il primo codice in assoluto che scrivo dentro un pic (logicamente conosco bene lo c) a voi eventuali modifiche e migliorie

cordiali saluti Bruno
Rispondi citando
  #2  
Vecchio 13-07-2008, 00.00.23
BQuadra BQuadra non è collegato
Robottaro gold
 
Data registrazione: 10-07-2008
Residenza: nel mio mondo
Messaggi: 123
Potenza reputazione: 49
BQuadra E' per ora ancora un mistero
Predefinito

ma siete andati tutti in vacanza che non risponde nessuno!
Rispondi citando
  #3  
Vecchio 13-07-2008, 07.15.09
L'avatar di sergio_camici
sergio_camici sergio_camici non è collegato
Administrator
 
Data registrazione: 23-05-2002
Residenza: Binasco (MI)
Età : 54
Messaggi: 2,665
Potenza reputazione: 302
sergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua fama
Predefinito

Onestamente non ho capito la domanda...
Vuoi sapere se quel codice funziona?
Compilalo caricalo sul pic e verifica sperimentalmente
__________________
ciao
Sergio
---
Hai deciso di costruire un robot? Bene...
Cominciamo dalle brutte notizie: non e' facile...
Rispondi citando
  #4  
Vecchio 13-07-2008, 10.51.21
L'avatar di calo
calo calo non è collegato
Moderator
 
Data registrazione: 14-06-2006
Residenza: EmiliaSiciliaRomagna
Messaggi: 802
Potenza reputazione: 84
calo E' un faro della comunità
Predefinito

Se la tua necessità è avere due pwm per pilotare due motori allora usa un pic con i generatori pwm hardware....non sprechi risorse del pic e ti serve una riga di codice soltanto.
Se poi si tratta di un esercizio allora la cosa è differente, inizia a testarlo, come dice sergio, oppure fai una simulazione con PICSimulator Ide http://www.oshonsoft.com/pic.html
Rispondi citando
  #5  
Vecchio 13-07-2008, 12.33.15
BQuadra BQuadra non è collegato
Robottaro gold
 
Data registrazione: 10-07-2008
Residenza: nel mio mondo
Messaggi: 123
Potenza reputazione: 49
BQuadra E' per ora ancora un mistero
Predefinito

Ok, grazie a tutti e due, siuramente simulerò il tutto con pic simulator, ma la mia domanda è un'altra.
Avendo un quarzo a 20Mhz, devo impostare praticamente l'interrupt per il clock in modo da farlo andare ogni Periodo, ma quanto varrà questo periodo?!

Rispondi citando
  #6  
Vecchio 13-07-2008, 18.18.58
L'avatar di marnic
marnic marnic non è collegato
Administrator
 
Data registrazione: 23-05-2002
Residenza: Monselice (PD)
Età : 57
Messaggi: 5,458
Potenza reputazione: 421
marnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua fama
Predefinito

se vuoi un pwm a 15Khz fai 1/15000 e hai il periodo
Ciao
__________________
Marnic
Roboitalia Staff
www.fabbrimarco.com
Rispondi citando
  #7  
Vecchio 14-07-2008, 11.16.01
BQuadra BQuadra non è collegato
Robottaro gold
 
Data registrazione: 10-07-2008
Residenza: nel mio mondo
Messaggi: 123
Potenza reputazione: 49
BQuadra E' per ora ancora un mistero
Predefinito

Citazione:
Orginalmente inviato da marnic Visualizza messaggio
se vuoi un pwm a 15Khz fai 1/15000 e hai il periodo
Ciao
Con quale criterio la scelgo?

Considerando che se il periodo (facendo un esempio terra terra) è di 10s
ho che ogni 1s avviene l'interrupt del clock che mi decrementa le mie variabili, quindi devo tenere un periodo tale che ho discreta velocità anche per altre operazioni, in definitiva con quale criterio scelgo questo periodo (sapendo che ho un quarzo di 20Mhz? ) grazie a tutti e scusate ma è da poco che mi sto avviciando all'elettronica..
Rispondi citando
  #8  
Vecchio 14-07-2008, 14.28.02
L'avatar di calo
calo calo non è collegato
Moderator
 
Data registrazione: 14-06-2006
Residenza: EmiliaSiciliaRomagna
Messaggi: 802
Potenza reputazione: 84
calo E' un faro della comunità
Predefinito

La frequenza del PWM si sceglie in base all'elettronica di potenza che piloterà il motore: di norma, per il motore, è meglio avere una frequenza alta, ma questo significa fare commutare ad elevate frequenze i transistor del ponte H --> i componenti scaldano. La frequenza massima è scritta sul datasheet.

Venendo al tuo problema (dopo che avrai fatto le considerazioni che ti ho indicato sopra), devi capire che cosa metterai nel codice e quindi che tempi ti servono. Queste sono considerazioni e calcoli non semplici inoltre, finchè non lo scrivi non sai quante istruzioni ti occorreranno.

Consiglio1: momentaneamente ti mantieni su una frequenza medio bassa, tipo 5Khz, (sempre che la tua elettronica di potenza te lo permetta). Faresti bene a indicare che servo o motore + ponteH vuoi usare.

Consiglio2: te lo avevo gia dato.....lascia stare il 16F84 e scegli un PIC con due moduli CCP e hai risolto tutti i problemi in un sol colpo
Rispondi citando
  #9  
Vecchio 14-07-2008, 16.02.45
L'avatar di marnic
marnic marnic non è collegato
Administrator
 
Data registrazione: 23-05-2002
Residenza: Monselice (PD)
Età : 57
Messaggi: 5,458
Potenza reputazione: 421
marnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua fama
Predefinito

Stai chiedendo una soluzione ad un problema che ti stai creando a causa dell'errata scelta del pic, non che non si possa fare ma perchè farsi male da soli?
Quello che devi fare nel tuo caso è generare un interrupt ogni periodo di PWM aggiornare le variabili di duty ed eventualmente commutare l'uscita, esci dall'interrupt e riprendi quello che stavi facendo, il tempo per farlo c'è, tra 20MHz e ad esempio 20KHz di PWM hai un fattore 1000 il chè significa circa 500 istruzioni (macchina).
Gli inconvenienti arrivano se devi gestire altri interrupt, se il tuo programma richiede altre risorse.....
Insomma hanno inventato pic con il PWM hardware proprio per questo.
Ciao
__________________
Marnic
Roboitalia Staff
www.fabbrimarco.com
Rispondi citando
  #10  
Vecchio 14-07-2008, 18.24.10
BQuadra BQuadra non è collegato
Robottaro gold
 
Data registrazione: 10-07-2008
Residenza: nel mio mondo
Messaggi: 123
Potenza reputazione: 49
BQuadra E' per ora ancora un mistero
Predefinito

grazie a tutti, onestamente era una sfida tra me e me (come primo approccio alla programmazione pic), ma dato che si creano queste complicanze allora seguirò il vostro consiglo, utilizzerò questo pic.. voi qualche mi consigliate?

Devo gestire:

2 motori
4-6 sensori per il movimento
e la trasmissione dati (tramite rs232 e più in la spero tramite etere)

Grazie anticipatamente
Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione
Modalità  visualizzazioe

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code è Attivato
Le smilies sono Attivato
[IMG] è Attivato
Il codice HTML è Disattivato

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
idea codice controllo multi pwm BQuadra Elettronica 0 12-07-2008 11.41.32
Una piccola idea... K0smiC Progettazione 11 11-01-2008 17.07.51
Interessato a codice controllo cnc cibereagle2003 P. in Visual Basic 187 06-12-2004 18.55.54
idea SUMO feynman1977 Sumo 9 03-08-2004 10.55.42
Un idea per l organizzazione ghzrobot Forum generale 11 03-09-2002 10.55.07


Tutti gli orari sono GMT. Adesso sono le: 02.09.09.


Basato su: vBulletin Versione 3.8.8
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Realizzazione siti web Cobaltica Foligno
spacer.png, 0 kB