ШИМ, мёртвая зона

aice
Offline
Зарегистрирован: 14.12.2014

Использую такой код:

int _gtv1 = 192;
int _gtv2 = 192;
void setup()
{
}
void loop()
{
analogWrite(5, _gtv1);
analogWrite(6, _gtv2);
}

каким способом можно выполнить задержку (мёртвую зону) второго шим, что б было как на 2 графике?

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

 

axill
Offline
Зарегистрирован: 05.09.2011

на русском напишите что вы хотите. что значит мертвая зона?

aice
Offline
Зарегистрирован: 14.12.2014

ммм... чтоб 2 шим шел с отставанием от 1 на определённое время. сделать таким способом сдвиг фазы на n%

axill
Offline
Зарегистрирован: 05.09.2011

нужно чтобы это именно ШИМ был или же вам нужно сформировать два сигнала какой-то предопределенной формы?

если нужен ШИМ то как вариант первый ШИМ оставить апаратным, настроить прерывание по совпадению (оно срабатывает тогда когда выход ШИМ меняете статус) и в этом прерывании програмно управлять вторым ШИМ

aice
Offline
Зарегистрирован: 14.12.2014

нужен именно два шим с сдвигом на 180% или  как то организовать пропуск через 1 - на пример чтоб получилось так:

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

зачем, что за устройство ? и какая частота ШИМ нужна ?

aice
Offline
Зарегистрирован: 14.12.2014

31 кГц, пока только эксперементирую, приблуда для замены управляющих микросхем в Импульсных Бп

tpg_k156
Offline
Зарегистрирован: 03.10.2012

Мутите мостовое включение и надо, чтобы плечи не были открыты одновременно?:)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вот это зря. совсем зря. такие вещи лучше заменять на аналогичные как минимум. а то горелые дорожки и детали за долю секунды как нефиг делать

tl494 посмотри

axill
Offline
Зарегистрирован: 05.09.2011

скважность вы собираетесь менять? в каких пределах надо менять скважность?

можно инвертировать второй канал и выставлять ему скважность со сдвигом

aice
Offline
Зарегистрирован: 14.12.2014

скважность, а точнее заполнение шим буду менять от 0 до 49% на обоих чтоб не были открыты одновременно

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

а можно ли просто 2 шим запустить со сдвигом на 1 таймере ? 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

выход ШИМ_1 на пин 2 или 3 , по rising определить длительность HIGH ШИМ_1

на любом пине формировать HIGH ШИМ_2 с задержкой 16129 микросек от rising HIGH ШИМ_1 на длительность HIGH ШИМ_1

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

или - выход ШИМ_1 на пин 2 И 3 , один обработчик по rising , второй по fall - в каждом обработчике задержка на 16 миллисек и установка пина ШИМ_2 в HIGH и LOW

но лучше задействовать счётчик под ШИМ_2

axill
Offline
Зарегистрирован: 05.09.2011

У мега328 три таймера у каждого по два канала ШИМ. Но все три таймера тактируются от одного генератора, так что если их настраивать на одну частоту то сдвига не получится. А чем не устраивает вариант с инвертированием? Получится два канала в противофазе, достаточно выставлять скважность у второго канала со сдвигом

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

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

axill пишет:

У мега328 три таймера у каждого по два канала ШИМ. Но все три таймера тактируются от одного генератора, так что если их настраивать на одну частоту то сдвига не получится. А чем не устраивает вариант с инвертированием? Получится два канала в противофазе, достаточно выставлять скважность у второго канала со сдвигом

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

фронты будут без просвета, и сдвиг на 180 будет только при Q=50, в остальных случаях T HIGH ШИМ_2 не будет соответствовать T HIGH ШИМ_1

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

OCn1 и /OCn2 - скважность 10 и 90.... а как они будут синхронизированы ?

aice
Offline
Зарегистрирован: 14.12.2014

нарыл в просторах интернета на англоязычном сайте:

Для реализации этой идеи был выбран 8-битный микроконтроллер фирмы Atmel, позволяющий наиболее просто организовать 4 согласованных канала широтно-импульсной модуляции (ШИМ). Каждый канал ШИМ управляет яркостью одной из 4 цифр. В микроконтроллере имеются 2 таймера, каждый формирующий по 2 канала ШИМ. Принцип формирования 4-канальной согласованной ШИМ показан на рисунках.

 

Наклонные линии на верхних диаграммах представляют значения счетчиков таймеров. Горизонтальные штрих-пунктирные линии соответствуют порогам срабатывания цифровых компараторов-формирователей ШИМ, устанавливаемым в регистрах OCRxA и OCRxB таймеров. Если эти пороги установить симметрично относительно среднего значения счетчика таймера (см. левый рисунок), то скважность импульсов ШИМ в обоих каналах таймера (а, значит и яркость соответствующих цифр) получится одинаковой. Для исключения временного пересечения импульсов ШИМ значение нижнего порога не должно превосходить 127, а значение верхнего порога быть не менее 128 (и не более 255). Таким образом получается ШИМ с 7-битным разрешением.

 

 

как бы это организовать а меге? Там есть и готовый код, но я в нем ничего не понял так как на програмист http://mcs.uwsuper.edu/sb/Electronics/HugeLED/

Пишут: "Реализовал на одном 16 битном таймере. Выбрал ШИМ с фазовой корекцией, вершину счета задал в регистре ICR1 скважность регистрами OCR1A, OCR1B."

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а разве неинвертированный шим по одному каналу до 127 и инвертировнный  от 128 до 255 не будет то что нужно?

просто в первом 0>>127 это увеличение шим, а во втором будет 255>>128 увеличение (просто использовал такие значки. это не сдвиг)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

левая картинка в #16 - то что нужно, вот только один счётчик может выдать или прямую или инверсную ШИМ....

можно так - выделить под это один из счётчиков, настроить режим счёта как на той картинке, в каждом периоде перезаписывать пороги срабатывания цифровых компараторов-формирователей ( формирователь не нужен ! ) , по срабатыванию совпадения формировать на 2-ух других пинах псевдоШИМ...

пороги должны быть симметричны относительно 32767 для ST_16 и 128 для ST_16для ST_8

axill
Offline
Зарегистрирован: 05.09.2011

SU-27-16 пишет:

фронты будут без просвета, и сдвиг на 180 будет только при Q=50, в остальных случаях T HIGH ШИМ_2 не будет соответствовать T HIGH ШИМ_1

если скважность задать с просветом, будут с просветом. У каждого канала своя скважность

axill
Offline
Зарегистрирован: 05.09.2011

 

SU-27-16 пишет:

фронты будут без просвета, и сдвиг на 180 будет только при Q=50, в остальных случаях T HIGH ШИМ_2 не будет соответствовать T HIGH ШИМ_1

если скважность задать с просветом, конец первого и начало второго будут с просветом. У каждого канала своя скважность. Между концом второго и началом первого просвета не будет, но ТС про эту часть никаких требований не высказывал. Он явно что-то скрывает) Вообще не очень благодарное задание пытаться помочь человеку который скрывает конечную цель. Это как помогать ему выйти из темной комнаты когда ты сам не знаешь где выход

 

aice
Offline
Зарегистрирован: 14.12.2014

Я ни чего не скрываю =). Цель - выполнить на меге функции tl494 =), иметь возможность менять скважность и частоту ~10кГц, ~32кГц 

Заранее Спасибо За Помощь)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

не получится на одном счётчике разную скважность и чтобы ещё сдвиг на 180 был :(

ТС нужно две последовательности импульсов F=31kHz , скважность 1....49 - и самое главное - чтобы хиги первого канала были посередине ловов второго , и наоборот.... 

ТС , так ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

в ЧипеДипе она - 33 р. - стоит ли заморачивацца ? или дело прЫнцЫпа ?

aice
Offline
Зарегистрирован: 14.12.2014

Почти :

F=31kHz желательна, но подойдёт и в 2 раза меньше

заполнение шим 0-127

и самое главное - чтобы хиги первого канала были посередине ловов второго , и наоборот.... да)

SU-27-16 дело принципа)  временно сделал на "ка3511" , но хочу чтоб это делал контроллер. Тут пол форума а то и более таких). А то уже б давно купил бы готовое изделие и не мучал мозг себе и окружающим)

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

настроить ST_2 в режиме коррекция фазы на нужную частоту

установить порог 16, пин_8 поднять, старт ST_2

совпадение - пин_8 снять, установить порог 256-16

совпадение - пин_9 поднять

совпадение - пин_9 снять

установить порог 16

совпадение - пин_8 поднять ( проехали состояние ST_2=0 )

........второй период

совпадение - пин_8 снятьустановить порог 256-16

...........

 

частота - предделителем счётчика ST_2 , скважность - уровнями порогов

 

aice
Offline
Зарегистрирован: 14.12.2014

Спс , пошел книжки читать)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

OCR0A - порог для канала_1 , OCR0В - порог для канала_2 - чёбы не перезаписывать в каждом периоде уровни....

OCR0A - по совпадению управляет пин_8 , OCR0В - по совпадению управляет пин_9

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

всё гораздо проще..... тока счётчик настроить....


// используем "8-bit Timer/Counter2 with PWM"
// выход 1 - OC2A - PB3 - нога 17
// выход 2 - OC2B - PD3 - нога 5
// TCCR2A = COM2A1  COM2A0  COM2B1  COM2B0
//          ------  ------  WGM21   WGM20
// TCCR2B = FOC2A   FOC2B   -----   -----
//          WGM22   CS22    CS21    CS0
// OCR2A и OCR2B - пороги сравнения
// CS22:CS21:CS0 - 0=стоп  1=CLK      2=CLK/8    3=CLK/32  4=CLK/64
//                         5=CLK/128  6=CLK/256  7=CLK/1024
// с кварцем на 16 MHz и CS22:CS21:CS0=110 частота ШИМ будет
// 16000000 / 256 / 2 = 31,250 kHz
// с кварцем на 16 MHz и CS22:CS21:CS0=111 частота ШИМ будет
// 16000000 / 1024 / 2 = 7,812 kHz
int skw = 16; // скважность - от 1 до 127 !!!!!!!!!!!!!!!!!!!!!!
void setup()
{                
// настраиваем на 31 kHz
TCCR2B = TCCR2B | B00000110;
// дальше пока некогда :(
}
void loop()
{
  
  
  
  
// это для проверки осциллографом на ногах 5 и 17
  for( int i = 1; i < 128; i++ )
    {
      OCR2A = i;
      OCR2B = 128 - i;
      delay( 100 );
    }
  for( int i = 127; i < 1; i-- )
    {
      OCR2A = i;
      OCR2B = 128 - i;
      delay( 100 );
    }
}
SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

я могу ошибаться :) , проверяйте !

// используем "8-bit Timer/Counter2 with PWM"
// выход 1 - OC2A - PB3 - нога 17
// выход 2 - OC2B - PD3 - нога 5
// TCCR2A = COM2A1  COM2A0  COM2B1  COM2B0
//          ------  ------  WGM21   WGM20
// TCCR2B = FOC2A   FOC2B   -----   -----
//          WGM22   CS22    CS21    CS0
// OCR2A и OCR2B - пороги сравнения
// CS22:CS21:CS0 - 0=стоп  1=CLK      2=CLK/8    3=CLK/32  4=CLK/64
//                         5=CLK/128  6=CLK/256  7=CLK/1024
// с кварцем на 16 MHz и CS22:CS21:CS0=110 частота ШИМ будет
// 16000000 / 256 / 2 = 31,250 kHz
// с кварцем на 16 MHz и CS22:CS21:CS0=111 частота ШИМ будет
// 16000000 / 1024 / 2 = 7,812 kHz
int skw; // скважность - от 1 до 127 !!!!!!!!!!!!!!!!!!!!!!
//=================================================================================
void setup()
{                
// настраиваем на 31 kHz
// WGM22:WGM21:WGM20=001 - Mode1 - PWM, Phase Correct
TCCR2B = TCCR2B | B00000110;
// COM2A1:COM2A0=10 - Clear OC2A on Compare Match when up-counting.
//                    Set OC2A on Compare Match when down-counting.
// COM2B1:COMBA0=11 - Set OC2B on Compare Match when up-counting.
//                    Clear OC2B on Compare Match when down-counting.
// WGM22:WGM21:WGM20=001 - Mode1 - PWM, Phase Correct
TCCR2A = TCCR2A | B10110001;

// дальше пока некогда :(

}
// скважность меняем по прерыванию ( когда счётчик в нуле ) !!!!!!!!!!!!!
//=================================================================================
ISR( TIMER2_OVF_vect )
{
  OCR2A = skw;
  OCR2B = 128 - skw;
}
//=================================================================================
void loop()
{
  
  
  
  
// это для проверки осциллографом на ногах 5 и 17
  for( int i = 1; i < 128; i++ )
    {
      skw = i;
      delay( 100 );
    }
  for( int i = 127; i < 1; i-- )
    {
      skw = i;
      delay( 100 );
    }
}
//=================================================================================

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
// используем "8-bit Timer/Counter2 with PWM"
// выход 1 - OC2A - PB3 - нога 17
// выход 2 - OC2B - PD3 - нога 5
// TCCR2A = COM2A1  COM2A0  COM2B1  COM2B0
//          ------  ------  WGM21   WGM20
// TCCR2B = FOC2A   FOC2B   -----   -----
//          WGM22   CS22    CS21    CS0
// OCR2A и OCR2B - пороги сравнения
// CS22:CS21:CS0 - 0=стоп  1=CLK      2=CLK/8    3=CLK/32  4=CLK/64
//                         5=CLK/128  6=CLK/256  7=CLK/1024
// с кварцем на 16 MHz и CS22:CS21:CS0=110 частота ШИМ будет
// 16000000 / 256 / 2 = 31,250 kHz
// с кварцем на 16 MHz и CS22:CS21:CS0=111 частота ШИМ будет
// 16000000 / 1024 / 2 = 7,812 kHz
int skw; // скважность - от 1 до 127 !!!!!!!!!!!!!!!!!!!!!!
//=================================================================================
void setup()
{                
// настраиваем на 31 kHz
// WGM22:WGM21:WGM20=001 - Mode1 - PWM, Phase Correct
  TCCR2B = TCCR2B | B00000110;
// COM2A1:COM2A0=10 - Clear OC2A on Compare Match when up-counting.
//                    Set OC2A on Compare Match when down-counting.
// COM2B1:COMBA0=11 - Set OC2B on Compare Match when up-counting.
//                    Clear OC2B on Compare Match when down-counting.
// WGM22:WGM21:WGM20=001 - Mode1 - PWM, Phase Correct
  TCCR2A = TCCR2A | B10110001;
// разрешить прерывание по переполнению
  TIMSK2 = TIMSK2 | B00000001;
// может ещё надо глобальное разрешение на прерывания ??????????
}
//=================================================================================
// скважность меняем по прерыванию ( когда счётчик в нуле ) !!!!!!!!!!!!!
ISR( TIMER2_OVF_vect )
{
  OCR2A = skw;
  OCR2B = 128 - skw;
}
//=================================================================================
void loop()
{
// это для проверки осциллографом на ногах 5 и 17
  for( int i = 1; i < 128; i++ )
    {
      skw = i;
      delay( 100 );
    }
  for( int i = 127; i < 1; i-- )
    {
      skw = i;
      delay( 100 );
    }
}
//=================================================================================

а регистры лучше загружать так -   TIMSK2 = 1<<TOIE2;

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

строка #24 COM2B1:COMBA0=11 >>>>>>>>>>> COM2B1:COM2B0=11   :(

aice
Offline
Зарегистрирован: 14.12.2014

немогу пока проверить, посылки в пути, а мега с осцилографом есть только на работе(

но заранее Спасибо за помощь=)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ещё косяк :(

##32 , 38 - OCR2B = 128 - i; >>>>>>> OCR2B = 128 - i;OCR2B = 255 - i;

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

#37 в посте #30 OCR2B = 128 - i; >>>>>>>>> OCR2B = 255 - i;

:(

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

jeka_tm пишет:

а разве неинвертированный шим по одному каналу до 127 и инвертировнный  от 128 до 255 не будет то что нужно?

просто в первом 0>>127 это увеличение шим, а во втором будет 255>>128 увеличение (просто использовал такие значки. это не сдвиг)

да, именно так :) , спасибо !