iiv 29 13 декабря, 2011 Опубликовано 13 декабря, 2011 · Жалоба Всем привет, хочется иметь на двух ножках Atmega328p сигналы для управления полным мостом вида Время | 1-ая нога | 2-ая нога (0,t1) | 0 | 0 (t1,t2+t1) | 1 | 0 (t2+t1,t2+2*t1) | 0 | 0 (t2+2*t1,2*t2+2*t1) | 0 | 1 и так далее, причем чтобы задавать t1, t2 в виде числа тактов и в это же время заниматься чем-то другим. Так как мне и t1, и t2 надо менять довольно в больших пределах примерно около 500-1000 раз в секунду, очень хотелось организовать все это на чем-то хардверном. Значения t1 и t2 могут колебаться в диапазоне от 1 до 2000, то есть частоты варьируются с 2кГц до 2МГц. Софтверно знаю как, но не хочу, так как процессор должен в это же время делать много другой работы. Могу сделать почти так, но без первого или третьего шага, то есть Время | 1-ая нога | 2-ая нога (0,t2) | 1 | 1 (t2,t2+t1) | 1 | 0 (t2+t1,2*t2+t1) | 0 | 0 а так как драйверы моста у меня можно хоть инвертирующие, хоть не инвертирующие поставить, то получается, что это эквивалентно Время | 1-ая нога | 2-ая нога (0,t2) | 0 | 1 (t2,t2+t1) | 0 | 0 (t2+t1,2*t2+t1) | 1 | 0 но, хочется именно так, как я написал вначале. Может есть правильные установки регистра TCCR1A и я что-то пропустил, вдруг кто-то знает, пожалуйста, подскажите! PS: забыл добавить, что меня устроило бы даже такое Время | 1-ая нога | 2-ая нога (0,t1) | 0 | 0 (t1,t2+t1) | 1 | 0 (t2+t1,t2+2*t1) | 1 | 1 (t2+2*t1,2*t2+2*t1) | 0 | 1 но я не понимаю как это реализовать... Спасибо ИИВ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 1 13 декабря, 2011 Опубликовано 13 декабря, 2011 · Жалоба поставьте драйвер сразу со встроенным Dead-time. например IR2184 - подаете на него меандр (1 сигнал!) и имеете управление полумостом раздельно для верхнего и нижнего транзисторов с мертвым промежутком. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 29 13 декабря, 2011 Опубликовано 13 декабря, 2011 · Жалоба поставьте драйвер сразу со встроенным Dead-time. например IR2184 - подаете на него меандр (1 сигнал!) и имеете управление полумостом раздельно для верхнего и нижнего транзисторов с мертвым промежутком. Спасибо за ответ, конечно так-то понятно, но не хотелось бы, а так можно и вторую Атмегу поставить. Хотелось все внутри одного процессора уместить. Тем более, что хотелось слегка менять дед-тайм, так в пределах 0-30% от длительности включенной половинки моста, от этого в моей схеме тоже много зависит... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
usav 0 13 декабря, 2011 Опубликовано 13 декабря, 2011 · Жалоба Насколько помню, у этой меги таких зазоров нет, а вот у tiny26 есть. Вполне возможно, что есть и у новых Мег, сделанных для моторов. А зазор "слегка" до 30% - это целый ШИМ! Может среди пол-десятка ШИМ-режимов что то и подойдет - кто ж лучше Вас читая DS это определит для такой "моей схемы"! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 29 13 декабря, 2011 Опубликовано 13 декабря, 2011 · Жалоба Если режима такого в таймере нет, похоже дальше обсуждать нечего, иначе тема обсуждения куда-то от вопроса уйдет... Поставлю вторую атмегу - все решится. На ней, при правильном написании нескольких функций и min(t1,t2)>1, max(t1,t2)>4 я таки с точностью до одного такта то, что мне надо получал, только в этот момент атмега больше ничего не могла делать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 13 декабря, 2011 Опубликовано 13 декабря, 2011 · Жалоба хочется иметь на двух ножках Atmega328p сигналы для управления полным мостом Для этого надо воспользоваться микросхемой ATmega32/64M1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 13 декабря, 2011 Опубликовано 13 декабря, 2011 · Жалоба Да, настроить можно. Пример доработаете под свои нужды. void TIMER1_INIT(void) { TCCR1B=(1<<WGM13)|(1<<CS10); TCCR1A=(1<<COM1B0)|(1<<COM1B1)|(1<<COM1A1)|(1<<WGM11); OCR1BH=0x00; OCR1BL=118;//65 OCR1AH=0x00; OCR1AL=115;//98 ICR1H=0x00; ICR1L=233; TCNT1H=0; TCNT1L=0; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 29 13 декабря, 2011 Опубликовано 13 декабря, 2011 · Жалоба Спасибо, smk, за простое и интересное решение! ""...Есть одна непонятка..." все, сам понял, что все должно нормально работать!!! Огромное спасибо за простое и элегантное решение!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 14 декабря, 2011 Опубликовано 14 декабря, 2011 · Жалоба void TIMER1_INIT(void) { TCCR1B=(1<<WGM13)|(1<<CS10); TCCR1A=(1<<COM1B0)|(1<<COM1B1)|(1<<COM1A1)|(1<<WGM11); OCR1BH=0x00; OCR1BL=118;//65 OCR1AH=0x00; OCR1AL=115;//98 ICR1H=0x00; ICR1L=233; TCNT1H=0; TCNT1L=0; } Во-первых, регулируемая пауза здесь будет только при одном переходе, при втором (сбросе счетчика по достижении ICR1) оба выхода поменяют свое состояние одновременно. Во-вторых, все 16-битные счетчики имеют "16-битное" имя и вместо того, чтобы писать: ICR1H=0x00; ICR1L=233; достаточо написать ICR1=233; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 29 14 декабря, 2011 Опубликовано 14 декабря, 2011 · Жалоба Во-первых, регулируемая пауза здесь будет только при одном переходе, при втором (сбросе счетчика по достижении ICR1) оба выхода поменяют свое состояние одновременно. я может что-то и упустил, но, как я понимаю, есть режим работы таймера, когда он считает от 0 до ICR1 и потом вниз, режим как раз задается по WGM=10. Мы включаем первый канал когда значение таймера больше OCR1A, и выключаем второй канал, когда значение таймера меньше OCR1B. В этом случае, длина паузы должна быть OCR1B-OCR1A и будет одинакова в обоих случаях, а длина включенного состояния первого канала будет составлять (ICR1-OCR1A)*2, а длина включенного состояния второго канала будет составлять (ICR1-OCR1B)*2. Может для решения этой задачи что-то с COM?A? или COM?B? не так? Я в железе еще не проверял, не успел, да и осцилла свободного под рукой нет, а симулятора нет подавно, так как все в ардуиновской оболочке под линуксом пишу. Если я со своими утверждениями ошибся, поправьте, меня, пожалуйста! Во-вторых... согласен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 14 декабря, 2011 Опубликовано 14 декабря, 2011 · Жалоба Все работает как надо. Проверено в железе. Если хотите поиграться по-быстрому, то Протеус симулирует правильно. У меня Мега48 работает там правильно, в реальности тоже без проблем. Описанная ситуация перекрывается тем, что в момент 0 один вывод сбрасывается в ноль, а другой в единицу (Clr и Set), но они и до того находятся в этом состоянии и должны в нем находится и далее. С Смена состояний происходит посредине между минимумом и максимумом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться