www.dedoshop.com
Risultati da 1 a 8 di 8
Like Tree1Likes
  • 1 Post By DrSchottky

Discussione: Help programmazione C tra array, puntatori e funzioni

  1. #1
    Vip Member L'avatar di brunosso
    Data Registrazione
    Jul 2011
    Località
    Ragusa
    Messaggi
    1,302

    Help programmazione C tra array, puntatori e funzioni

    ciao a tutti ragazzi. Non ne vengo più a capo e chiedo il vostro aiuto!

    Sto facendo un codice di controllo per una simulazione in simulink, di un motore asincrono. Ho la necessità di creare un'array di 16 elementi, e per popolarlo devo fare delle prove con dei valori di corrente..
    Vi scrivo il codice che mi viene meglio:

    Codice:
    if ((counter_commissioning>=300)&&(counter_commissioning<=1100)) {
                    itestLUT[i]=0;
                    for (i=0;i<3;i++){
                        itestLUT[i]=itestLUT[i-1]+0.3125;
                        vtestLUT[i]=AVG(&itestLUT,50);
                        counter_commissioning+=50;
    
                        LUTerr[i]=(3/4)*(vtestLUT[i]-(Rstot*itestLUT[i]));
                    }
                }
    Queste sono le righe del controllo, in pratica devo creare una LUT (lookup-table) di valori (16 nel mio caso) di errore di tensione (LUTerr). Per fare questa devo avere due array di tensione e corrente (rispettivamente chiamati vtestLUT e itestLUT). La tensione viene da una funzione che fa la media degli ultimi campioni acquisiti, mentre la corrente è a scatti di 0.3125A.

    Codice:
    double AVG(int *itestpar, double durata){
        tmp1=0;
        isdq_ref.q=0;
        isdq_ref.d=*itestpar;
        Current_loop();
        _invrot(vsdq_ref.d, vsdq_ref.q, SinCos_ref.sin, SinCos_ref.cos, vsab_ref.alpha, vsab_ref.beta);
        if ((tmp1==durata-10)&&(tmp1<durata)){
            vtest+=vsab_ref.alpha;
            vtest=vtest/10;        
        }
        tmp1++;
        return vtest;
    }
    Questa è la funzione che accumula campioni di corrente, li manda ad un regolatore PI di corrente (Current_loop() e fa la media dei valori di tensione generati degli ultimi 10 valori.

    Non riesco ad assegnare correttamente il valore della corrente a questa funzione AVG. Dove sbaglio? Presumo sia un problema di sintassi e di puntatori, ma non ne vengo a capo.
    Ho capito che l'array in realtà quando lo si definisce è come un puntatore al suo primo elemento, infatti nella funzione lo passo come puntatore..

    Vi ringrazio per qualsiasi dritta!
    Ultima modifica di brunosso; 08-06-15 alle 20: 34
    Usa i GOD... SEMPRE!!!!

  2. #2
    Junior Member
    Data Registrazione
    Oct 2011
    Località
    a
    Messaggi
    3
    dentro la funzione AVG mi aspetteri un loop (For)

  3. #3
    Vip Member L'avatar di brunosso
    Data Registrazione
    Jul 2011
    Località
    Ragusa
    Messaggi
    1,302
    Ciao grazie per la risposta! Stanotte ci ho pensato, ed ho riflettuto sul fatto che è un errore proprio implementativo! Il vettore deve essere solo LUTerr, gli altri possono anche non esserlo!... rimodifico e vediamo se funge
    Usa i GOD... SEMPRE!!!!

  4. #4
    Vip Member L'avatar di lapht
    Data Registrazione
    Oct 2011
    Località
    Como
    Messaggi
    1,208
    il primo spezzone di codice non può funzionare, guarda questo punto:

    for (i=0;i<3;i++){
    itestLUT[i]=itestLUT[i-1]+0.3125;

    quando i vale 0 cosa succede?

  5. #5
    Vip Member L'avatar di brunosso
    Data Registrazione
    Jul 2011
    Località
    Ragusa
    Messaggi
    1,302
    Citazione Originariamente Scritto da lapht Visualizza Messaggio
    il primo spezzone di codice non può funzionare, guarda questo punto:

    for (i=0;i<3;i++){
    itestLUT[i]=itestLUT[i-1]+0.3125;

    quando i vale 0 cosa succede?
    grazie lapht, ma ho sistemato, ed ora la itestLUT non è un vettore...vi aggiorno
    Usa i GOD... SEMPRE!!!!

  6. #6
    Open Member L'avatar di carloss
    Data Registrazione
    Jul 2011
    Località
    Altamura(BA)
    Messaggi
    997
    Codice:
    if ((counter_commissioning>=300)&&(counter_commissioning<=1100)) {
                    itestLUT[i]=0;
                    for (i=0;i<3;i++){
                        itestLUT[i]=itestLUT[i-1]+0.3125;
                        vtestLUT[i]=AVG(&itestLUT,50);
                        counter_commissioning+=50;
    
                        LUTerr[i]=(3/4)*(vtestLUT[i]-(Rstot*itestLUT[i]));
                    }
                }
    itestLUT[i] = 0 - Cosa vorresti fare? La variabile "i" l'hai inizializzata? Se non lo hai fatto "i" ha un valore casuale. Scritto così questo comando è inutile e genera errore. Per inizializzare a zero il primo elemento del vettore devi scrivere itestLUT[0]=0;
    Il ciclo for dovrebbe partire con i=1 altrimenti nel primo ciclo avrai itestLUT[-1] che non è ammesso.

    vtestLUT[i]=AVG(&itestLUT,50); - Qui dovresti passare itestLUT perchè è un vettore oppure l'equivalente &itestLUT[0]

  7. #7
    Vip Member L'avatar di brunosso
    Data Registrazione
    Jul 2011
    Località
    Ragusa
    Messaggi
    1,302
    Codice:
    for (i=1;i<17;i++){
                        itest+=0.3125;
                        tmp5=0;
                        do {
                            isdq_ref.q=0;
                            isdq_ref.d=itest;
                            Current_loop();
                            if (tmp5>=130){
                                vtest2+=vsdq_ref.d;
                                itest2+=isdq_ref.d;
                            }
                            if (tmp5==149){
                                vtest2=vtest2/19;
                                itest2=itest2/19;
                            }
                            _invrot(vsdq_ref.d, vsdq_ref.q, SinCos_ref.sin, SinCos_ref.cos, vsab_ref.alpha, vsab_ref.beta);
                            _invclarke(vsab_ref.alpha, vsab_ref.beta, vabcs_ref.a, vabcs_ref.b, vabcs_ref.c);
                            PWMduty();
                            tmp5++;
                            counter_commissioning++;
                        } while (tmp5==150);
                    }
    Ragazzi chiedo di nuovo aiuto!
    Dopo varie modifiche ho cambiato approccio implementativo, e non ne vengo cmq a capo...

    il mio obiettivo e far lavorare quello che è dentro il do-while per 150 cicli, e ripetere questi 150 cicli per 16 volte, cambiando la variabile itest ogni volta a passi da 0.3125A.
    Non capisco perchè non mi arriva mai ad incrementare tmp5. Il do-while non dovrebbe esegursi 150 volte, e poi passa al for, che fa lo step con i=2???
    Usa i GOD... SEMPRE!!!!

  8. #8
    DrSchottky
    Guest
    Nel caso di iterazione determinata non ti converrebbe usare un for piuttosto che un do-while?
    Comunque sbagli la clausola del while: nel tuo caso ripeterà solo quando tmp==150.
    Ultima modifica di DrSchottky; 10-06-15 alle 16: 01
    lapht likes this.

Segnalibri

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •  

realizzazione siti internet ed e-commerce mugello

elettricista barberino di mugello />
</a>
</div>

<div id=