标记 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);

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值