А как насчет разрыва фазы? если фаза должна быть фаза неразрывна,
то только ГУН или DDS. DDS это очень просто. //вызываем в прерывании таймера с частотой FrqDDS, чем больше тем лучше
//выходной сигнал меандр на выводе Out
#define FrqDDS (100000) //тактовая в герцах
void DDS(unsigned int GenFrq) //задание частоты в герцах, от 0 до FrqDDS/2
{
static unsigned int Faza;
Faza= Faza + GenFrq;
if(Faza>=FrqDDS) { Faza=Faza-FrqDDS;}
if(Faza>=(FrqDDS/2)) {Out=!0;} else {Out=0;}
}