есть Atmega328p, на первом таймере которой реализовано управление полным мостом вот такой функцией:
Код
void SetTimer1(uint2 PlusTime, uint2 MinusTime, uint2 OffTime)
// PlusTime the total time in 1/8uS of positive current,
// MinusTime the total time in 1/8uS of negative current,
// OffTime the total time in 1/16uS of off currect between positive and negative stages
// hence the total length of the operation is PlusTime+MinusTime+OffTime
// _____<PlusTime/2>------------------------------------------------------------------<PlusTime/2+MinusTime+2*OffTime>_____
// -----------------------<PlusTime/2+OffTime>_____<PlusTime/2+OffTime+MinusTime>------------------------------------------
// Total: PlusTime+MinusTime+2*OffTime
{ if(PlusTime || MinusTime)
{ uint2 ocr1b=PlusTime+OffTime;
uint2 icr1=ocr1b+MinusTime;
OCR1A=PlusTime;
OCR1B=ocr1b;
ICR1=icr1;
} else
{ OCR1A=0;
OCR1B=0xffff;
ICR1=0xffff;
}
}
void IniTimer1()
{
TCCR1B=(1<<WGM13)|(1<<CS10);
TCCR1A=(1<<COM1A0)|(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);
SetTimer1(0, 0, 0);
TCNT1=0;
}
// PlusTime the total time in 1/8uS of positive current,
// MinusTime the total time in 1/8uS of negative current,
// OffTime the total time in 1/16uS of off currect between positive and negative stages
// hence the total length of the operation is PlusTime+MinusTime+OffTime
// _____<PlusTime/2>------------------------------------------------------------------<PlusTime/2+MinusTime+2*OffTime>_____
// -----------------------<PlusTime/2+OffTime>_____<PlusTime/2+OffTime+MinusTime>------------------------------------------
// Total: PlusTime+MinusTime+2*OffTime
{ if(PlusTime || MinusTime)
{ uint2 ocr1b=PlusTime+OffTime;
uint2 icr1=ocr1b+MinusTime;
OCR1A=PlusTime;
OCR1B=ocr1b;
ICR1=icr1;
} else
{ OCR1A=0;
OCR1B=0xffff;
ICR1=0xffff;
}
}
void IniTimer1()
{
TCCR1B=(1<<WGM13)|(1<<CS10);
TCCR1A=(1<<COM1A0)|(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);
SetTimer1(0, 0, 0);
TCNT1=0;
}
все классно работает, но вот возникло желание добавить еще одну функциональность. Надо чтобы на еще одной ноге была 1 с точно той же частотой, но с отдельно заданными скважностью (PWM) и задержкой (Phase).
То есть
Код
OC1A: _----------_________
OC1B: _________----------_
XXXX: ___----____________
Phase:<->
PWM: <->
OC1B: _________----------_
XXXX: ___----____________
Phase:<->
PWM: <->
Понятно, что если в ручную в порты битики засылать, то все можно реализовать, но тогда процессор будет занят бездарной работой, а мне хотелось бы в регистры что-то записать и наслаждаться.
Как я понимаю, мне надо каким-то образом настроить два таймера, например, 1-ый и 2-ой на одну частоту (вроде проблем нет), и засинхронизовать из так, чтобы их фазы были бы сдвинуты на нужное число тиков. У меня есть работающий код для полного моста, я могу настроить другой таймер с заданной скважностью, но не понимаю как засинхронизовать их фазы. Посоветуйте, пожалуйста, реально ли это, и если да, то как?
Спасибо
ИИВ