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

11 hours ago, Baser said:

Почему не видно пачек коммутации на фазе длиной 2 шага и пауз в коммутации с чистым BEMF длиной в 1 шаг ?

Начну с того, что на второй картинке на желтом луче виден не один шаг а два и "пустой" шаг с BEMF - это первая половина желтой пачки. На этом шаге BEMF переходит через зелёный "ноль" сверху вниз.  На зелёном сигнале не должно быть "шерсти" от ШИМ 10кГц, поскольку её напрочь отрезает фильтр. Это по схеме дядюшки Сяо без фильтрации на осциллограмме BEMF видно частоту ШИМ.

Эх, вот на работе у меня 4-х лучевой осциллограф стационарный с большим экраном... Вот на нём бы все фазы и BEMF сразу б можно было увидеть. Но домой мне его никто не даст - больно дорогая игрушка))).

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


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

17 hours ago, Baser said:

Зелёный сигнал снимался непосредственно с фазы.

На последних картинках зелёный сигнал снимался с ноги-входа АЦП после фильтра. А тот сигнал, что снимался непосредственно с фазы не может быть чистым от ШИМ. Вы наверное про него спрашивали.

 

17 hours ago, Baser said:

Почему не видно пачек коммутации на фазе длиной 2 шага

Не могу сказать - не знаю.

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


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

Снова картинка. На ней хорошо видно как зеленый  BEMF пересекает линию ZeroCross. Причем практически образцово - сигнал треугольный пересекает на каждом шаге коммутации. Однако, у меня отчего то идут очень частые пропуски определения события ZeroCross. Я вывожу в терминал на каждом шаге значение переменной ZeroCross - TRUE или FALSE, что соответствует состоянию события. Так вот FALSE даже чаще, чем TRUE. Отчего ткая петрушка - не понимаю, хоть убейся!:dash2:

BEMF.JPG

Изменено пользователем MPetrovich
Исправил неточность

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


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

На всякий случай выложу кусок кода, где АЦП измеряет BEMF и принимается решение было событие - TRUE или нет - FALSE. Это обработчик прерывания по обновлению таймера ШИМ.

 //Это обработчик прерываний по UE таймера TIM4_IRQHandler.
void BEMF_Sampling(void)
{
  //wait, while there are interconnection glitch
  uint8_t i=10;  while(i>0)i--; //10*0,167~1,7uSec  
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);//Start ADC conversion manually
  while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET); //Wait while ADC sample complete.
  V_BEMF = ADC_GetConversionValue(ADC1);//write in  V_BEMF from ADC;
//Проверяем значение V_BEMF измеренное АЦП и одновременно сравниваем его с предыдущим значением.
//Если текущее значение >0, а предыдущее <0 или текущее значение <0, а предыдущее >0;
//значит произошло событие ZeroCross.
 //*************************************************************************
  if((V_BEMF>(V_ref-200))&&(V_BEMF<(V_ref+200))&&(Prev_V_BEMF!=0))
   {
     if(((V_BEMF>V_ref)&&(Prev_V_BEMF<V_ref))||((V_BEMF<V_ref)&&(Prev_V_BEMF>V_ref)))
       {
   	     TIM4->DIER = 0;//Disable TIM4 interrupts, stop V_BEMF measuring
         ZeroCross = TRUE; 
	     LED_ON
  //*****************************************************************
  //Save time from last commutation to ZeroCross event. It's 1/2 of intercommutation time	   
 TimeSinceCommutation = TIM_GetCounter(TIM3);
// Filter the  ZC detection with earlier measurements through IIR(recoursive) filter.
   //TimeSinceCommutation = (1*Temp+3*TimeSinceCommutation)
//Write this value in TIM3 channel 1 compare register TIM3_CCR1. Half of intercommutation period
//When counter will reach this value, Commutate() will happen
        TIM3->SR = 0;//CLEAR_ALL_TIM3_FLAGS;
        TIM3 -> CCR1 = TimeSinceCommutation;
        TIM3 -> CNT = 0;
       }
   }
//*****************************************************************/
  Prev_V_BEMF = V_BEMF;//Save V_BEMF in Prev_V_BEMF
}

 

Изменено пользователем MPetrovich
Исправил ошибки

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


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

49 минут назад, MPetrovich сказал:

На всякий случай выложу кусок кода, где АЦП измеряет BEMF и принимается решение было событие - TRUE или нет - FALSE. Это обработчик прерывания по обновлению таймера ШИМ.

Сильно не вникал, только то, что бросилось в глаза:

50 минут назад, MPetrovich сказал:

uint8_t i=10; while(i>0)i--; //10*0,167~1,7uSec

Добавьте volatile - иначе, если включена оптимизация, компилятор выкинет эту строчку.

ZeroCross = FALSE в этом куске кода нигде нет. Где он находится?

И вообще, по этому куску мало что понятно. Вы измеряете BEMF во время работы ШИМ на фазе до первого перехода порога и потом перестаете измерять до нового шага?
И при этом у вас нет никакой фильтрации измеренных значений (кроме RC фильтра) и никакого гистерезиса. А шумы на осциллограмме довольно большие. Все это как-то мало похоже на рабочую программу.

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


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

7 minutes ago, Baser said:

ZeroCross = FALSE

в начале каждого шага.

 

8 minutes ago, Baser said:

Вы измеряете BEMF во время работы ШИМ на фазе до первого перехода порога и потом перестаете измерять до нового шага?

Да. Именно так.

 

8 minutes ago, Baser said:

И при этом у вас нет никакой фильтрации измеренных значений (кроме RC фильтра) и никакого гистерезиса.

if((V_BEMF>(V_ref-200))&&(V_BEMF<(V_ref+200))&&(Prev_V_BEMF!=0))
 

фильтр

if(((V_BEMF>V_ref)&&(Prev_V_BEMF<V_ref))||((V_BEMF<V_ref)&&(Prev_V_BEMF>V_ref)))

гистерезис. Правда только с одним порогом)))

11 minutes ago, Baser said:

Добавьте volatile

перед uint8_t добавить?

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


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

8 часов назад, MPetrovich сказал:

перед uint8_t добавить?

volatile

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


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

Ага,спасибо, теперь понятно вроде. Надо написать: "volatile i=10; while(i>0)i--; //10*0,167~1,7uSec". Так?  

Сергей, а что Вы скажите по процедуре, которую я привёл выше?

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


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

В 24.05.2020 в 18:28, MPetrovich сказал:
В 24.05.2020 в 00:46, Baser сказал:

Почему не видно пачек коммутации на фазе длиной 2 шага

Не могу сказать - не знаю.

Я говорил про первую картинку из этого поста. Вами было сказано, что это сигнал на фазе. Под фазой я понимаю обмотку.
Так вот, это что угодно, только не сигнал на одной из трех фаз. На фазе, если смотреть от минуса источника питания (земли), должны быть уровни нуля и +12В. Я их не вижу.
Или вы НЕ ТО меряете, или НЕ ТАМ, или не относительно земли. Или если все предыдущее правильно, то у вас просто не до конца открываются ключи :dirol:
Если хотите помощи, тогда рисуйте свою схему (всю), рисуйте как вы подключаете питание, все земли и осциллограф. И описывайте ваш программный алгоритм.

На ваших картинках я не вижу похожести ни с одной картинкой из многочисленных App.Notes :pardon:
Послушался своего совета (а я себе плохого не посоветую :smile: ), взял из хлама винчестер и посмотрел сигнал фазы. Изучайте, 7200rpm:

BLDC_HardDisk7200rpm.thumb.png.00b5228774158a77133dbf3bfc30a81c.png

Совершенно чистый и красивый сигнал, никаких шумов и помех. Управление там конечно более сложное, с синхронным выпрямлением, но общий принцип тот же.
Дальше я подключил к фазе цепочку делителя с фильтром: фаза -> 100K -> 15K || 1nF -> Gnd

BLDC_1nF.thumb.png.75d522a2dfd008b9f2a6be8049e153fc.png

А вот делитель с фильтром: фаза -> 100K -> 15K || 10nF -> Gnd

BLDC_10nF.thumb.png.3f6a0be86d91ec398e9b856750bdd405.png

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


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

   Сегодня пол дня пытался вытаскивать результаты  конверсий АЦП в терминал. В режиме "на лету" ничего хорошего не выходит, поскольку начинает тормозится коммутация и в конце концов мотор стопорится. Тогда я решил вываливать некоторое количество сэмплов в буфер и потом, остановив мотор, их распечатывать. Примерно прикинул, что максимум сэмплов - это 40шт\шаг и взяв 12 шагов (один полный оборот) получил 480. Создал буфер uint16_t buf[512] и стал сваливат туда все сэмплы за 12 шагов. Потом стоп машина и печатать в терминал. Вобщем покувырклся - информтивность всего этого мероприятия довольно слабенькая, хотя видно как сигнал увеличивается и уменьшается. Видно также, что выбросов практически нет. Ну и все...

   Взялся после всей этой мороки снова за осциллограф. Замерил величину порогового напряжения и решил подсунуть её как константу. Раньше то я на каждом шаге мерил эту опору. Воткнул константу в процедуру, которую, кстати, выкладывал, и... вдруг заработало! То есть после запуска мотор не дёргается, а ровненько так крутит. Вот так неожиданность! Однако это все манипуляции были для фиксированного к-та заполнения ШИМ. Ну, думаю, пора порегулировать ШИМ и посмотреть на поведение моторчика. Включил опрос потенциометра и запустил. И снова прокатило! Работает, зараза! Правда на ШИМ больше 75% сбивается синхронизация, но зато в нижнем диапазоне работает аж от 10%!!! Это я такой предел программно задал, чтоб было время на конверсию.

   Вобщем, сегодняшний день был для меня прям прорывным)))

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


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

On 5/26/2020 at 11:30 PM, Baser said:

Или вы НЕ ТО меряете, или НЕ ТАМ, или не относительно земли. Или если все предыдущее правильно, то у вас просто не до конца открываются ключи

Озадачился этим вопросом. Действительно, сигнал с фаз совершенно не похож ни на что.

Пробовал подключать без мотора к ключам, которые включаются одновременно по алгоритму переключения шагов - один резистор на верхний ключ и на землю, второй резистор на нижний ключ и на +12В. Смотрел осциллографом относительно земли. Получилось: импульсы снизу и сверху навстречу друг другу одинаковой длительности и одинаковой амплитуды 12В.

Попробую подключить "звезду" из резисторов вместо мотора и посмотрю сигнал на ней.

Есть у меня подозрение, что пока мотор не в фазе с импульсами ШИМ, таким странным образом проявляется влияние обмоток друг на друга. 

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


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

Снял осциллограммы на резисторной "звезде" и на затворах нижних и верхних ключей.

 

Это на затворе верхнего ключа после драйвера IR2103S, то же самое и на всех фазах

 

Затвор верхнего ключа.JPG

 

Это на затворе нижнего ключа. Тут все нормально - обычный правильный ШИМ.

 

Затвор нижнего ключа.JPG

 

Отчего у меня на верхнем ключе такая петрушка - не понятно. Прочитал апнот https://static.chipdip.ru/lib/159/DOC000159771.pdf

Добавил резистор от соединения истока верхнего со стоком нижнего к ноге Vs драйвера - напряжение подкачки. Не помогло.

Проверил диоды подкачки - нормальные.

Увеличил емкость подкачки - не помогло.

Вот, блин, ерунда то! Понятно отчего такая хрень на моторе получается. Мудрено, что он вообще крутится и даже управляется!

Что самое непонятное - это то, что если разорвать соединение ключей и использовать их по отдельности, как ключ от плюса на нагрузку к земле и как ключ от земли на нагрузку к плюсу - то ключи работают нормально. Я в предыдущем посте уже писал об этом. Ну отчего же так выходит то!

Изменено пользователем MPetrovich
дополнение

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


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

1 час назад, MPetrovich сказал:

Это на затворе верхнего ключа после драйвера IR2103S, то же самое и на всех фазах

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

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


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

18 minutes ago, Baser said:

Похоже не хотят до конца закрываться верхние ключи.

Похоже. Только не понятно отчего?

 

19 minutes ago, Baser said:

А питание на драйверах не прыгает?

Там ёмкость 1000мкФ+0,1мкф керамика.

 

20 minutes ago, Baser said:

И разве в таком режиме этот драйвер можно применять, когда ШИМ только на верхнем ключе, а нижний ключ закрыт?

Так в каждый момент времени в зависимости от шага верхний ключ через обмотки замыкается на нижний и на землю. Типичная мостовая схема.

 

22 minutes ago, Baser said:

Схема накачки питания верхнего ключа при этом работать не будет.

Отчего же? Емкость подкачки заряжается в период открывания нижнего ключа, а верхний при этом закрыт. Потом верхний ключ закрывается и емкость подскакивает выше напряжения питания, что позволяет ей открыть затвор верхнего ключа.

 

И вообще, эта схема взята мной из Атмеловского апнота по контроллеру для BLDC)))

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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