I wrote a pseudo-sketch to set a clock frequency between 1.282 KHz and 20 MHz in any of the PWML pins of Due.
Here a correspondence between Digital pins and PWML channels:
Digital pin 34 -> PWML0
Digital pin 36 -> PWML1
Digital pin 38 -> PWML2
Digital pin 40 -> PWML3
Digital pin 9 -> PWML4
Digital pin 8 -> PWML5
Digital pin 7 -> PWML6
Digital pin 6 -> PWML7
Here the pseudo-sketch:
void setup() {
int16_t freq = f; // f - frequency value between 1282 Hz and 21 MHz
int32_t mask_PWM_pin = digitalPinToBitMask(x); // digital pin (x) to mask
REG_PMC_PCER1 = 1<<4; // activate clock for PWM controller
REG_PIOC_PDR |= mask_PWM_pin; // activate peripheral functions for pin (disables all PIO functionality)
REG_PIOC_ABSR |= mask_PWM_pin; // choose peripheral option B
REG_PWM_CLK = 0; // choose clock rate, 0 -> full MCLK as reference 84MHz
REG_PWM_CMRz = 0<<9; // select clock and polarity for PWM channel z
REG_PWM_CPRDz = 84000000/freq; // frequency for PWM channel z
REG_PWM_CDTYz = 42000000/freq; //duty cycle 50% for PWM channel z
REG_PWM_ENA = 1<<z; // enable PWM on PWM channel z
}void loop() {
}
For example, to generate 100KHz in digital pin 6 (D6), run the following sketch:
void setup() {
int32_t freq = 100000;
int32_t mask_PWM_pin = digitalPinToBitMask(6);
REG_PMC_PCER1 = 1<<4;
REG_PIOC_PDR |= mask_PWM_pin;
REG_PIOC_ABSR |= mask_PWM_pin;
REG_PWM_CLK = 0;
REG_PWM_CMR7 = 0<<9;
REG_PWM_CPRD7 = 84000000/freq;
REG_PWM_CDTY7 = 42000000/freq;
REG_PWM_ENA = 1<<7;
}
void loop() {
}
Notice that the pseudo-sketch does not work 'as is' in the Arduino IDE.
-p