板子: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);