Aumentare frequenza PWM su Arduino due

Salve, ho la necessità di aumentare la frequenza del segnale PWM sul pin 10 di arduino due.
Ho cercato in rete ma non sono riuscito a trovare qualcosa che funzionasse.

Un semplice esempio di PWM sul pin 10:

/******************************************************************/
/* Timer Counter 2 Channel 1, namely TC7, 1 Hz frequency on Pin 10*/
/******************************************************************/
void setup() {

  pinMode(LED_BUILTIN, OUTPUT);
  tc_setup();

}

void loop() {

}

void tc_setup() {

  PMC->PMC_PCER1 |= PMC_PCER1_PID34;                       // TC7 power ON : Timer Counter 2 channel 1 IS TC7 - see page 38

  PIOC->PIO_PDR |= PIO_PDR_P29;                            // Set the pin to the peripheral (page 859)
  PIOC->PIO_ABSR |= PIO_PC29B_TIOB7;                       // Peripheral type B

  TC2->TC_CHANNEL[1].TC_CMR = TC_CMR_TCCLKS_TIMER_CLOCK1  // MCK/2 = 42 M Hz, clk on rising edge
                              | TC_CMR_WAVE               // Waveform mode
                              | TC_CMR_WAVSEL_UP_RC       // UP mode with automatic trigger on RC Compare
                              | TC_CMR_EEVT_XC0           // TIOB as output
                              | TC_CMR_BCPB_CLEAR         // Clear TIOB7 on RB compare match
                              | TC_CMR_BCPC_SET;          // Set TIOB7 on RC compare match


  TC2->TC_CHANNEL[1].TC_RC = 42000000;  //<*********************  Frequency = (Mck/2)/TC_RC = 1Hz
  TC2->TC_CHANNEL[1].TC_RB = 21000000;  //<********************   Duty cycle = (CDTY/CPRD)  * 100 %


  TC2->TC_CHANNEL[1].TC_IER = TC_IER_CPCS;                 // Interrupt on RC compare match
  NVIC_EnableIRQ(TC7_IRQn);                                // Enable interrupt
  TC2->TC_CHANNEL[1].TC_CCR = TC_CCR_SWTRG | TC_CCR_CLKEN; // Software trigger TC7 counter and enable
}

void TC7_Handler() {

  TC2->TC_CHANNEL[1].TC_SR;                               // Read and clear status register
  PIOB->PIO_ODSR ^= PIO_ODSR_P27;                       // Toggle LED every 1 Hz
}

Ciao ard_newbie e grazie per la risposta, ho provato a capire l'esempio che hai postato, ma non mi è chiarissimo, perchè questa sarebbe la mia prima manipolazione di registri. Voglio comunque cercare di capirci qualcosa in più :slight_smile:

Ti spiego cosa dovrei fare, la frequenza dovrei cambiarla nel momento in cui richiamo una funzione che ho definito io e quando la funzione termina il suo lavoro la frequenza dovrebbe ritornare al valore di default.

Intanto, è possibile una cosa del genere?

Prendendo spunto dall'esempio che hai postato, la frequenza rimarrebbe cambiata per tutto il tempo dell'esecuzione del programma, dico bene?

Dimenticavo...analogWrite continuerà a funzionare normalmente dopo questa modifica?

La frequenza è modificabile modificando TC_RC.

void SetStep(byte ing){
  
  vin = ing;
  vpwm = (255*vin)/5;
  
  }

void Step(){

  tempo = 0;
  via = millis();
  start_sam = millis();

  while( tempo <= 4000){

    tempo = millis()-via;
 
    digitalWrite(DIR, LOW);
    digitalWrite(DIR2, HIGH);
    analogWrite (PWM, vpwm);
    

    end_sam = millis();
    sam_time = (end_sam - start_sam);

    if(sam_time >= sampling){

      start_sam = millis();      
      AggiornaPosizione();
      //Serial.println((int)tempo, DEC);
      Serial.println((float)angolo, DEC);

    }
  
  }

Questo è il codice che ho scritto io, dovrei inserire tc_setup() in SetStep e poi chiamare la funzione tc7_handler in Step?