реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Синхронизовать с заданной фазой два таймера Atmega328p, можно ли такое реализовать
iiv
сообщение Jul 10 2012, 08:19
Сообщение #1


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Всем привет,

есть 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-ой на одну частоту (вроде проблем нет), и засинхронизовать из так, чтобы их фазы были бы сдвинуты на нужное число тиков. У меня есть работающий код для полного моста, я могу настроить другой таймер с заданной скважностью, но не понимаю как засинхронизовать их фазы. Посоветуйте, пожалуйста, реально ли это, и если да, то как?

Спасибо

ИИВ
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Jul 10 2012, 08:47
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



А какие проблемы ? Надо записать разные значения в регистры таймеров, учтя время выполнения команд записи. Делать это с закрытыми прерываниями. Да, но 16-битный таймер только один, а 0 и 2 - 8-битные. Если нужно 16-битный, то это уже не выйдет.

Сообщение отредактировал rx3apf - Jul 10 2012, 08:49
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Jul 10 2012, 08:51
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



Доступными средствами синхронизировать их невозможно, можно только посчитать такты и наставить "nop"ы между их запуском.
Go to the top of the page
 
+Quote Post
iiv
сообщение Jul 10 2012, 09:09
Сообщение #4


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



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

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

я так и ожидал, что все тактами закончится... 8 бит меня устраивает, даже для обоих таймеров, просто 1-вый таймер использовал, так как схема исторически под него разведена была и когда-то мне 8-ми бит не хватало.
Go to the top of the page
 
+Quote Post
domowoj
сообщение Jul 10 2012, 09:09
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Под такую задачу заточен Tiny26


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Jul 10 2012, 09:16
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Navovvol @ Jul 10 2012, 12:51) *
Доступными средствами синхронизировать их невозможно, можно только посчитать такты и наставить "nop"ы между их запуском.

nop не нужно, поскольку в данном случае прескалер не используется, а разбег времени между командами компенсируется соответствующей коррекцией записываемого значения.
Go to the top of the page
 
+Quote Post
iiv
сообщение Jul 10 2012, 09:20
Сообщение #7


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Цитата(domowoj @ Jul 10 2012, 14:09) *
Под такую задачу заточен Tiny26

скажите, пожалуйста, я правильно понимаю, что процессор типа Atmega32u4 тоже такую задачу сможет решить?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 10 2012, 09:28
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Если фаза меняться не должна, то можно записать начальные значения с нужным разбросом в счетчики таймеров и запустить таймера одновременно через GTCCR


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
domowoj
сообщение Jul 10 2012, 13:20
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Цитата(iiv @ Jul 10 2012, 16:20) *
скажите, пожалуйста, я правильно понимаю, что процессор типа Atmega32u4 тоже такую задачу сможет решить?

Похоже, да. Нужно даташит вам прштудировать.


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 07:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01414 секунд с 7
ELECTRONIX ©2004-2016