come nasce il motore a parallel path (il mostro) - EnergeticAmbiente.it

annuncio

Comprimi
Ancora nessun annuncio.

come nasce il motore a parallel path (il mostro)

Comprimi
X
 
  • Filtro
  • Ora
  • Visualizza
Elimina tutto
nuovi messaggi

  • Originariamente inviato da kekko.alchemi Visualizza il messaggio
    int counta= 0;
    int countb= 0;
    int countc= 0;
    int dlu= 0;
    int perc= 10;
    int a=0;
    int countd= 0;
    int counte= 0;
    Occhio Kekko
    Hai definito tutte le variabili come int, devi ricontrollare cosa ne viene fuori durante i calcoli, è probabile che perdi qualcosa durante il (cast) , come giustamente ti fa notare Bolle.
    Es:
    int a=200;
    int b=200;
    int c=0;

    se fai:

    c = a*B;

    In c non ti ritroverai il valore corretto se gli int sono a 8 bit.

    C'è da vedere bene cosa fa il compilatore che stai usando.

    Commenta


    • Originariamente inviato da triac60 Visualizza il messaggio
      Trattalo bene quel motorello, con quelle bestie di IGBT non si scherza.
      Sissì, quoto, "trattalo bene quel motorello"!

      Non vorrei essere considerato complice della sua "uccisione"!

      Fred.Fusion

      Commenta


      • Grazie 00mei per le intelligenti osservazioni

        Originariamente inviato da 00mei Visualizza il messaggio
        insomma... non mi convinci mica tanto...
        tieni conto che se "lubrifichi" o se "freni" il flusso spendi energia

        comunque il flusso viene spostato, non accelerato
        quando si parla di velocità del flusso si intende la velocita con cui varia la densita di flusso
        il flusso non si rappresenta con palline... il flusso si rappresenta con il numero di linee di flusso in una area
        se pensi di accelerarlo rischi di creare un modello lontano dalla realtà
        e rischi di imbrogliarti le idee

        BTW

        potrei sbagliarmi,
        se i spieghi meglio come rappresenti il flusso magnetico ne discutiamo...



        secondo a mia esperienza
        ogni volta che usi una bobina per scambiare energia tra un campo magnetico e un circuito elettrico hai delle perdite
        inoltre se fai scorrere flusso nel ferro hai piu perdite che se lo fai scorrere in aria
        quindi io personalmente eviterei ferro e bobine se non strettamente indispensabili

        non a caso il dimensoinamento del PP di Mac e Kekko
        prevede che i magneti siano praticamente sul bordo del PP stesso

        Paradossalmente si dovrebbe raggiungere il maggiore rendimento
        in una conversione tra energia elettrica e magnetica
        quando tutto il ferro è avvolto dal rame
        quindi l'idea di mettere una bobina sulla zavorra del PP mi pare fattibile
        va solo trovato il dimensionamento corretto
        per avere piu ferro coperto dal rame e meno ferro in assoluto..




        Il PP ad anello...
        quale è il suo scopo ?
        il flusso, in una situazione del genere, si richiude in aria
        e alimentando una bobina si cambia la disposizione del flusso, ma questo si richiude comunque in aria

        potrei capire se cercassi di fare un dispositivo con piu PP in cascata
        mi pare che qualcuno lo ha postato sul forum qualche tempo fa
        ma ovviamente con i PP in cascata il flusso si somma piu volte
        quindi anche il ferro deve essere via via di spessore crescente

        ... insomma.. tutto da studiare ...

        ciao
        00mei
        L'ipotesi di collegare più PP in cascata non so se consentirebbe il ritorno dei flussi (effetto pin pong).

        Per collegamento circolare io intendo un collegamento dove dopo ogni magnete verticale ci sia una bobina orizzontale sia sull'anello superiore che su quello inferiore. Inoltre proverei a fare diversi collegamenti tra le bobine ed ad intercalare degli elettromagneti ai magneti permanenti. Insomma mi piacerebbe provare per vedere se variando correnti tensioni e tipologia dei magneti dovesse venir fuori qualcosa che possa andare oltre le previsioni della comune elettrofisica.
        A proposito mentre stavo pensando alla PP a sviluppo circolare mi sono imbattuto in questa foto (con un po' d'immaginazione si riesce a vedere un circuito... o no?).

        Spero veramente di poter vedere a breve il mostro che gira alla grande (tra l'altro usare al posto dei mos gli IGBT proposti da Fred. Fusion mi sembra una buona idea. Spero inoltre che in futuro si decida di realizzare le PP con bobine di pilotaggio sempre più efficenti. Tu pensi che usando del rame al posto dei lamierini per avvolgere le bobine si possa ottenere un effetto migliore?
        File allegati

        Commenta


        • Questi sono quei momenti che mi viene da consigliare vivamente di non cambiare mai lo spacciatore di fiducia per voler risparmiare qualche euro.
          Angleo non te la prendere con simpatia mac

          ps: un po' di buon umore romano non guasta mai

          Commenta


          • Ci siamo ora funzia!! questo è il codice in C, per variare il duty cycle ho utilizzato 4 pulsanti, 2 che mi variano il duty dell' 1% alla volta e altri due che mi variano il duty del 10% alla volta.

            #include

            //Target PIC16F84 configuration word
            #pragma DATA _CONFIG, _PWRTE_OFF & _WDT_OFF & _HS_OSC & _CP_OFF

            //Set clock frequency
            #pragma CLOCK_FREQ 4000000

            int counta= 0;
            int countb= 0;
            int countc= 0;
            int dlu= 0;
            int perc= 50;
            int a=0;
            int b=0;
            int c=0;
            int countd= 0;
            int counte= 0;
            int countf= 0;
            int countg= 0;

            int var= 0;
            int i= 0;

            static void wait (void) {
            delay_us(100);
            for (i = 0; i }

            void main( void )
            {
            //Configure port A
            trisa =0x1F;
            //Configure port B
            trisb=0x3C;

            //Initialize port A
            porta = 0x00;
            //Initialize port B
            portb = 0x00;

            //Endless loop
            while( 1 ){

            if(porta.0==1 && counta==0){
            var=0;
            a= var * 100;
            b= a + countb;
            c= b / 100;
            var= c * perc;
            portb.0=1;
            wait();
            dlu=0;
            countb=0;
            counta=1;
            }

            if(porta.0==1 && counta==1){
            portb.0=0;
            portb.1=0;
            countb++;
            countc=0;
            }

            if(porta.1==1 && countc==0){
            var=0;
            a= var * 100;
            b= a + countb;
            c= b / 100;
            var= c * perc;
            portb.1=1;
            wait();
            countb=0;
            countc=1;
            }

            if(porta.1==1 && countc==1){
            portb.0=0;
            portb.1=0;
            countb++;
            counta=0;
            }

            if(portb.3==1 && countd==0){
            perc--;
            countd=1;
            }

            if(portb.3==0){
            countd=0;
            }

            if(portb.2==1 && counte==0){
            perc++;
            counte=1;
            }

            if(portb.2==0){
            counte=0;
            }

            if(portb.4==1 && countf==0){
            perc= perc + 10;
            countf=1;
            }

            if(portb.4==0){
            countf=0;
            }

            if(portb.5==1 && countg==0){
            perc= perc - 10;
            countg=1;
            }

            if(portb.5==0){
            countg=0;
            }

            if(perc<=0){
            perc=0;
            }

            if(perc>=100){
            perc=100;
            }


            }
            }
            La sapienza è figlia dell'esperienza... Leonardo da Vinci

            Commenta


            • E questo è per bolle, il file in ASM !
              Ditemi che ne pensate e se posso migliorare qualcosa per rendere più veloce e semplice il tutto!
              File allegati
              La sapienza è figlia dell'esperienza... Leonardo da Vinci

              Commenta


              • Allora,
                una buona notizia e una brutta...iniziamo con la

                Notizia brutta
                il codice dell'attesa non risente della variabile var...il ciclo for gira a vuoto...cioè rallenta quel tanto per incrementare var e non rallenta i 100 micro a ciclo...per me è un mistero il funzionamento...... ma non è detto che abbia ragione...anzi!!!
                quinti il codice :

                static void wait (void) {
                delay_us(100);
                for (i = 0; i
                }

                lo cambierei in ...
                static void wait (void) {
                for (i = 0; i
                delay_us(100);
                }

                Notizia bella
                ho visto l'asm e contrariamente a quanto pensavo (e quanto scritto nel manuale(*)) la divisione delle variabili a 16 bit...funge e funge anche bene, non si limita solamente a considerare il doppio byte del dividendo e divisore ma anche il risultato torna in un 16 bit...quindi perfetto...bravo kekko!!!
                Unico neo ... la divisione impiega molti ma molti cicli di clock...ma per il resto è perfetto.
                Datemi qualche ora (lavoro permettendo) di verificare la moltiplicazione e gli operatori > e < (in modo superficiale)...qualcuno potrebbe dire che sono troppo pignolo...ma meglio perdere qualche ora prima che perdersi per strada poi...

                (*) Kekko mi dici la versione del tuo compilatore sourceboost...

                __div_16_1_00003
                ; { __div_16_16 ; function begin
                CLRF __div_16_1_00003_1_r
                CLRF __div_16_1_00003_1_r+D'1'
                CLRF CompTempVarRet103
                CLRF CompTempVarRet103+D'1'
                CLRF __div_16_1_00003_1_i
                label268435530
                BTFSC __div_16_1_00003_1_i,4
                RETURN
                BCF STATUS,C
                RLF CompTempVarRet103, F
                RLF CompTempVarRet103+D'1', F
                RLF __div_16_1_00003_arg_a, F
                RLF __div_16_1_00003_arg_a+D'1', F
                RLF __div_16_1_00003_1_r, F
                RLF __div_16_1_00003_1_r+D'1', F
                MOVF __div_16_1_00003_arg_b+D'1', W
                SUBWF __div_16_1_00003_1_r+D'1', W
                BTFSS STATUS,Z
                GOTO label268435535
                MOVF __div_16_1_00003_arg_b, W
                SUBWF __div_16_1_00003_1_r, W
                label268435535
                BTFSS STATUS,C
                GOTO label268435536
                MOVF __div_16_1_00003_arg_b, W
                SUBWF __div_16_1_00003_1_r, F
                MOVF __div_16_1_00003_arg_b+D'1', W
                BTFSS STATUS,C
                DECF __div_16_1_00003_1_r+D'1', F
                SUBWF __div_16_1_00003_1_r+D'1', F
                BSF CompTempVarRet103,0
                label268435536
                INCF __div_16_1_00003_1_i, F
                GOTO label268435530
                ; } __div_16_16 function end
                La mia provenienza http://www.energialternativa.info/Pu...um/index15.php

                Commenta


                • Analizziamo il codice... trascurando i pulsanti che variano le percentuali, possiamo dividerlo in due blocchi...tra loro gemelli e speculari nella implementazione dovuta allo sfasamento meccanico dei due sensori di 36° (un vero capolavoro)...
                  Cerco velocemente di riassumere...poi vediamo le cose che non mi 'quadrano'.
                  Nel blocco 1 il primo if vede arrivare la parte piena (vuota) del polo del rotore (trascuriamo l'anticipo anche lui regolato meccanicamente)...chiude il circuito della prima bobina (portb.0=1) e si attende un tempo che dipende dalla variabile countb...dopo di che si azzera questa variabile...nei giri successivo si entra nel secondo if (per la variabile counta modificata nel primo if)...a questo punto riparte il conteggio del contatore countb (si sblocca l'eventuale passaggio al blocco 2 settando la variabile countc)
                  Il blocco 2 è speculare...e legato dalla variabile countc...quindi lavorano in modo sequenziale ( lavora prima uno ...poi l'altro...e così via).
                  Vediamo in dettaglio il codice...le prime 3 istruzioni si possono eliminare...il codice scritto da kekko è veramente un alchimia...tutto si poggia sulla variabile var...che viene incrementata e quindi rallenta ma solo per il ciclo for e non per l'attesa dei 100 us...ma forse è proprio questo che fa 'fungere' il tutto. Sotto riporto l'ottimizzazione...ma non mi aspetto che dia dei valori aggiunti...anzi...
                  La cosa che non mi 'quadra' ...cioè ho un dubio sul conteggio della variabile countb quando si è in attesa...faccio un disegno su questo (tempo permettendo)...e mi aspetto dei commenti.
                  Ciao
                  Bolle

                  // Analisi del blocco 1
                  if(porta.0==1 && counta==0)
                  {
                  var=0; // <----var sempre uguale a zero
                  a= var * 100; // <--- la variabile a vale sempre 0
                  b= a + countb; // <--- b= countb
                  c= b / 100; // <--- c= countb/100
                  var= c * perc; // <--- var = (contb/100) * perc
                  // var=(countb*perc)/100 var è la percentuale in più...
                  portb.0=1;
                  // Si attiva la bobina1 e si attende 100 us + il ciclo for di var (occhio perchè indipendente dai 100 us)
                  wait();
                  dlu=0; // dlu non utilizzata mai
                  countb=0;
                  counta=1;
                  }

                  if(porta.0==1 && counta==1){
                  portb.0=0; //Apro la bobina 1
                  portb.1=0;
                  countb++;
                  countc=0;
                  }

                  //'Ottimizzazione' del blocco 1
                  if(porta.0==1 && counta==0)
                  {
                  c= countb / 100;
                  var= c * perc;
                  portb.0=1;
                  wait();
                  countb=0;
                  counta=1;
                  }

                  if(porta.0==1 && counta==1){
                  portb.0=0;
                  countb++;
                  countc=0;
                  }
                  La mia provenienza http://www.energialternativa.info/Pu...um/index15.php

                  Commenta


                  • Qualcuno mi dice come faccio ad allegare le immagini su questa piattaforma (come il crop circle di Angelo Gaudenzi)?
                    Grazie
                    Bolle
                    La mia provenienza http://www.energialternativa.info/Pu...um/index15.php

                    Commenta


                    • Si, in effetti è un po un'alchimia :-)
                      Sicuramente il tempo di attesa va rivisto in maniera maggiormante deterministica...
                      Così obiettivamente non so quanto aspetti, perchè il delay è fuori...
                      Cmq, cosa sarebbe il countb?
                      Perchè determina il ritardo, che dovrebbe essere determinato da perc?
                      Serve per calcolare la velocità di rotazione?
                      E porta.0 porta.1 e portb.1-2 a cosa sono collegati?
                      Ciao!

                      Commenta


                      • Originariamente inviato da Fred.Fusion Visualizza il messaggio
                        @ mac-giver e kekko.alchemi

                        Seguo da un po' di tempo la vostra "impresa" e mi chiedevo perché negli stadi di pilotaggio non avete previsto di utilizzare IGBT invece di MOSFET, dato che i primi sono molto robusti e non credo ci siano problemi di velocità di commutazione.

                        Poi mi sono ricordato che avevo da qualche parte un paio di moduli IGBT
                        uguali a questi:

                        di recupero, che avevo messo da parte in vista di possibili utilizzi ... mai arrivati.
                        Qui c'è il datasheet.
                        Oggi, avendo un po' di tempo, li ho ricercati e li ho ritrovati.

                        Purtroppo non posso testarli per assicurarne il funzionamento (anche se mi sembra di averlo fatto all'epoca), ma se ritenete sarei felice di donarli per la causa spedendoveli.

                        Se vi sono utili mandatemi l'indirizzo in PM e cercherò di spedirveli entro domani.

                        Saluti
                        grazie super grazie fred!! sono arrivati quei mostriiii...

                        ora con tranquillità faremo le prove, sia con quelli che erano fallati, che ora sono arrivati, e sembrano ok, sia con sti mostri incredibili..

                        cmq, sarebbero perfetti per la bicidragster che sto a tempo perso costruendo..
                        sono componenti quelli che ci hai mandato non comuni!

                        grazieeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

                        Commenta


                        • Originariamente inviato da NonSoloBolleDiAcqua Visualizza il messaggio
                          Qualcuno mi dice come faccio ad allegare le immagini su questa piattaforma (come il crop circle di Angelo Gaudenzi)?
                          Grazie
                          Bolle
                          Ciao

                          Questa che segue è una spiegazione di come utilizzare una soluzione alternativa al caricamento diretto delle immagini sul server del forum (si utilizza il servizio imageshack):
                          http://www.forum-macchine.it/showthread.php?t=9898

                          Se hai problemi, alza la mano

                          Edit:
                          Se vuoi, invece, utilizzare il servizio interno al forum, basta che tu scorra tra le "Opzioni addizionali"/Allega i files/Selezioni l'immagine prescelta.

                          Penso basti questo (sinceramente non ho provato, però).

                          Commenta


                          • Allego l'immagine del motore dove e' possibile vedere come sono posizionati (almeno cosi ho interpretato) i sensori S1 e S2 (corretto il disegno per i puristi).
                            Mi sono divertito a scrivere un codice 'orientato' al compilatore di kekko...forse compila al primo colpo...se funziona ...hehehe a saperlo...
                            Cmq:
                            1.ho scritto una specie di macchinina a stati
                            2.utilizzo un solo sensore
                            3.sono passato al concetto dell'angolo
                            lo verifico...e poi lo posto...spero possa essere utile a kekko

                            Bolle




                            X Grazie mychilee (miii...quanto sei brutto)...ho sempre problemi con imageshack...ma lasciamo stare...ora ha preso l immagine.
                            Ultima modifica di NonSoloBolleDiAcqua; 18-06-2008, 17:06.
                            La mia provenienza http://www.energialternativa.info/Pu...um/index15.php

                            Commenta


                            • Originariamente inviato da mac-giver Visualizza il messaggio
                              cmq, sarebbero perfetti per la bicidragster che sto a tempo perso costruendo..
                              sono componenti quelli che ci hai mandato non comuni!
                              Se fai la bicidragster (in effetti uno dei possibili utilizzi per quegli IGBT era proprio quello, ma mi sono fermato alla scheda dell'acceleratore elettronico), devi assolutamente fare in modo che abbia l'autonomia per arrivare a Firenze ... ho già in mente il posto adatto per provarla


                              Certo che con un motore OU ... è un gioco da ragazzi

                              Fred.Fusion

                              Commenta


                              • Il mio collega (che non ci capisce una mazza di sw)...ha scommesso contro di me (tanto per rompere) ...dice che non funzionerà al primo colpo.Prima di accettare la scommessa (trattasi di cena) ho strappato la possibilità di fare una sola domanda a kekko...

                                [quote=kekko.alchemi;118850281]
                                Si bolle i sensori sono 2 messi a 36 gradi l'uno dall'altro.
                                [quote]
                                Si ha ragione kekko stanno a 36°

                                Bolle
                                La mia provenienza http://www.energialternativa.info/Pu...um/index15.php

                                Commenta


                                • Ma non c'era anche un prescaler una volta nei PIC? Vedo in giro gente che genera ritardi dell'ordine dei secondi con due righe di codice ...
                                  Mi e' forse sfuggito qualche post ???



                                  Ciauzz

                                  Commenta


                                  • Originariamente inviato da Elektron Visualizza il messaggio
                                    Ma non c'era anche un prescaler una volta nei PIC? Vedo in giro gente che genera ritardi dell'ordine dei secondi con due righe di codice ...
                                    Mi e' forse sfuggito qualche post ???

                                    Ciauzz
                                    Certo che c'è un prescaler...ti piacerebbe risolvere il problema con il timer, prescaler ed interrupt...ma non puoi...altrimenti dove sta il divertimento???
                                    Ho finito, controllato e ricontrollato...ma tra un po esco ho da fare...stanotte (forse) posto...mi sa tanto che devo pagare la cena (tanto metto le mani avanti).
                                    heehh
                                    La mia provenienza http://www.energialternativa.info/Pu...um/index15.php

                                    Commenta


                                    • Allora ... se dovessi farlo io-> timer prescaler ed interrupt, non quanto perche' mi piaccia ma perche' e' l'unica maniera in qui so farlo. Cioe' voglio dire ... da quando il mondo e' mondo i ritardi si fanno cosi' , indipendentemente dal processore usato e dal linguaggio ... ma potrei sbagliare ....

                                      a-riciauzzz

                                      Commenta


                                      • Originariamente inviato da Elektron Visualizza il messaggio
                                        Allora ... se dovessi farlo io-> timer prescaler ed interrupt
                                        Concordo, come per la programmazione dei PLC, quando è scaduto il tempo si attiva una parte di codice, ne frattempo la CPU può svolgere altri compiti, invece che girare i pollici in 'Delay' vari.

                                        Commenta


                                        • Simpatica battuta Mac...Però...

                                          Originariamente inviato da mac-giver Visualizza il messaggio
                                          Questi sono quei momenti che mi viene da consigliare vivamente di non cambiare mai lo spacciatore di fiducia per voler risparmiare qualche euro.
                                          Angleo non te la prendere con simpatia mac

                                          ps: un po' di buon umore romano non guasta mai
                                          ...Però ho la strana convinzione (non dovuta al fatto che tu scherzosamente adduci perchè essendo così di natura ho pure la fortuna di risparmiare i soldi che altri dedicano a certi passatempi)...dicevo ho la singolare convinzione che un bel giorno tu ( spero insieme a tutti noi del forum) realizzerai un motore con quella geometria e quel motore andrà alla grande...veloce, pulito e...leggero...molto leggero..
                                          Saluti Mac ..e mi raccomando...metti in moto la bestia, possibilmente aggiungendo la grande C...

                                          Commenta


                                          • Per Mac........

                                            ..Se avessi allegato questa d'immagine ..cosa avresti pensato?
                                            Allego pure il link...Il crop somigliante alla geometria del mostro si trova in alto a sinistra (seconda fila seconda immagine).


                                            http://atatude.files.wordpress.com/2007/06/cropb.jpg
                                            File allegati

                                            Commenta


                                            • angelo, per la mega C sono sicuro che è un ottima idea..

                                              stasera vedremo se riusciamo di farlo girare a 3.. mos permettendo...

                                              azz c'è un mostro disegnato l'assù!

                                              Commenta


                                              • Originariamente inviato da Elektron Visualizza il messaggio
                                                Allora ... se dovessi farlo io-> timer prescaler ed interrupt, non quanto perche' mi piaccia ma perche' e' l'unica maniera in qui so farlo. Cioe' voglio dire ... da quando il mondo e' mondo i ritardi si fanno cosi' , indipendentemente dal processore usato e dal linguaggio ... ma potrei sbagliare ....

                                                a-riciauzzz
                                                A volte conoscere molti linguaggi e sapersi adattare alle esigenge del momento ti fa arrivare alle soluzioni...come dice il proverbio...la necessità aguzza l'ingegno(re)...non è bravo colui che arriva alle soluzioni richiedendo mi serve questo e quello...è bravo colui che utilizza ciò che ha.
                                                Basta guardare cosa ha fatto kekko...parliamoci chiaramente...quanti saprebbero fare quello che ha fatto lui?
                                                Comunque si poteva scrivere un programma in linguaggio macchina (a parte che nessuno lo ha scritto)...ma poi se non si capisce? A mio avviso bisogna insegnare a pescare e non dare i pesci...altrimenti sarebbe inutile.
                                                Speriamo ti stia sbagliando...tra un pò posto il programma...lo sto commentando (odio commentare).
                                                Un saluto con la solita stima.

                                                Bolle



                                                Originariamente inviato da triac60 Visualizza il messaggio
                                                Concordo, come per la programmazione dei PLC, quando è scaduto il tempo si attiva una parte di codice, ne frattempo la CPU può svolgere altri compiti, invece che girare i pollici in 'Delay' vari.
                                                Delay vari??? E chi li ha utilizzati!!!
                                                Te la senti di scrivere tu il prog con i timer e interrupt?


                                                Originariamente inviato da Angelo Gaudenzi Visualizza il messaggio
                                                ..Se avessi allegato questa d'immagine ..cosa avresti pensato?
                                                Allego pure il link...Il crop somigliante alla geometria del mostro si trova in alto a sinistra (seconda fila seconda immagine).
                                                Angelo...sei incredibile!!!

                                                Bolle
                                                La mia provenienza http://www.energialternativa.info/Pu...um/index15.php

                                                Commenta


                                                • codice:
                                                   
                                                  #include 
                                                  //Target PIC16F84 configuration word
                                                  #pragma DATA _CONFIG, _PWRTE_OFF & _WDT_OFF & _HS_OSC & _CP_OFF
                                                  //Set clock frequency
                                                  #pragma CLOCK_FREQ 4000000
                                                  //----------------------------------------------------
                                                  //STATI MACCHINA
                                                  //0->STATO DI AVVIO 
                                                  //1-> BOBINA B1 ATTIVATA, 2 -> BOBINA B1 NON ATTIVA
                                                  //3-> BOBINA B2 ATTIVATA, 4 -> BOBINA B2 NON ATTIVATA
                                                  //----------------------------------------------------
                                                  //----------------------------------------------------
                                                  char  STATO=0;           //Variabile di Stato della macchina           
                                                  int   CountBloccoPieno=0;//Contatore blocco del polo rotore pieno
                                                  int   CountBloccoVuoto=0;//Contatore blocco rotore vuoto
                                                  int   TempoBloccoPieno=0;//Tempo impiegato dal rotore per passare il blocco pieno
                                                  int   TempoBloccoVuoto=0;//Tempo impiegato dal rotore per passare il blocco vuoto
                                                  int   Angolo;            //Angolo espresso in gradi
                                                  int   AngoloStop= 5;     //Angolo di eccitazione bobine...cioè 5 gradi sono la durata dell'impulso
                                                  char  CountRit=0;        //Contatore di ritardo incremento
                                                  const char VAL_RIT =100; //COSTANTE DI RITARDO INCREMENTO...VARIARLA A SENSAZIONE!!!!!
                                                  //----------------------------------------------------
                                                  main()
                                                  {
                                                   while(1)
                                                    {
                                                    if (porta.0==1)    
                                                     { //Il sensore S1 si trova nel blocco pieno
                                                     // ATTENZIONE VA EVITATO L'OVERFLOW...RALLENTARE L'INCREMENTO MEDIATE LA COSTANTE VAL_RIT
                                                     CountRit++;
                                                     if ( CountRit > VAL_RIT) 
                                                       {                      
                                                       CountBloccoPieno++;                            // Incremento il contatore del blocco pieno
                                                       CountRit=0;
                                                       }
                                                   
                                                      // Calcolo l'angolo...è un rapporto di due tempi...
                                                      Angolo=(CountBloccoPieno*36)/TempoBloccoVuoto;
                                                     if (STATO==0)  //STATO DI AVVIO INIZIALE ALLA PARTENZA IL SENSORE SI TROVA SUL PIENO
                                                       {                      
                                                       portb.0=1;   //ECCITA LA BOBINA 1
                                                       STATO=1;     //SETTA IL NUOVO STATO
                                                       }
                                                     else if (STATO==1)   //BOBINA 1 ECCITATA
                                                       {
                                                       if (Angolo>AngoloStop)          //VERIFICO SE DEVO DISECCITARE LA BOBINA 1
                                                         {
                                                         portb.0=0;  //APRE IL CIRCUITO DELLA BOBINA 1
                                                         STATO=2;    //SETTA IL NUOVO STATO
                                                         }
                                                       }
                                                     else if (STATO==4 || STATO==3) 
                                                       {
                                                       TempoBloccoVuoto=CountBloccoVuoto;      //Congelo il tempo impiegato per effettuare 36°
                                                       CountBloccoPieno=0;
                                                       portb.1=0;  //APRE LA BOBINA 2 NEL CASO FOSSE SALTATO LO STATO 4...CIOE' ENTRATO PER STATO==3
                                                       portb.0=1;  //ECCITA LA BOBINA 1
                                                       STATO=1;    //SETTA IL NUOVO STATO
                                                       }
                                                     }
                                                    else //Il sensore S1 si trova nel blocco vuoto
                                                     {
                                                     // ATTENZIONE VA EVITATO L'OVERFLOW...RALLENTARE L'INCREMENTO MEDIATE LA COSTANTE VAL_RIT
                                                     CountRit++;
                                                     if ( CountRit > VAL_RIT) 
                                                       {                      
                                                       CountBloccoVuoto++;     // Incremento il contatore del blocco vuoto
                                                       CountRit=0;
                                                       }
                                                     Angolo=(CountBloccoVuoto*36)/TempoBloccoPieno;  
                                                     if (STATO==0)  //STATO DI AVVIO INIZIALE ALLA PARTENZA IL SENSORE SI TROVA SUL VUOTO
                                                       {
                                                       portb.1=1;   //ECCITA LA BOBINA 2
                                                       STATO=3;     //SETTA IL NUOVO STATO
                                                       }
                                                     else if (STATO==2 || STATO==1)   
                                                       {
                                                       TempoBloccoPieno=CountBloccoPieno;  //Congelo il tempo impiegato per effettuare 36°
                                                       CountBloccoVuoto=0;
                                                       portb.0=0;  //APRE LA BOBINA 1 NEL CASO FOSSE SALTATO LO STATO 2..CIOE' ENTRATO PER STATO==1
                                                       portb.1=1;  //ECCITA LA BOBINA 2
                                                       STATO=3;    //SETTA IL NUOVO STATO
                                                       }
                                                     else if (STATO==3)   //BOBINA 2 ECCITATA
                                                       {
                                                       if (Angolo>AngoloStop)          //VERIFICO SE DEVO DISECCITARE LA BOBINA 2
                                                         {
                                                         portb.1=0;  //APRE IL CIRCUITO DELLA BOBINA 2
                                                         STATO=4;    //SETTA IL NUOVO STATO
                                                         }
                                                       }
                                                     }
                                                    }
                                                  }
                                                  La mia provenienza http://www.energialternativa.info/Pu...um/index15.php

                                                  Commenta


                                                  • Il concetto della macchina a stati..è semplice...quindi saltiamo la spiegazione....gli stati possibili sono commentati nel codice.
                                                    Spendiamo due parole sul concetto dell'angolo:
                                                    la variabile TempoBloccoPieno è il tempo espresso in 'cucuzzari' che impiega la parte piena a percorrere il sensore, mentre la variabile TempoBloccoVuoto è il tempo espresso sempre in 'cucuzzari' che impiega la parte vuota a percorrere il sensore.
                                                    Quando il sensore gira sulla parte piena c'è la variabile CountBloccoPieno che conta sempre i cucuzzari...il rapporto tra CountBloccoPieno ed il tempo impiegato a percorrere tutta la parte vuota (TempoBloccoVuoto) è un valore puro...se questo viene moltiplicato per 36...diventa l'angolo che stiamo cercando.
                                                    Ovviamente il programma non si ferma mai...e non si deve fermare in deley o altre menate del genere...altrimenti viene sfalsato il tutto.
                                                    La stessa cosa vale per il secondo blocco del programma...
                                                    quindi Angolo=(CountBloccoPieno*36)/TempoBloccoVuoto;
                                                    è l' angolo espresso in gradi e può assumere valori da 0 a 36 e ci dice la posizione relativa in gradi del rotore...se moltiplichiamo per 360...otteniamo i decimi di grado di precisione...ma avevo paura di un overflow...poi si ottimizza.

                                                    PS1: *36...mi soffermo su questo valore...se vogliamo andare più veloci ( o per chi volesse scrivere questo programma il linguaggio macchina) possiamo mettere*32 (shift di 4) e modulare l'AngoloStop a 32
                                                    PS2: Attenzione TempoBloccoVuoto all'avvio vale 0 dal disassemblato del codice della divisione dovrebbe tornare 0 quindi
                                                    PS3:Se funge bene...e quindi cena...se non funge...vabbè...ce l'ho messa tutta!
                                                    PS4ovrebbe (il condizionale è d'obbligo) funzionare sempre se funzionano le operazioni a 16 bit...che sono limitate al confronto e al calcolo dell'angolo
                                                    PS5:Speriamo serva a Kekko...
                                                    Un saluto

                                                    Bolle
                                                    La mia provenienza http://www.energialternativa.info/Pu...um/index15.php

                                                    Commenta


                                                    • Spendo altre due parole su queste 4 linee di codice...esclusivamente per kekko...probabilemente hai già capito il significato....ma...meglio dire che non dire.
                                                      Quindi dato che il pic è molto veloce la variabile CountBloccoPieno non può essere incrementata ad ogni passaggio...e quindi viene ritardata di un VAL_RIT...questo valore l'ho settato uguale a 100 (prendendo spunto dal tuo codice)...ma c'è da trovare un valore ottimale...

                                                      Bolle

                                                      CountRit++;
                                                      if ( CountRit > VAL_RIT)
                                                      {
                                                      CountBloccoPieno++; // Incremento il contatore del blocco pieno
                                                      CountRit=0;
                                                      }
                                                      La mia provenienza http://www.energialternativa.info/Pu...um/index15.php

                                                      Commenta


                                                      • Originariamente inviato da NonSoloBolleDiAcqua Visualizza il messaggio

                                                        Notizia brutta
                                                        il codice dell'attesa non risente della variabile var...il ciclo for gira a vuoto...cioè rallenta quel tanto per incrementare var e non rallenta i 100 micro a ciclo...per me è un mistero il funzionamento...... ma non è detto che abbia ragione...anzi!!!
                                                        quinti il codice :

                                                        static void wait (void) {
                                                        delay_us(100);
                                                        for (i = 0; i
                                                        }

                                                        lo cambierei in ...
                                                        static void wait (void) {
                                                        for (i = 0; i
                                                        delay_us(100);
                                                        }
                                                        Ciao Bolle
                                                        Se non ti ricordi neanche quello che scrivi ... stai messo bene!!!

                                                        Commenta


                                                        • dalle mie parti :"Triacche a bona campana se sente 'a luntano, statt citt" traduzione :"Quando una persona è veramente capace, non si tarba a rendersene conto quindi statti zitto che non hai capito nulla"

                                                          Commenta


                                                          • ma allora il mostro funziona?
                                                            wow! che numero di post

                                                            Commenta


                                                            • Originariamente inviato da triac60 Visualizza il messaggio
                                                              Ciao Bolle
                                                              Se non ti ricordi neanche quello che scrivi ... stai messo bene!!!
                                                              Ti sei leggermente confuso...ma capita a tutti non preoccuparti...
                                                              Ma...commenti sul codice? Non sei stupito dell'utilizzo di un solo sensore, non ci sono Delay, c'è un angolo il che ci svincola 'dal tempo', che non ci si ferma mai...e senza ricorrere ai timer o interrupt...non sei stupito?
                                                              Certo utilizzando timer/perscaler/interrupt sarebbe stato più facile...attendo il tuo codice...sono curioso di vedere come lo fai.
                                                              La mia provenienza http://www.energialternativa.info/Pu...um/index15.php

                                                              Commenta

                                                              Attendi un attimo...
                                                              X