标记 Arduino M0 板子如何更改PWM输出频率

关于arduinoPWM管脚频率控制输出 

板子:arduino M0  Pro   Zero 

使用  tone(PIN_LED_13, 1000); /*改变当前管脚频率*/

使用  analogWrite(PIN_LED_13, 200);/*输出PWM波形*/

原理 是 tone 函数会更改时钟域的预分频值,从而导致pwm输出波形频率改变 


细微调整可以在  analogWrite 这个函数原型中更改计数上限值

x:\xxx\Arduino\hardware\arduino\samd目录下 

打开wiring_analog.c 中

更改 代码段中的PER.reg = 0xff这里的ff,比如更改为0xf0  导致pwm频率加快,具体改为多少需要细细调整

// Set PORT
    if ( isTC )
    {
      // -- Configure TC
      //DISABLE TCx
      TCx->COUNT8.CTRLA.reg &=~(TC_CTRLA_ENABLE);
      //Set Timer counter Mode to 8 bits
      TCx->COUNT8.CTRLA.reg |= TC_CTRLA_MODE_COUNT8;
      //Set TCx as normal PWM
      TCx->COUNT8.CTRLA.reg |= TC_CTRLA_WAVEGEN_NPWM;
      //Set TCx in waveform mode Normal PWM
      TCx->COUNT8.CC[Channelx].reg = (uint8_t) ulValue;
      //Set PER to maximum counter value (resolution : 0xFF)
      TCx->COUNT8.PER.reg = 0xff;
      // Enable TCx
      TCx->COUNT8.CTRLA.reg |= TC_CTRLA_ENABLE;
    }
    else
    {
      // -- Configure TCC


      //DISABLE TCCx
      TCCx->CTRLA.reg &=~(TCC_CTRLA_ENABLE);
      //Set TCx as normal PWM
      TCCx->WAVE.reg |= TCC_WAVE_WAVEGEN_NPWM;
      //Set TCx in waveform mode Normal PWM
      TCCx->CC[Channelx].reg = (uint32_t)ulValue;
      //Set PER to maximum counter value (resolution : 0xFF)
      TCCx->PER.reg = 0xf0;
      //ENABLE TCCx
      TCCx->CTRLA.reg |= TCC_CTRLA_ENABLE ;
    }


    return ;
  }

注意  由于TCC是24位计数器,所以 tcc这里的PER.reg = 0xf0;是可以更改到最大0xffffff的,此时  analogWrite(PIN_LED_13, 200);中的200可以是很大的值了 。如analogWrite(PIN_LED_13, 20000);

你可能感兴趣的:(技术文摘,硬件设计,代码设计,arduino,M0,pwm)