Hay algo que no entiendo, quizá me haya levantado algo espeso.
Dices que los valores del Duty estan comprendidos entre 30 y 3, no serían como máximo entre 1 y 9 ya que el Duty según tu programa está esperando un caracter.
Otra cosa, si en el delay_ms utilizas una variable, esta como máximo puede alcanzar 255, si fuera una constante 65535. Has definido las variables per y duty como long y con int sería suficiente.
Un saludo