Monday, May 25, 2020

Using phase correct PWM mode with timer/count 0 in ATMega32

Unlike fast PWM mode, the phase correct PWM mode give a higher precision of the generated waveform. In this mode the timer counting slope works two direction, lower values to higher values, and from higher values to lower values. For more detail of timing diagram, please check the device datasheet.

By setting the WGM00 of TCCR0 to '1', it will work as the phase correct PWM mode. The polarity of waveform is determined by COM01:00 bits of the TCCR0 register. By giving COM01:00 to 2, the polarity is non inverting. While giving COM01:00 to 3, the polarity is inverting output.

The PWM frequency in this mode is given by:
Using phase correct PWM mode with timer/count 0 in ATMega32
Again, N is the timer 0 prescaler. As we can see, the timer 0 counter value is 510 doubling the original maximum value of TCNT0. This give a higher resolution of PWM signal.

For example, I use a 4 MHz crystal clock with a prescaler to timer 1:1. The frequency is:
Using phase correct PWM mode with timer/count 0 in ATMega32
The period T about 128 micro seconds.

Now let do a C coding:

#include <avr/io.h>
int main(void)
{   
 //set the duty cycle to about 75%
 OCR0=191;
 //set PB3 to output
 DDRB|=(1<<3);
 /*
 Set phase correct PWM mode with non 
 inverting output
 */
 TCCR0|=(1<<COM01)|(1<<WGM00);
 //select 1:1 prescaler
 TCCR0|=(1<<CS00);
    while (1) 
    {
    }
}

Now let verify the result in the simulation, because I don't have a real oscilloscope.

Using phase correct PWM mode with timer/count 0 in ATMega32
Simulation screen shot.
The PWM output is 7.81 kHz with a 75% duty cycle

 Back to main tutorial page ATMega32 tutorials in C with Atmel Studio 7.





No comments:

Post a Comment

Search This Blog

Labels

25AA010A (1) 8051 (7) 93AA46B (1) ADC (30) Analog Comparator (1) Arduino (15) ARM (6) AT89C52 (7) ATMega32 (56) AVR (57) CCS PICC (28) DAC (1) DHT11 (2) Display (105) Distance Sensor (3) DS18B20 (3) dsPIC (2) dsPIC30F1010 (2) EEPROM (5) Environment Sensor (4) esp8266 (1) I2C (29) Input/Output (67) Interrupt (19) Keil (5) Keypad (10) LCD (47) Master/Slave (1) MAX7221 (1) MCP23017 (5) MCP23S17 (4) Meter (3) MikroC (2) Motor (15) MPLABX (71) Nokia 5110 LCD (3) OLED (2) One-Wire (6) Oscillator (8) PCB (6) PCD8544 (3) PCF8574 (5) PIC (107) PIC12F (2) PIC16F628A (2) PIC16F630 (1) PIC16F716 (3) PIC16F818 (10) PIC16F818/819 (2) PIC16F84A (15) PIC16F876A (1) PIC16F877A (9) PIC16F88 (1) PIC16F887 (60) PIC18 (19) PIC18F1220 (4) PIC18F2550 (3) PIC18F4550 (12) PWM (11) RTC (8) Sensor (10) SH1106 (1) Shift Register (11) Shift Registers (3) SPI (24) STM32 (6) STM32 Blue Pill (6) STM32CubeIDE (6) STM32F103C8T6 (6) SysTick (3) temperature sensor (11) Thermometer (21) Timer/Counter (31) TM1637 (2) UART (7) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (94)