Jump to content

    
Sign in to follow this  
iiv

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

Recommended Posts

Всем привет,

 

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

 

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

 

Спасибо

 

ИИВ

Share this post


Link to post
Share on other sites

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

Share this post


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

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

 

 

Share this post


Link to post
Share on other sites

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

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

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

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
хочется иметь на двух ножках Atmega328p сигналы для управления полным мостом

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

Share this post


Link to post
Share on other sites

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

 

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

 

 

Share this post


Link to post
Share on other sites

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

 

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

 

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

Share this post


Link to post
Share on other sites
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;

 

Share this post


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

 

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

 

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

 

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

 

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

согласен

Share this post


Link to post
Share on other sites

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

 

С

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this