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

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

Вот все 6 шагов на фазе W:

Да не это я у вас просил, это уже на предыдущей картинке было. Я наконец-то хочу увидеть, что у вас открываются верхние ключи. Т.е. выложите кусок в 300-500мкс (3-5 периодов ШИМа). Для шага, когда открываются верхние ключи. А также кусочек, когда все закрыто (когда вы BEMF должны измерять).

Хотя, уже не надо, увидел последнюю картинку.

В 09.06.2020 в 23:06, MPetrovich сказал:

Решил вернуться к первоначальной схеме - нижние ключи открыты в течение всего шага, верхние ШИМятся.

Это уже даже не смешно, так и будете по одним и тем же граблям по кругу ходить? :mda:
Верхние ключи снова не открываются. Для них годится только синхронный ШИМ.

Ситуацию с фильтром даже нет смысла рассматривать...

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


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

8 hours ago, Baser said:

выложите кусок в 300-500мкс (3-5 периодов ШИМа).

Ох, извиняюсь... Не понял...

 

8 hours ago, Baser said:

Для шага, когда открываются верхние ключи. А также кусочек, когда все закрыто (когда вы BEMF должны измерять).

Оба ключа открыты - это средняя часть, оба закрыты - две боковые части.

 

8 hours ago, Baser said:

Верхние ключи снова не открываются.

Открываются. Выложу потом осциллограмму - видно, что размах полный, от нуля до плюса питания.  На затворах верхних ключей теперь, как и положено, импульсы размахом 24В. Верхние ключи не открывались когда я пытался их одновременно с шижними ШИМить

 

8 hours ago, Baser said:

Для них годится только синхронный ШИМ.

Он тоже годится))) Я может потом попробую TIM1 задействовать. Всё таки с этими драйверами удобнее без инверсии нижнего канала работать.

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


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

Убрал ёмкости фильтров на фазах совсем. Как обещал, выкладываю ШИМ крупным планом. Зеленый луч - сигнал (ШИМ)на входах АЦП фаз после делителя; жёлтый луч - половина напряжения питания так же после делителя, оно же напряжение ZeroCross.

 

PHASE_SMALL.JPG

Big2.JPG

Big1.JPG

Сигнал, как видно, чистый. Помех и иголок нет, выбросов тоже нет. Хорошо видно как зелёный ШИМ пересекает жёлтый уровень ZeroCross. Вот только незадачка - не ловится отчего то момент ZeroCross...:umnik2:

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


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

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

Открываются. Выложу потом осциллограмму - видно, что размах полный, от нуля до плюса питания.  На затворах верхних ключей теперь, как и положено, импульсы размахом 24В. Верхние ключи не открывались когда я пытался их одновременно с шижними ШИМить

Вроде по картинкам - открываются. Тогда почему у вас первый раз с таким же режимом ШИМа (до замены драйверов) верхние ключи не открывались? Может емкость бутстрепа увеличили?

Насчет ловли противо-эдс - экспериментируйте. Может быть оборотов мало, и она совсем мала.
Делитель с фильтром нужен, если будете пол-питания ловить. А если в паузе ШИМа, то он не нужен.

з.ы. сегодня в рекламе Компела было про STM32G4:
B-G431B-ESC1 Discovery kit  у Mouser всего 16.85 Евро

Скрытый текст

B-G431B-ESC1 Discovery kit – отладочный набор, который представляет собой ESC-контроллер (Electronic Speed Controller), предназначенный для управления трехфазным бесколлекторным двигателем с помощью FOC-алгоритма или традиционного шестиступенчатого алгоритма. Набор состоит из двух плат, соединенных перемычкой. На первой размещается микроконтроллер STM32G431CB, драйвер L6387, силовые транзисторы STL180N6F7, а на второй – программатор и потенциометр. При необходимости плата отладчика может быть отсоединена.

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


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

On 6/12/2020 at 12:04 AM, Baser said:

Тогда почему у вас первый раз с таким же режимом ШИМа (до замены драйверов) верхние ключи не открывались?

Я тоже озадачился таким вопросом и, сравнив новую силовую часть с предыдущим вариантом, пришёл к выводу, что виноват мощный защитный диод, который я ставил во избежание переполюсовки. Это единственное существенное отличие нового и старого вариантов. По всей видимости диод блокировал отток обратного тока в источник и не давал верхним ключам нормально открыться. 

 

On 6/12/2020 at 12:04 AM, Baser said:

Делитель с фильтром нужен, если будете пол-питания ловить.

Делитель есть, а фильтр, если верить тому же китайцу, не нужен. Я файлик прикрепил, там есть помимо анализа обеих схем PWM_ON и PWM_OFF ещё и практическая схема, реализующая оба принципа сразу.

BEMF_Detecnion_During_PWM_Off_Time.pdf

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


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

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

 По всей видимости диод блокировал отток обратного тока в источник и не давал верхним ключам нормально открыться.

По всей видимости у вас после диода должен стоять большой конденсатор.

11.06.2020 в 02:27, MPetrovich сказал:

Формула для расчёта делителя с фильтром: угловая частота w=(R1+R2)/(R1*R2*C). Из неё, при указанных мной величинах сопротивлений и частоте ШИМ 10кГц, получается С=0,56мкФ. Так что 0,1мкФ - это даже мало.

Зачем угловая частота, у вас синусоида? 

Рассматривайте как импульсную схему t=(R1*R2*C)/(R1+R2) = 28.5e+3 Ом * 0.1e-6  Ф =  2.85мс - конденсатор просто не успевает зарядиться.

 

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


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

8 hours ago, HardEgor said:

По всей видимости у вас после диода должен стоять большой конденсатор.

Был такой))) Но, видимо недостаточно большой.

 

8 hours ago, HardEgor said:

Зачем угловая частота, у вас синусоида? 

Нет, не синусоида. Это формула обобщённая. Конечно, если рассматривать моментальные значения(а по всему выходит, что так и надо рассматривать), то Вы похоже правы.

Только на данном этапе мне фильтр вроде как и ни к чему. АЦП вполне может измерять уровень напряжения на "верхушке" ШИМ после делителя без фильтрации.

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


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

Упёрся я в самом неожиданном месте. У меня отчего то не АЦП измеряет напряжение фазе во время PWM_ON. Причем весьма странным образом. Если подключаешь резисторную "звезду"  вместо мотора, то на осциллографе наблюдается вот такая картинка:

PHASE_Vref.JPG

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


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

Это сигналы навходе АЦП фазы (зелёный) и на входе АЦП референсного(V_ref) напряжения (жёлтый), с которым сравнивается BEMF. Оба сигнала после делителей.

Видно, что нижняя ступенька ШИМ практически равна опорному напряжению. Это и логично - ведь в резисторной "звезде" напряжение ШИМ делится пополам и половина как раз и равна половине напряжения питания = V_ref.

Так вот. В таком виде, если задать V_ref как константу по величине меньше реального V_ref и в процедуре раскомментировать строчку if((V_BEMF>V_ref)&&(Prev_V_BEMF>V_ref)) и закомментировать предыдущюю, то по светодиоду и по меткам B12_ON  и B12_OFF видно, что срабатывает вышеуказанное условие и ZeroCross = TRUE;

void BEMF_Sampling(void)
{
  //wait, while there are interconnection glitch
  volatile uint8_t i=10;  while(i>0)i--; //29*0,167~5uSec
  B12_ON
  ADC_RegularChannelConfig(ADC1, ADMUXTable[nextCommutationStep], 1, ADC_SampleTime_7Cycles5);
  ADC_SoftwareStartConvCmd(ADC1, ENABLE); //Start ADC conversion manually
  while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET); //Wait while ADC sample complete.
  uint16_t V_BEMF = ADC_GetConversionValue(ADC1);//read ADC Conversion Value in V_BEMF;
  V_ref = 1108;//1911;//
  //if(n<512) {buf[n] = V_ref; n++;}
//Проверяем значение V_BEMF измеренное АЦП и одновременно сравниваем его с предыдущим значением.
//Если текущее значение >0, а предыдущее <=0 или текущее значение <0, а предыдущее >=0;
//значит произошло событие ZeroCross.
 //*************************************************************************
  //Первый результат измерения всегда отбрасывается, т.к. в Commutate() Prev_V_BEMF=0
  if(/*(V_BEMF>(V_ref-300))&&(V_BEMF<(V_ref+300))&&*/(Prev_V_BEMF!=0))
   {
     if(((V_BEMF>V_ref)&&(Prev_V_BEMF<=V_ref))||((V_BEMF<V_ref)&&(Prev_V_BEMF>=V_ref)))
     //if((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 the FIRST half of intercommutation time.
	    uint16_t Temp = TIM_GetCounter(TIM3);
                           //TimeSinceCommutation = TIM_GetCounter(TIM3);
// Filter the  ZC detection with earlier measurements through IIR(recoursive) filter.
   TimeSinceCommutation = (1*Temp+3*TimeSinceCommutation)/4;
//Write this value in TIM3_CCR1 register. It's the SECOND half of intercommutation period
   //When counter will reach this value, next Commutate() will happen
        TIM3 -> CCR1 = TimeSinceCommutation;
        TIM3 -> CNT = 0;
       }
   }
//*****************************************************************/
  Prev_V_BEMF = V_BEMF;//Save V_BEMF in Prev_V_BEMF
  if(ZeroCross != TRUE)  B12_OFF
}

Но как только я пытаюсь подключить мотор и включить условие: if(((V_BEMF>V_ref)&&(Prev_V_BEMF<=V_ref))||((V_BEMF<V_ref)&&(Prev_V_BEMF>=V_ref))), так ни одного срабатывания. Т.е. ZeroCross = FALSE, светодиод не горит и по меткам B12_ON  и B12_OFF видно, что срабатывания не происходит.

Осциллограммы с мотором я выкладывал выше в большом количестве. Там можно видеть как BEMF пересекает V_ref и снизу вверх и сверху вниз. В дополнение ко всему, я не могу считать ни само V_BEMF, ни Prev_V_BEMF - в терминале одни нули. Однако V_ref считывается в терминал без проблем. Пробовал менять ADC_SampleTime, но результат тот же. 

В чём тут фокус?

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


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

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

В дополнение ко всему, я не могу считать ни само V_BEMF, ни Prev_V_BEMF - в терминале одни нули. Однако V_ref считывается в терминал без проблем. Пробовал менять ADC_SampleTime, но результат тот же. 

В чём тут фокус?

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

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


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

1 hour ago, Baser said:

Поставьте метку B12_OFF сразу после готовности результата АЦП и проверьте, в те ли моменты измеряете.

А в чём смысл установки метки именно после считывания результата конверсии? Сейчас фактически происходит та же последовательность - при невыполнении условия ZeroCross, нога В12 переходит из единицы в ноль. Завтра осциллограмму выложу, там отчётливо видно, что весь положительный импульс на В12 находится внутри активного периода ШИМ и его длительность порядка 6мкСек.

Когда происходит ZeroCross, то В12 остаётся в единице до конца шага и переходит в ноль только при следующей коммутации.

Единственное, что мне пришло в голову - это снова попробовать записывать значения, полученные после конверсии в массив в течении нескольких шагов, потом останавливать мотор  и выводить полученные значения в терминал. Я так уже делал, но информативность - мягко говоря - не очень.

Сейчас я могу выводить только последние значения V_BEMF,  Prev_V_BEMF  или V_ref.  V_ref измеряется один раз непосредственно перед каждой коммутацией, а  V_BEMF или Prev_V_BEMF при каждом такте ШИМ.

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


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

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

А в чём смысл установки метки именно после считывания результата конверсии?

На завершение преобразования есть прерывание и это прерывание привязано к совершенно конкретному событию - концу преобразования. На начало преобразования прерывания нет, может вы будете дергать ногой в одном событии и на осциллографе все будет красиво, а преобразование на самом деле будет запускаться в совсем другое время от совсем другого события.

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


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

7 hours ago, Сергей Борщ said:

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

У меня нога-индикатор дергается только внутри прерывания. Вся процедура, которую я выкладывал выше - это обработчик прерывания по обновлению таймера, т.е. в начале активного периода ШИМ или PWM_ON.

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


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

Как показывает моя практика разработчика, 99.9% ошибок - это твои собственные ошибки. Если вы видите что-то, что противоречит здравому смыслу (АЦП все время выдает 0), то ищите свою ошибку.

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


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

27 minutes ago, Baser said:

Как показывает моя практика разработчика, 99.9% ошибок - это твои собственные ошибки.

Целиком и полностью согласен. В моём случае возможны ошибки абсолютно дурацкие, которые и нарочно не придумаешь))) Ищу...

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


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

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

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

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

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

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

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

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

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

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