I'm guessing you're trying to drive some AC motor that was originally designed to run on 50 Hz AC.
I'm assuming you're using two IRS2113 chips, the "left" chip controlling the two FETs connected to the "left" wire going to the motor, and the "right" chip controlling the two FETs connected to the other wire going to the motor. You probably want to check out the IRS2113 datasheet and the FET datasheet(s).
It is your responsibility to never, ever drive both HIN and LIN of the left IRS2113 chip HI at the same time -- the "self-destruct" state.
As JustJeff points out, if both HIN and LIN of the left FET driver chip are ever high at the same time, the FETs connected to it will, in effect, short the rails ("shoot through", "fuse test", etc.), and much unwanted excitement will follow.
(Never, ever drive both HIN and LIN of the right IRS2113 chip HI at the same time, either).
A few people don't use a translation circuit at all; they directly connect the left HIN and LIN and the right HIN and LIN directly to 4 independent output pins of the microcontroller, and hope that the software doesn't have any bugs that would set the FETs to the self-destruct state.
I prefer using a digital logic gate, such as the external NOT gate you mention, to enforce this "avoid the self-destruct state" condition in the motor driver hardware, rather than software.
It looks to me that the IRS2113 (like many other "high-side drivers") uses a boost circuit that can't really produce a 100% "ON" in the high-side transistor; it assumes that software will periodically turn that transistor OFF, so your software might need to limit the maximum PWM duty cycle to a maximum of something like 255 ticks HI + 1 tick LO.
bipolar
The simplest (in hardware) approach is to drive the entire H bridge/motor system in one of two basic states of the H bridge: either
State 0:
The microcontroller PWM output is LOW.
This drives the left LIN and the right HIN, turning the corresponding FETs off.
That output also drives a NOT gate which drives HI the left HIN and the right LIN,
turning those corresponding FETs ON.
This in effect connects the motor's left wire to HI and the motor's right wire to LO.
If things stay in this state long enough, the motor turns in the direction I call "forward".
State 1:
The microcontroller PWM output is HI.
This drives the left LIN and the right HIN, turning the corresponding FETs ON.
...
This in effect connects the motor's left wire to LO and the motor's right wire to HI.
If things stay in this state long enough, the motor turns in the direction I call "reverse".
With a PWM running at reasonable speeds, setting the duty cycle to 50% HI, 50% LO, you end up with the motor stationary (possibly humming a little).
This 2-state (bipolar) system is sometimes called "Locked-Antiphase". a b
trilevel
Trilevel, aka "Sign-Magnitude Drive"
Adding a third state makes things a little more complicated and difficult to debug, but it typically improves (reduces) harmonics and makes the system more power efficient.
State 3:
Some people use a third state turns off all the FETs, letting the motor freewheel.
(If you manage to turn off any 3 of the 4 transistors and leave the other one ON, that also works just as well as a freewheel state).
If things stay in this state long enough,
the motor "stops".
(In some cases, external forces spin the motor in one direction; the direction is not under the control of the electronics).
Alternate State 3:
Some people use a third state that turns on both the lower FETs, turning off both upper FETs, which slows down the motor ("brake").
(Others turn on both the upper FETs, turning off both lower FETs; that also works just as well as a "brake" state).
If things stay in this state long enough,
the motor stops.
(Even when external forces push the motor in one direction,
this "brake" generally causes the motor to stop).
There are a variety of ways to implement digital logic between the microcontroller and the FET driver that supports trilevel drive, but also avoids the self-destructive states.
(Some motor driver chips such as the IXYS IXDN404 include this anti-shoot-through direction/PWM translation circuit, but the IRS2113 does not).
Such translation circuits generally require a "direction" and a "PWM" line from the microcontroller.
The software sets the "direction" to "forward", and then adjusts the duty cycle of the PWM to control the speed from "idle" to "full speed forward".
(The two states of the PWM, in effect, are translated to the two states "State 0 forward" and "State 3 idle").
Much later, the software sets the "direction" to "reverse", and then adjusts the duty cycle of the PWM to control the speed from "idle" to "full speed reverse".
(The two states of the PWM, in effect, are translated to the two states "State 0 forward" and "State 3 idle").
Translation circuits that support tristate motor control:
a b c d e
You might think that these circuits would have 100% LO, 0% HI PWM duty cycle give "idle" (in either direction), and 0% LO, 100% HI give "full speed" (in whatever direction the "direction" line indicates).
But lots of people use a direction/PWM translation circuit that does something more confusing, and then fix it up in software.
Perhaps the simplest such circuit translation uses the PWM to drive the left LIN and a NOT gate that in turn drives the left HIN.
Another general-purpose output on the microcontroller drives the "direction" signal, which drives right LIN and a NOT gate that in turn drives the right HIN.
I know it's a bit late, but I've just got this sabe doubt. After looking around, I've come across this Microchip Doc that shows some examples.
First, we calculate \$\text{PR2}\$. From this formula,
$$ F_\text{PWM} = \dfrac{1}{(\text{PR2} + 1) \times 4 \times T_\text{OSC} \times \text{T2CKPS}} $$
we get
$$ \text{PR2} = \dfrac{1}{F_\text{PWM} \times 4 \times T_\text{OSC} \times \text{T2CKPS}} - 1 $$
where \$T_\text{OSC} = 1/F_\text{OSC}\$, and \$\text{T2CKPS}\$ is the Timer2 prescaler value (1, 4 or 16).
Therefore, if we want \$F_\text{PWM} = 20\text{kHz}\$, and choosing \$\text{T2CKPS} = 1\$, we get \$\text{PR2} = 249\$. We should choose higher values for \$\text{T2CKPS}\$ only if \$\text{PR2}\$ exceeds 8 bits (\$\text{PR2} \gt 255\$) for the given prescale.
Now we calculate the max PWM resolution for the given frequency:
$$ \text{max PWM resolution} = \log_2(\;\dfrac{F_\text{OSC}}{F_\text{PWM}}\;) $$
That gives us \$9.9658\$ bits (I know, it sounds weird, but we'll use it like that later).
Now, let's calculate the PWM duty cycle. It is specified by the 10-bit value \$\text{CCPRxL:DCxB1:DCxB0}\$, that is, \$\text{CCPRxL}\$ bits as the most significant part, and \$\text{DCxB1}\$ and \$\text{DCxB0}\$ (bits 5 and 4 of \$\text{CCPxCON}\$) the least significant bits. Let's call this value \$\text{DCxB9:DCxB0}\$, or simply \$\text{DCx}\$. (x is the CCP number)
In our case, since we have a max PWM resolution of \$9.9658\$ bits, the PWM duty cycle (that is, the value of \$\text{DCx}\$) must be a value between \$0\$ and \$2^{9.9658} - 1 = 999\$. So, if we want a duty cycle of 50%, \$\text{DCx} = 0.5 \times 999 = 499.5 \approx 500\$.
The formula given on the datasheet (also on the linked doc),
$$\text{duty cycle} = \text{DCx} \times T_\text{OSC} \times \text{T2CKPS}$$
gives us the pulse duration, in seconds. In our case, it's equal to \$25\text{ns}\$. Since \$T_\text{PWM} = 50\text{ns}\$, it's obvious that we have a 50% duty cycle.
That said, to calculate DCx in terms of duty cycle as \$r \in [0,1]\$, we do:
$$ \text{DCx} = \dfrac{r \times T_\text{PWM}}{T_\text{OSC} \times \text{T2CKPS}} = \dfrac{r \times F_\text{OSC}}{F_\text{PWM} \times \text{T2CKPS}} $$
Answering your other questions:
2) The resolution of your PWM pulse with period \$T_\text{PWM}\$ is
$$ \dfrac{T_\text{PWM}}{2^\text{max PWM res}} $$
3) Because CCPRxL, along with DCxB1 and DCxB0, determine the pulse duration. Setting CCPRxL with a higher value than \$2^\text{max PWM res} - 1\$ means a pulse duration higher than the PWM period, and therefore you'll get a flat \$V_{DD}\$ signal.
Best Answer
You can do this in software and keep track of all the required timing yourself, but most microcontrollers have hardware that can generate PWM autonomous after you initialize it. The basic things are a timer/counter and an Output Compare Register (OCR):
The counter continuously increments, represented by the slope, and is compared with the OCR. The PWM output goes low when the counter exceeds the OCR, and goes high again when it resets. The 5 % resolution you need (20 steps) is not a problem; a 16 bit timer can generate PWM with a better than 0.002 % resolution, and even an 8 bit timer can do 0.4 %.
All you have to do is program a new value in the OCR. The lower the value, the smaller the pulse width. The following animation is from this site:
Further reading
Using the AVR’s High-speed PWM, an Atmel application note.
ATMega32 datasheet describes on page 69 ff. how to use Timer0 for PWM operation.