Jump to content

    
MPetrovich

STM32F103 не пишет в TIM4->DIER

Recommended Posts

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
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 задействовать. Всё таки с этими драйверами удобнее без инверсии нижнего канала работать.

Share this post


Link to post
Share on other sites

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

 

PHASE_SMALL.JPG

Big2.JPG

Big1.JPG

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

Share this post


Link to post
Share on other sites
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, а на второй – программатор и потенциометр. При необходимости плата отладчика может быть отсоединена.

Share this post


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

Share this post


Link to post
Share on other sites
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мс - конденсатор просто не успевает зарядиться.

 

Share this post


Link to post
Share on other sites
8 hours ago, HardEgor said:

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

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

 

8 hours ago, HardEgor said:

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

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

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

Share this post


Link to post
Share on other sites

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

PHASE_Vref.JPG

Share this post


Link to post
Share on other sites

Это сигналы навходе АЦП фазы (зелёный) и на входе АЦП референсного(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, но результат тот же. 

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

Share this post


Link to post
Share on other sites
2 часа назад, MPetrovich сказал:

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

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

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

Share this post


Link to post
Share on other sites
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 при каждом такте ШИМ.

Share this post


Link to post
Share on other sites
8 часов назад, MPetrovich сказал:

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

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

Share this post


Link to post
Share on other sites
7 hours ago, Сергей Борщ said:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
27 minutes ago, Baser said:

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

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

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.