ad space

Arduino CTC mode Programming with Examples

This is tutorial on Arduino CTC mode Programming with Examples. In CTC mode, the timer counts up until the counter value TCNTx(where x is 0, 1 or 2) reaches the TOP value and at this point match occurs and the output at the output compare pins OCxA or OCxB can be either cleared, set or toggled. The TOP value depends upon the which Timer is used. Arduino has three timers called timer 0, timer 1 and timer 2 and each timer can be used in CTC mode. The timer 0 has one CTC mode with TOP at OCR0A, timer 1 has two CTC mode with TOP at OCR1A and ICR1 and timer 2 has one CTC mode with TOP at OCR2A.

In CTC mode, the timer counts up until the counter value TCNTx(where x is 0, 1 or 2) reaches the TOP value and at this point match occurs and the output at the output compare pins OCxA or OCxB can be either cleared, set or toggled. The TOP value depends upon the which Timer is used. Arduino has three timers called timer 0, timer 1 and timer 2 and each timer can be used in CTC mode. The timer 0 has one CTC mode with TOP at OCR0A, timer 1 has two CTC mode with TOP at OCR1A and ICR1 and timer 2 has one CTC mode with TOP at OCR2A. 

Arduino CTC mode Frequency & Count Value

The frequency(\(F_{w}\)) of the output waveform is given by the following equation.

\[F_{w}=\frac{F_{cpu}}{2N(C+1)}\]

where N is pre-scalar(either 1, 8, 64, 256 or 1024) and C is the count value to be loaded into the OCR0xA register or ICR1 register. \(F_{cpu}\) is clock frequency of 16MHz for Arduino. 

 From the above equation we can calculate the count value C to be loaded into OCR0A as follows,

\[C=\frac{F_{cpu}}{2NF_{w}}-1\]

1. Arduino Timer 0 in CTC mode

 The following are Programming examples of Arduino Timer 0 in CTC mode.

1.1 Square Wave using CTC mode 2 on OC0A pin

Example 1:  100KHz Square Wave using CTC Mode 2 on OC0A pin(pin 6 on Arduino)

The steps to generate square wave using Timer 0 CTC mode 2 is as follows.

1. Set Arduino Pin 6 (OC0A) as output

2. Load 79 into OCR0A to generate 100 kHz sq.wave

3. Configure TCCR0A & TCCR0B to configure Timer 0 to Toggle OC0A on compare match, Mode 2 (CTC),  No Prescalar, Start the timer

Program Code:

void setup () {
  //Pin 6 (OC0A) is output
  pinMode(6, OUTPUT);
  TCCR0B = 0;   // reset timer 0 control registers
  TCCR0A = 0;
  
   // Load 79 to generate 100 kHz sq.wave
  OCR0A = 79; 
   // Toggle OC0A on compare match, WGM 2 (CTC)
  TCCR0A = (1 << COM0A0) | (1 << WGM01); 
  // Start the timer, no prescalar
  TCCR0B = (1 << CS00); 
}

void loop() {

}

The following shows the generated square wave on oscilloscope.

Arduino CTC mode square wave on oscilloscope

 The following shows square waveform graph of 100KHz signal and it's Fourier transform on computer simulation.



 1.2 Square Wave using CTC mode 2 on OC0B pin 

Example 1:  100KHz Square Wave using CTC Mode 2 on OC0B pin(pin 5 on Arduino)

The steps to generate square wave using Timer 0 CTC mode 2 on OC0B pin is as follows.

1. Set Arduino Pin 5 (OC0A) as output

2. Load 79 into OCR0A to generate 100 kHz sq.wave

3. Configure TCCR0A & TCCR0B to configure Timer 0 to Toggle OC0B on compare match, Mode 2 (CTC),  No Prescalar, Start the timer

Program Code:

void setup () {
  //Pin 5 (OC0B) is output
  pinMode(5, OUTPUT);  
   // Load 79 to generate 100 kHz sq.wave
  OCR0A = 79; 
   // Toggle OC0A on compare match, WGM 2 (CTC)
  TCCR0A = (1 << COM0B0) | (1 << WGM01); 
  // Start the timer, no prescalar
  TCCR0B = (1 << CS00); 
}

void loop() {

}

2. Arduino Timer 1 in CTC mode

 The following are Programming examples of Arduino Timer 1 in CTC mode.

2.1 Square Wave using CTC mode 4 on OC1A pin 

Example 1:  10KHz Square Wave using CTC Mode 4 on OC1A pin(pin 9 on Arduino)

 In this CTC mode example a 10KHz square wave is generated at OC1A. In this CTC mode 4 the TOP is OCR1A register. We can calculate the count value to be loaded into the OCR1A register to generate 100KHz square wave using the equation provided above or can be calculated directly using the online ATmega Timer 1 calculator. The calculated count value for 10KHz is 799. 

The steps to generate square wave using Timer 1 CTC mode 4 is as follows.

1. Set Arduino Pin 9 (OC1A) as output

2. Load 799 into OCR1A to generate 10 kHz sq.wave

3. Configure TCCR1A & TCCR1B to configure Timer 1 to Toggle OC0A on compare match, WGM 4 (CTC),  No Prescalar, Start the timer

Program Code:

void setup () {
  //Pin 9 (OC1A) is output
  pinMode(9, OUTPUT);  
   // Load 799 to generate 10 kHz sq.wave
  OCR1A = 799; 
   // Toggle OC0A on compare match, mode 4 (CTC),  No prescalar, Start the timer
  TCCR1A = (1 << COM1A0); 
  TCCR1B = (1<<WGM12) | (1 << CS10); 
}

void loop() {

}

 2.2 Square Wave using CTC mode 12 on OC1A pin 

Example 2: 10KHz Square Wave using CTC Mode 12 on OC1A pin(pin 9 on Arduino)

The following code generates 10KHz on OC1A pin(pin 9 on Arduino) in mode 12 CTC mode.

void setup () {
  //Pin 9 (OC1A) is output
  pinMode(9, OUTPUT);  
   // Load 799 to generate 10 kHz sq.wave
  ICR1 = 799; 
   // Toggle OC1A on compare match, mode 12 (CTC),  No prescalar, Start the timer
  TCCR1A = (1 << COM1A0); 
  TCCR1B = (1<<WGM13) | (1<<WGM12) | (1 << CS10); 
}

void loop() {

}

2.3 Square Wave using CTC mode 4 on OC1B pin 

Example 3: 10KHz Square Wave using CTC Mode 4 on OC1B pin(pin 10 on Arduino)

The following code generates 10KHz on OC1B pin(pin 10 on Arduino) in mode 4 CTC mode.

void setup () {
  //Pin 10 (OC1B) is output
  pinMode(10, OUTPUT);  
   // Load 799 to generate 10 kHz sq.wave
  OCR1A = 799; 
   // Toggle OC1B on compare match, WGM 4 (CTC),  No prescalar, Start the timer
  TCCR1A = (1 << COM1B0); 
  TCCR1B = (1<<WGM12) | (1 << CS10); 
}

void loop() {
}

3. Arduino Timer 2 in CTC mode

  The following are Programming examples of Arduino Timer 2 in CTC mode. 

 3.1 Square Wave using CTC mode 2 on OC2A pin 

Example 1: 500KHz Square Wave using CTC Mode 2 on OC2A pin(pin 11 on Arduino)

The  following are steps to generate 500KHz square wave using CTC mode 4 on OC2A pin(pin 11 on Arduino):

1. Set OC2A(pin 11 on Arduino) as output

2. Load 15 into OCR2A register for 500KHz

3. Configure TCCR2A and TCCR2B register to toggle OC2A pin, mode 2(CTC) with No Prescalar

Program Code:

void setup () {
  // Pin 11 (OC2A) is output
  pinMode(11, OUTPUT);  
   // Load 15 to generate 500 kHz sq.wave
  OCR2A = 15;
   // Toggle OC2A on compare match, WGM 2 (CTC),  No prescalar, Start the timer
  TCCR2A = (1 << COM2A0) | (1<<WGM21); 
  TCCR2B = (1 << CS20); 
}

void loop() {
}

The following shows Fourier transform of 500KHz square wave on OC2A pin.

 3.2 Square Wave using CTC mode 2 on OC2B pin 

Example 2: 500KHz Square Wave using CTC Mode 2 on OC2B pin(pin 3 on Arduino)

 The  following are steps to generate 500KHz square wave using CTC mode 4 on OC2B pin(pin 3 on Arduino):

1. Set OC2B(pin 3 on Arduino) as output

2. Load 15 into OCR2A register for 500KHz

3. Configure TCCR2A and TCCR2B register to toggle OC2B pin, mode 2(CTC) with No Prescalar

Program Code:

void setup () {
  // Pin 3 (OC2B) is output
  pinMode(3, OUTPUT);  
   // Load 15 to generate 500 kHz sq.wave
  OCR2A = 15;
   // Toggle OC2A on compare match, WGM 2 (CTC),  No prescalar, Start the timer
  TCCR2A = (1 << COM2B0) | (1<<WGM21); 
  TCCR2B = (1 << CS20); 
}

void loop() {
}

 The following are other Timer/Counter tutorials:

- Programming ATmega328p in CTC mode

- ATmega328p Timer Programming Examples

- ATmega328P Fast PWM mode Programming Examples

Post a Comment

Previous Post Next Post