之前介绍过 Arduino Uno 的 PWM 频率问题,最近因为需要研究了一下 Arduino 101 的 PWM 频率问题。经过一番研究,发现在Arduino15\packages\Intel-Test@arduino.cn\hardware\arc32\2.0.0\cores\arduino\wiring_analog.c 中提供了analogWriteFrequency 函数。
/* * brief Set the frequency of analogWrite parameters. * * param res */ extern void analogWriteFrequency(uint8_t pin, uint32_t freq);
从参数上来看,只要在 freq 指定一个频率,就可以输出这个频率的 PWM信号。
首先,测试一下 PWM 的默认频率:
void setup() { // initialize digital pin 13 as an output. pinMode(6, OUTPUT); } // the loop function runs over and over again forever void loop() { analogWrite(6,127); }
可以看到,对于 Pin6 默认的PWM 频率是 980Hz
接下来,试试 64KHz:
void setup() { // initialize digital pin 13 as an output. pinMode(6, OUTPUT); analogWriteFrequency(6, 64000); }
频率为 63.747Khz。
继续用这样的方法,升高频率到 250K,可以看到频率是 246.18Khz。
实验程序,最高可以发出 16Mhz的频率。
然后就是区分度的问题,这个词是我创造的,我想表达的是 pwm升高1之后是否有正常的变化。比如:我们PWM 写入8位,就是分成256份。一份对应 1/256=0.39%。就是说,正常情况下,anglogWrite(PinX,1) 和anglogWrite(PinX,2)在占空比上应该有 0.39%的差别。份数越少,区分度越差。