Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Управление полумостом выходами таймера
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
smk
Есть такой код инициализации таймера в Mega48:
Код
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0; //setup
TCNT1L = 0;
OCR1AH = 0x03;
OCR1AL = 0x6D;
OCR1BH = 0;
OCR1BL = 1;
ICR1H  = 0x03;
ICR1L  = 0x6D;
TCCR1A = 0x50;
TCCR1B = 0x19; //start Time
}

Таймер инвертрует свои выходы при совпадении. Смысл - переключать плечи полумоста выходами таймера. Полумост незначительной мощности (2 Вт). Собственно вопрос в том как отследить сам момент переключения и посмотреть на предмет сквозного тока. Драйвер не советовать - питание 2 В, а они от 10 В. Можно ли как-то в студии посмотреть состояния выходов после каждого тактового тика? Спасибо.
Duhas
вводите мертвое время.. как вам удобнее... либо в железе, либо дергайте пины в прерывании.. имхо других вариантов и быть не может..
_Pasha
Цитата(Duhas @ Dec 31 2009, 17:20) *
вводите мертвое время.. как вам удобнее... либо в железе, либо дергайте пины в прерывании.. имхо других вариантов и быть не может..

Для симметричного шима (phase correct) не стесняясь уменьшал один из выходов на число попугаев, соответствующий мертвому времени. Получал то, что надо. Т.е. это было так
Код
// выходной параметр value_out
{ uint16_t value_L,value_H;
value_H=value_L=value_out;
//теперь двустороннее ограничение
if(value_H < VALUE_MIN) value_H = VALUE_MIN;
if(value_H > VALUE_MAX) value_H = VALUE_MAX;
if(value_L < VALUE_MIN) value_L = VALUE_MIN;
if(value_L > VALUE_MAX) value_L = VALUE_MAX;
// и только затем вычел дедтайм
value_H -= DEADTIME;
OCR1A = value_L;
OCR1B = value_H;
}

Кстати, phase correct вроде как правильно симулировался. (емнип)
А нафига студия? Попробуйте протеусом...
Dx!
В этом смысле приятно удивил чип ATMega32U4 - у него есть "быстрый" (до 64MHz с PLL) 10тибитный таймер, выходы OC которого сделаны парами с железной выдержкой деадтайма...
smk
Цитата
Попробуйте протеусом...


Я в него не верю. Как-то не производит впечатление серьезного продукта.

На счет идеи не совсем пойму как выбирались значения MIN и MAX и почему они менялись по ходу? Прниведенный код обрабатывался в прерывании или в каком месте?
Stanislav_S
Как то однажды делал так, ЕМНИП при кварце 16Мгц плучалось около 200 кгц на выходе, естественно используются выходы таймера, удобно получилось и прерывания не надо обрабатывать.
Код
/*Используется для формирования сигналов управления для преобразователя*/
void TIMER1_INIT(void)
{
  TCCR1B=(1<<WGM13)|(1<<CS10);
  TCCR1A=(1<<COM1B0)|(1<<COM1B1)|(1<<COM1A1)|(1<<WGM11);
  OCR1BH=0x00;
  OCR1BL=0x14;
  OCR1AH=0x00;
  OCR1AL=0x10;
  ICR1H=0;
  ICR1L=0x24;
  TCNT1H=0;
  TCNT1L=0;
}
smk
Спасибо, Stanislav_S ! Так и поступил. Очень хорошее решение.
acorn
2Вт? 2В? Автор, не парьтесь с мертвым временем, соедините затворы полевиков вместе и на один выход ОЦР таймера. Второй освободится. Всё будет работать.
Если транзисторы в полумосте разной структуры и это FET-ы, разумеется.
oran-be
У выходов ШИМ в АВР есть косяк - если записать в регистр сравнения 0, то на выходе ШИМ все равно будут присутствовать короткие импульсы, что приводит к появлению сквозного тока в мосту (полумосту). Поэтому надо отслеживать софтово 0 в регистре сравнения и в этом случае переконфигурировать пин тупо на вывод. Косяк был обнаружен мною при разработке однфазного инвертора на асинхронный двигатель на Меге8 после того, как "ушли" 2 пары полевиков. После написания патча девайс начал работать, как задумывалось.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.