Перейти к содержанию
    

генератор на МК

Есть задача: соорудить трехфазный задающий генератор со сдвигом фаз на треть периода друг относительно друга (рисунок с диаграммой прикладываю) с перспективой на большее количество фаз. Требуемый период сигнала - 25 мкс, коэф. заполнения - 0.4. Попробовал сделать на mega8(был под рукой) и уперся в то, что в лоб решить не получается - не хватает производительности. Наверное, самое простое - использовать таймер в режиме ШИМ, но их количества недостаточно и непонятно как реализовать требуемый сдвиг фаз. Может кто-нибудь сталкивался с подобной задачей и какие могут быть решения? Или надо просто брать МК мощнее? Спасибо

 

post-4239-1141027654_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть задача: соорудить трехфазный задающий генератор со сдвигом фаз на треть периода друг относительно друга (рисунок с диаграммой прикладываю) с перспективой на большее количество фаз. Требуемый период сигнала - 25 мкс, коэф. заполнения - 0.4. Попробовал сделать на mega8(был под рукой) и уперся в то, что в лоб решить не получается - не хватает производительности. Наверное, самое простое - использовать таймер в режиме ШИМ, но их количества недостаточно и непонятно как реализовать требуемый сдвиг фаз. Может кто-нибудь сталкивался с подобной задачей и какие могут быть решения? Или надо просто брать МК мощнее? Спасибо

 

 

здесь таймер не подходит, да и не нужен он.. C сразу отметается как средство программирования. Использовать только асм и учитывать длительность команд. Коэффициен заполнения в моем примере равен 0.33, думаю вы по аналогии сделаете требуемый. Imho самое сложное в этой задаче будет подборка кварца :)

 

.def AL = R24

.equ Phase0 = 1
.equ Phase1 = 2
.equ Phase2 = 4

.org 0
   ldi  AL,  $FF
   out DDRB, AL

PhaseShiftLoop:
   ldi  AL, Phase0
   out  PortB, AL
   nop
   nop
// столько раз пишем nop сколько требуется для обеспечения задержки в 25/3 мкс - Tout - Tldi
   ldi  AL, Phase1
   out  PortB, AL
   nop
   nop
// столько раз пишем nop сколько требуется для обеспечения задержки в 25/3 мкс - Tout - Tldi
   ldi  AL, Phase2
   out  PortB, AL
   nop
   nop 
// столько раз пишем nop сколько требуется для обеспечения задержки в 25/3 мкс - Tout - Trjmp - Tldi
   rjmp PhaseShiftLoop

Изменено пользователем defunct

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы попробовал ATMega 48 (88) (168) частота до 20 МГц и у каждого таймера 2 независимых ШИМ.

Должно получиться, причем, в фоновом режиме (полностью аппаратно). Так, что останется еще процессорное время для других задачек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы попробовал ATMega 48 (88) (168) частота до 20 МГц и у каждого таймера 2 независимых ШИМ.

Должно получиться, причем, в фоновом режиме (полностью аппаратно). Так, что останется еще процессорное время для других задачек.

 

А я бы взял Tiny25 - такировать от кварца 2 ноги, 3 ноги - выходы генератора, 2 питания, и 1 - Reset. Как раз все 8 ног.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

поставь кварц допустим на 16МГц, получим 400 тактов на период, нормально для построения такой схемы:

1) прерывание от таймера (сброс по совпадению)

2) зашли в прерывания дернули 1 ногу установили счетчик на подсчет одной трети фазы

3) зашли в прерывания дернули 2 ногу установили счетчик на подсчет одной трети фазы

4) зашли в прерывания дернули 3 ногу установили счетчик на подсчет одной трети фазы

.. и т.д

 

P/S Смотри устроит ли тебя точноть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

поставь кварц допустим на 16МГц, получим 400 тактов на период, нормально для построения такой схемы:

1) прерывание от таймера (сброс по совпадению)

2) зашли в прерывания дернули 1 ногу установили счетчик на подсчет одной трети фазы

3) зашли в прерывания дернули 2 ногу установили счетчик на подсчет одной трети фазы

4) зашли в прерывания дернули 3 ногу установили счетчик на подсчет одной трети фазы

 

А c коэффициентом заполнения как быть в таком случае?

и зачем ганять все это дело на 16Mhz когда тут возможно и 0.5-1Mhz хватит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Необходимо сосчитать количество различных изменений состояния диаграммы (+1) приходящийся на действие трех сигналов. Этот интервал и будет являтся для системы общей фазой которую необходимо повторять периодически. Далее этот период должен быть разбит на равное количество интервалов, где один интервал есть минимальное расстояние изменения одного состояния до другого. Далее эти значения (код состояний - три бита, это получается вроде кода Грея) последовательно занести в массив и по прерыванию выводить значение порядкового индекса массива в порт. Для этих целей вполне хватит скорости для ATmega8 на 16 MHz.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"C сразу отметается как средство программирования. Использовать только асм и учитывать длительность команд."

 

А Можно узнать почему? Просто у меня будет стоять скоро похожая задача...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А Можно узнать почему? Просто у меня будет стоять скоро похожая задача...

 

Во первых из-за простоты задачи.

Во вторых из-за того, что на Асм'е можно без проблем задать требуемую задержку с точностью до такта процессора. Ну и в третьих - возможность решения задачи на более дешевом МК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А Можно узнать почему? Просто у меня будет стоять скоро похожая задача...

 

Во первых из-за простоты задачи.

Во вторых из-за того, что на Асм'е можно без проблем задать требуемую задержку с точностью до такта процессора. Ну и в третьих - возможность решения задачи на более дешевом МК.

На 'C' IAR это тоже делаеться! Так что нет никакого особого преимущества... (просто учите язык 'C'). :)

Задержки здесь не нужны. Необходимо работать по прерываниям от тайтера соответственно выбрав кварц для расчетной частоты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А Можно узнать почему? Просто у меня будет стоять скоро похожая задача...

 

Во первых из-за простоты задачи.

Во вторых из-за того, что на Асм'е можно без проблем задать требуемую задержку с точностью до такта процессора. Ну и в третьих - возможность решения задачи на более дешевом МК.

На 'C' IAR это тоже делаеться! Так что нет никакого особого преимущества... (просто учите язык 'C'). :)

Задержки здесь не нужны. Необходимо работать по прерываниям от тайтера соответственно выбрав кварц для расчетной частоты.

 

Прежде всего большое спасибо откликнувшемся. :)

 

Боюсь, что прерывания от таймера в данном случае использовать затруднительно, т.к. из диаграммы получается, что минимальный отрезок времени между соседними состояниями = 10 мксек - 8.33 мксек = 1,67 мксек, и на частоте 16 МГц от начала одного прерывания до начала следующего приходится ~26 тактов, попробовал смоделировать в протеусе - нужный промежуток получается больше(BVU, я правильно понял, что в прерывании нужно менять значение счетчика таймера для отсчета следующего отрезка времени ?).

 

Решил попробовать совет от BVU в реализации от defunct. думаю, что получится достаточно гибкое и точное решение. вот только придется поразбираться с асмом и AVR Studio, а то я только с ICCAVR знаком и вставки на асме не пробовал делать :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я правильно понял, что в прерывании нужно менять значение счетчика таймера для отсчета следующего отрезка времени ?.

Совершенно верно, это самособой подразумевающиеся вещи. Счетчик инкрементируется и переходит опять в ноль по достижению реализации последнего состояния, и т.д. (и повториться все, как в старь: ...аптека, улица, фонарь :) ). Как в закольцованном буфере.

А чисто для эксперимента попробуйте разогнать Atmega8 на 24 MHz... должно получиться (оговорюсь, но не для серийного производства и не для эксплуатации в экстремальных условиях окружающей среды).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Совершенно верно, это самособой подразумевающиеся вещи. Счетчик инкрементируется и переходит опять в ноль по достижению реализации последнего состояния, и т.д. (и повториться все, как в старь: ...аптека, улица, фонарь :) ). Как в закольцованном буфере.

А чисто для эксперимента попробуйте разогнать Atmega8 на 24 MHz... должно получиться (оговорюсь, но не для серийного производства и не для эксплуатации в экстремальных условиях окружающей среды).

Гм.. а о том что есть такой флажек как CTC1 Вы забыли? И о том что таймер может работать в режиме Output Compare - видимо тоже. Но поверте, в данном случае таймер неуместен, более внимательно посмотрите на диаграммы сигнала в посте автора. И для чего разгонять проц, если на 1Mhz с хвостиком задача автора решается.

 

PS: Я не противник Cи, напротив - ярый сторонник, но в данном конкретном случае C действительно неуместен. И наверное, я бы для реализции этой задачи брал бы PIC, чтобы AVR не позорить. :)

Вопрос только что будет дешевле, вот смотрю по прайсам и удивляюсь Tiny13/25 стоят дешевле чем PIC12F629/675... Или MicroChip издевается или дела у него совсем плохо идут?!

Изменено пользователем defunct

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хорошо, можно поступить по другому. Использовать внешнее прерывание от генератора коротких импульсов. Но работать по прерываниям всегда выгодней, чем пользоваться программной задержкой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хорошо, можно поступить по другому. Использовать внешнее прерывание от генератора коротких импульсов. Но работать по прерываниям всегда выгодней, чем пользоваться программной задержкой.

Особенно когда "вдруг" окажется, что надо делать ещё какую-нибудь, пусть даже очень маленькую работу. Что-то вроде плавной регулировки частоты или её предустановки по UART.

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

А если этого и не потребуется то какая разница, ведь и так всё будет работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...