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:

    [CODE]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]));
    }
    }[/CODE]
    Queste sono le righe del controllo, in pratica devo creare una LUT (lookup-table) di valori (16 nel mio caso) di [I]errore di tensione[/I] (LUTerr). Per fare questa devo avere due array di tensione e corrente (rispettivamente chiamati [I]vtestLUT [/I]e [I]itestLUT[/I]). La tensione viene da una funzione che fa la media degli ultimi campioni acquisiti, mentre la corrente è a scatti di 0.3125A.

    [CODE]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;
    }
    [/CODE]
    Questa è la funzione che accumula campioni di corrente, li manda ad un regolatore PI di corrente ([B]Current_loop()[/B] 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
    [QUOTE=lapht;288264]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?[/QUOTE]

    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
    [CODE]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]));
    }
    }[/CODE]

    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]
    [URL="http://twitter.com/#!/CarlossConsole"][/URL]

  7. #7
    Vip Member L'avatar di brunosso
    Data Registrazione
    Jul 2011
    Località
    Ragusa
    Messaggi
    1,302
    [CODE]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);
    }[/CODE]

    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