Можно повеситься на прерывание таймера и в отдельных переменных хранить текущее состояние шима и необходимое состояние шима. И по таймеру текущее сдвигать к необходимому.