Advertise here

Teensy and PWM

Teensy and PWM





Teensy 3.1/3.2 boards have 12 pins support PWM 

PWM Resolution

Teensy 3.1/3.2 Boards based on 32 bit M4 arm cortex board , and the resolution of these boards higher than normal arduino boards (Like Mega and Uno) .

the Teensy PWM resolution can be up to 16 bit and you can set the PWM resolution using this function 

 analogWriteResolution(value);

value: Resolution value (2 - 16 )

PWM Frequency

in default , the PWM frequency for teensy 3.1/3.2 is 488 Hz and  you can change it using this function:

analogWriteFrequency(pin, freq);

pin: PWM pin
freq : Frequency in Hz

Simple Code

simple code here to enable PWM on teensy pins 4 and 5 , and change the frequency for pin# 4


Code : download it from here
/*
 * PWM teensy 3.1/3.2 simple code
 * more information 
 * https://mb-raw.blogspot.com/2018/02/teensy-and-pwm.html
 * written by : Mohannad Rawashdeh
 */

const int PWMpin1=4;//FTM1 timer
const int PWMpin2=5;//FTM0 timer

void setup()
{
pinMode(PWMpin1,OUTPUT); 
pinMode(PWMpin2,OUTPUT);

 // set the PWM frequency
  analogWriteFrequency(PWMpin1,10000);
  analogWriteResolution(8); // 0 - 255
  analogWrite(PWMpin1,127);
  analogWrite(PWMpin2,127);
  Serial.begin(115200);

}

void loop() 
{
  
 
}


output on pin# 5


output on pin# 4





Resolution Vs frequency 


Paul Stoffregen on his webiste provided us a table for a relation between the PWM resolution and frequency , as we can see higher frequency means lower resoultion you can use , also higher CPU frequency is better if you are looking for higher resolution



source : https://www.pjrc.com/teensy/td_pulse.html
so I decided to write a code to match these information , this code automatically calculate your CPU frequency and depend on your resolution you want , the code will choice the ideal PWM frequency for your CPU  and resolution setup  

the code will get the CPU frequency using this code :

long PWM_CPU_Frequency=F_CPU/1E6;

and you need to set the resolution you want by changing this variable


int PWM_Resolution=8; 

the output pin is pin# 4 

Code : download it from here
/*
 * PWM teensy 3.1/3.2 PWM ideal frequency 
 * more information 
 * https://mb-raw.blogspot.com/2018/02/teensy-and-pwm.html
 * written by : Mohannad Rawashdeh
 */
const int PWMpin1=4;//FTM1 timer
long PWM_CPU_Frequency=F_CPU/1E6;
int PWM_Resolution=8; //default
int FREQ_pointer=0;
long PWM_Freq;
//unsigned int PWM_Max_Value=2^PWM_Resolution - 1;
unsigned int PWM_Max_Value=pow(2,PWM_Resolution); 
// Resolution - CPU freq
long PWM_ideal_freq[5][15]
{
  {6000000,3000000,1500000,750000,375000,187500,93750,46875,23437,11718,5859,2929,1464,732,366},
  {12000000,6000000,3000000,1500000,750000,375000,187500,93750,46875,23437,11718,5859,2929,1464,732},
  {9000000,4500000,2250000,1125000,562500,281250,140625,70312,35156,17578,8789,4394,2197,1098,549},
  {12000000,6000000,3000000,1500000,750000,375000,187500,93750,46875,23437,11718,5859,2929,1464,732},
  {15000000,7500000,3750000,1875000,937500,468750,234375,117187,58593,29296,14648,7324,3662,1831,915}
};
/* for CPU frequency 
 *  24MHZ  >> 1
 *  48MHZ  >> 2
 *  72MHZ  >> 3
 *  96MHZ  >> 4
 *  120MHZ >> 5
 */
 void GetFreqValue(long FREQ)
 {
  switch(FREQ)
  {
    case 24:
    FREQ_pointer=1;
    break;
    case 48:
    FREQ_pointer=2;
    break;
    case 72:
    FREQ_pointer=3;
    break; 
    case 96:
    FREQ_pointer=4;
    break; 
    case 120:
    FREQ_pointer=5;
    break;          
  }
 }
void setup() {
  Serial.begin(57600);
  GetFreqValue(PWM_CPU_Frequency);
  PWM_Freq=PWM_ideal_freq[FREQ_pointer-1][PWM_Resolution-2];
  analogWriteFrequency(PWMpin1,PWM_Freq);
  analogWriteResolution(PWM_Resolution); 
  analogWrite(PWMpin1,PWM_Max_Value/2);
}

void loop() {
    Print_PWM_Data();
    delay(10000);
}

void Print_PWM_Data()
{
  Serial.println("***** PWM frequency - resoultion automatic Calibration ****");
  Serial.print("CPU Frequency [MHZ] : ");
  Serial.println(PWM_CPU_Frequency);
  Serial.print("PWM Resolution: ");
  Serial.println(PWM_Resolution);
  Serial.print("PWM ideal frequency: ");
  Serial.println(PWM_Freq);  
  Serial.print("PWM Max Value: ");
  Serial.println(PWM_Max_Value);  
  Serial.println("Written By: Mohannad Rawashdeh "); 
  Serial.println("***********************************"); 
}


here's the result on the oscillscope as well as on Serial monitor












then I changed my CPU frequency to 96 MHz with the same resolution and I got these results 









Support me and Follow me on:




1 comment:

Powered by Blogger.