Now I asked about how you generate the samples, because chances are, unless you implemented something pretty fancy, that the noise/distortion introduced by errors in computing the samples is likely to prevail over that introduced by PWM encoding. Of course that's just something to ponder; maybe you did something fancy there in terms of sample computation.
Note that instead of pure PWM, you could implement some sigma-delta encoder instead and get better performance. You'll probably need a beefier MCU though.
At the moment I'm using PWM generator built into PIC16.
I currently do something like this in a loop (see below) - as a test. Wish I could just program the sequence - push and forget. At the end of the day, its just suppose to produce some sounds when it detects pattern of movements. Nothing fancy. But sine weave would be better.
Also, it seems like programming PWM on a chip is rather convoluted. Of course PWM is not designed to be just a signal generator. And it does not produce anything approximating sine-weave .
int pr2_initial_value=0x61;
int pr2_value=pr2_initial_value;
while (1) {
LATCbits.LATC0 = 1;
LATCbits.LATC1 = 0;
PWM1_LoadDutyValue(150);
__delay_ms(100);
LATCbits.LATC0 = 0;
LATCbits.LATC1 = 1;
PWM1_LoadDutyValue(249);
__delay_ms(100);
PR2 = pr2_value;
pr2_value--;
if (pr2_value < 0x40) {
pr2_value = pr2_initial_value;
}