Creating my own PWM

Lose the Serial print and it'll be more reasonable, but basically this isn't
a great way to generate PWM as you are using delay / delayMicroseconds.

You can improve matters by going over to the blinkWithoutDelay style of
coding (using micros() rather than millis()), but things like Serial will
cause issues as they wait...

This is why hardware PWM is provided in the first place, since the software
solutions are awkward and tricky.

Using timer interrupts allows the best software solution, and you might want
to see how the Servo library uses this approach.