Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Синхронизовать с заданной фазой два таймера Atmega328p
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
iiv
Всем привет,

есть 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;
}


все классно работает, но вот возникло желание добавить еще одну функциональность. Надо чтобы на еще одной ноге была 1 с точно той же частотой, но с отдельно заданными скважностью (PWM) и задержкой (Phase).

То есть

Код
OC1A: _----------_________
OC1B: _________----------_
XXXX: ___----____________
Phase:<->
PWM:      <->


Понятно, что если в ручную в порты битики засылать, то все можно реализовать, но тогда процессор будет занят бездарной работой, а мне хотелось бы в регистры что-то записать и наслаждаться.

Как я понимаю, мне надо каким-то образом настроить два таймера, например, 1-ый и 2-ой на одну частоту (вроде проблем нет), и засинхронизовать из так, чтобы их фазы были бы сдвинуты на нужное число тиков. У меня есть работающий код для полного моста, я могу настроить другой таймер с заданной скважностью, но не понимаю как засинхронизовать их фазы. Посоветуйте, пожалуйста, реально ли это, и если да, то как?

Спасибо

ИИВ
rx3apf
А какие проблемы ? Надо записать разные значения в регистры таймеров, учтя время выполнения команд записи. Делать это с закрытыми прерываниями. Да, но 16-битный таймер только один, а 0 и 2 - 8-битные. Если нужно 16-битный, то это уже не выйдет.
Navovvol
Доступными средствами синхронизировать их невозможно, можно только посчитать такты и наставить "nop"ы между их запуском.
iiv
Цитата(rx3apf @ Jul 10 2012, 13:47) *
А какие проблемы ? Надо записать разные значения в регистры таймеров, учтя время выполнения команд записи. Делать это с закрытыми прерываниями. Да, но 16-битный таймер только один, а 0 и 2 - 8-битные. Если нужно 16-битный, то это уже не выйдет.

спасибо за совет!

я так и ожидал, что все тактами закончится... 8 бит меня устраивает, даже для обоих таймеров, просто 1-вый таймер использовал, так как схема исторически под него разведена была и когда-то мне 8-ми бит не хватало.
domowoj
Под такую задачу заточен Tiny26
rx3apf
Цитата(Navovvol @ Jul 10 2012, 12:51) *
Доступными средствами синхронизировать их невозможно, можно только посчитать такты и наставить "nop"ы между их запуском.

nop не нужно, поскольку в данном случае прескалер не используется, а разбег времени между командами компенсируется соответствующей коррекцией записываемого значения.
iiv
Цитата(domowoj @ Jul 10 2012, 14:09) *
Под такую задачу заточен Tiny26

скажите, пожалуйста, я правильно понимаю, что процессор типа Atmega32u4 тоже такую задачу сможет решить?
Сергей Борщ
Если фаза меняться не должна, то можно записать начальные значения с нужным разбросом в счетчики таймеров и запустить таймера одновременно через GTCCR
domowoj
Цитата(iiv @ Jul 10 2012, 16:20) *
скажите, пожалуйста, я правильно понимаю, что процессор типа Atmega32u4 тоже такую задачу сможет решить?

Похоже, да. Нужно даташит вам прштудировать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.