Menu

Adskeeper - header widge

728x90

Search This Blog

468x60

Navbar

AdsKeeper - IAB Display Standard Ad Unit

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

Adskeep- Standard Ads

Electronics and Programming Tutorials

336x280

DIY Electronic Projects And Instruments

AdsKeeper - 2091654

Labels

23K256 (1) 24C16B (2) 25AA010A (2) 8051 (7) 93AA46B (1) ADC (40) Analog Comparator (1) Arduino (16) ARM (32) AT89C52 (7) ATMega32 (59) ATMega644P (27) AVR (88) AVR PCB (2) Bootloader (1) CCS PICC (31) Change Notify Interrupt (CNI) (2) DAC (2) DHT11 (5) Display (157) Distance Sensor (3) dot matrix (1) ds1307 (10) DS18B20 (6) ds3231 (2) ds3232 (2) dsPIC (16) dsPIC30F1010 (3) dsPIC30F2010 (15) EEPROM (5) Environment Sensor (6) ESP32 (1) esp8266 (1) Graphical LCD (3) HD44780 (12) I2C (40) ILI9341 (1) Input/Output (84) Interrupt (22) IoT PCB (1) Keil (5) Keypad (16) KS0108 (3) LCD (87) LM35 (4) Master/Slave (2) MAX7221 (1) MCP23017 (8) MCP23S17 (7) MCP4921 (1) MCP4922 (2) Meter (3) MikroC (2) MikroC ARM (1) MikroC dsPIC (11) MikroC PIC (1) Module PCB (2) Motor (15) MPLABX (73) Nokia 5110 LCD (5) OLED (2) One-Wire (7) Oscillator (8) PCB (13) PCD8544 (3) PCF8574 (13) PIC (121) PIC12F (3) PIC16 (105) PIC16F628A (3) PIC16F630 (2) PIC16F716 (4) PIC16F818 (11) PIC16F818/819 (3) PIC16F84A (16) PIC16F876A (2) PIC16F877A (9) PIC16F88 (2) PIC16F887 (60) PIC18 (19) PIC18F1220 (5) PIC18F2550 (5) PIC18F4550 (13) PICKit2 (1) PICMicro PCB (4) Pin Change Interrupt (1) PLL (1) PWM (12) RTC (13) SBN0064G (1) Sensor (15) SH1106 (3) Shift Register (15) Shift Registers (19) SN74HC595N (9) Software SPI (1) Software TWI (3) SPI (44) sprinf (3) ST7735 (1) STM32 (29) STM32 Black Pill (1) STM32 Blue Pill (12) STM32 HAL (23) STM32CubeIDE (32) STM32F103C8T6 (9) STM32F103R6 (18) STM32F401CCU6 (1) SysTick (7) temperature sensor (15) TFT (1) TG12864A (1) Thermometer (22) Timer/Counter (32) TM1637 (2) twi (10) UART (11) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (96)