mikroIDE

Version:0.9 StartHTML:0000000105 EndHTML:0000018781 StartFragment:0000001499 EndFragment:0000018765

    char value = 0x01;                            //valore per variare il pwm
    unsigned int Corrente, Tensione;              //valori convertito
    unsigned long PotenzaT1, PotenzaT0;           //Valori Potenza
    bit check;

    void main() {

      TRISC.F2 = 0;                 //uscita pwm portc 2

      PR2 = 0x3F;                   //valore per garantire una frequenza di 31KHZ del pwm con quarzo da 8MHz
      T2CON = 0b00000100;           //setting tmr2: postascaler 1:1, tmr2 on, prescaler 1:1
      CCP1CON = 0b00001100;         //utilizza pwm e setta il valore di comparazione con i due lsb = 11
      CCPR1L = value;               //valore affinchè DC=1
      ADC_Init();                   //inizializza l'ADC
      check = 0;                    //Inizializzo le variabili a 0
      PotenzaT1 = 0;
      PotenzaT0 = 0;
      delay_ms(500);                //Delay assestamento

      while(1){

        Tensione = ADC_Get_Sample(0);                 //Leggi il valore di tensione
        Corrente = ADC_Get_Sample(1);                 //Leggi il valore di corrente
        PotenzaT1 = Tensione * Corrente;              //Ottieni valore potenza

        if (check){                                   //Se è stato effettuauo il primo controllo
          if (PotenzaT1 > PotenzaT0)                  //Se la potenza attuale è maggiore della precedente
            if(value < 0x3D) value ++;                //Incrementa valore

          else{                                       //Se invece la potenza è minore
            check = 0;                                //cambia ciclo controllo
            if(value > 0x03) value --;                //riduci il duty cycle
          }
        }
        else{                                         //ciclo di controllo inverso
          if (PotenzaT1 > PotenzaT0){                 //Se la potenza è maggiore
            if(value > 0x03) value --;                //Riduci il duty cycle
          else{                                       //Se la potenza è minore
            check = 1;                                //cambia ciclo di controllo
            if(value < 0x3D) value ++;                //incrementa valore DC
          }
          }
        }

        PotenzaT0 = PotenzaT1;                       //Salva valore di potenza
        CCPR1L = value;                              //Aggiorna DC
        delay_ms(100);                               //Delay di assestamento
     }
    }