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

Можно ли как-то настроить TCCR1A, чтобы управлять Н-мостом с разной частотой и ШИМом

Всем привет,

 

хочется иметь на двух ножках 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

 

но я не понимаю как это реализовать...

 

Спасибо

 

ИИВ

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


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

поставьте драйвер сразу со встроенным Dead-time. например IR2184 - подаете на него меандр (1 сигнал!) и имеете управление полумостом раздельно для верхнего и нижнего транзисторов с мертвым промежутком.

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


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

поставьте драйвер сразу со встроенным Dead-time. например IR2184 - подаете на него меандр (1 сигнал!) и имеете управление полумостом раздельно для верхнего и нижнего транзисторов с мертвым промежутком.

Спасибо за ответ, конечно так-то понятно, но не хотелось бы, а так можно и вторую Атмегу поставить. Хотелось все внутри одного процессора уместить. Тем более, что хотелось слегка менять дед-тайм, так в пределах 0-30% от длительности включенной половинки моста, от этого в моей схеме тоже много зависит...

 

 

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


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

Насколько помню, у этой меги таких зазоров нет, а вот у tiny26 есть.

Вполне возможно, что есть и у новых Мег, сделанных для моторов.

А зазор "слегка" до 30% - это целый ШИМ! Может среди пол-десятка

ШИМ-режимов что то и подойдет - кто ж лучше Вас читая DS это определит

для такой "моей схемы"!

 

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


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

Если режима такого в таймере нет, похоже дальше обсуждать нечего, иначе тема обсуждения куда-то от вопроса уйдет... Поставлю вторую атмегу - все решится. На ней, при правильном написании нескольких функций и min(t1,t2)>1, max(t1,t2)>4 я таки с точностью до одного такта то, что мне надо получал, только в этот момент атмега больше ничего не могла делать...

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


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

хочется иметь на двух ножках Atmega328p сигналы для управления полным мостом

Для этого надо воспользоваться микросхемой ATmega32/64M1

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


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

Да, настроить можно. Пример доработаете под свои нужды.

 

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;
}

 

 

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


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

Спасибо, smk, за простое и интересное решение!

 

""...Есть одна непонятка..." все, сам понял, что все должно нормально работать!!!

 

Огромное спасибо за простое и элегантное решение!!!

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


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

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;

 

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


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

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

 

я может что-то и упустил, но, как я понимаю, есть режим работы таймера, когда он считает от 0 до ICR1 и потом вниз, режим как раз задается по WGM=10. Мы включаем первый канал когда значение таймера больше OCR1A, и выключаем второй канал, когда значение таймера меньше OCR1B. В этом случае, длина паузы должна быть OCR1B-OCR1A и будет одинакова в обоих случаях, а длина включенного состояния первого канала будет составлять (ICR1-OCR1A)*2, а длина включенного состояния второго канала будет составлять (ICR1-OCR1B)*2.

 

Может для решения этой задачи что-то с COM?A? или COM?B? не так? Я в железе еще не проверял, не успел, да и осцилла свободного под рукой нет, а симулятора нет подавно, так как все в ардуиновской оболочке под линуксом пишу.

 

Если я со своими утверждениями ошибся, поправьте, меня, пожалуйста!

 

Во-вторых...

согласен

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


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

Все работает как надо. Проверено в железе. Если хотите поиграться по-быстрому, то Протеус симулирует правильно. У меня Мега48 работает там правильно, в реальности тоже без проблем. Описанная ситуация перекрывается тем, что в момент 0 один вывод сбрасывается в ноль, а другой в единицу (Clr и Set), но они и до того находятся в этом состоянии и должны в нем находится и далее.

 

С

 

Смена состояний происходит посредине между минимумом и максимумом.

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


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

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

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

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

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

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

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

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

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

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