Baser 5 10 июня, 2020 Опубликовано 10 июня, 2020 · Жалоба 1 час назад, MPetrovich сказал: Вот все 6 шагов на фазе W: Да не это я у вас просил, это уже на предыдущей картинке было. Я наконец-то хочу увидеть, что у вас открываются верхние ключи. Т.е. выложите кусок в 300-500мкс (3-5 периодов ШИМа). Для шага, когда открываются верхние ключи. А также кусочек, когда все закрыто (когда вы BEMF должны измерять). Хотя, уже не надо, увидел последнюю картинку. В 09.06.2020 в 23:06, MPetrovich сказал: Решил вернуться к первоначальной схеме - нижние ключи открыты в течение всего шага, верхние ШИМятся. Это уже даже не смешно, так и будете по одним и тем же граблям по кругу ходить? Верхние ключи снова не открываются. Для них годится только синхронный ШИМ. Ситуацию с фильтром даже нет смысла рассматривать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 3 11 июня, 2020 Опубликовано 11 июня, 2020 · Жалоба 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 задействовать. Всё таки с этими драйверами удобнее без инверсии нижнего канала работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 3 11 июня, 2020 Опубликовано 11 июня, 2020 · Жалоба Убрал ёмкости фильтров на фазах совсем. Как обещал, выкладываю ШИМ крупным планом. Зеленый луч - сигнал (ШИМ)на входах АЦП фаз после делителя; жёлтый луч - половина напряжения питания так же после делителя, оно же напряжение ZeroCross. Сигнал, как видно, чистый. Помех и иголок нет, выбросов тоже нет. Хорошо видно как зелёный ШИМ пересекает жёлтый уровень ZeroCross. Вот только незадачка - не ловится отчего то момент ZeroCross... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 11 июня, 2020 Опубликовано 11 июня, 2020 · Жалоба 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, а на второй – программатор и потенциометр. При необходимости плата отладчика может быть отсоединена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 3 12 июня, 2020 Опубликовано 12 июня, 2020 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 62 13 июня, 2020 Опубликовано 13 июня, 2020 · Жалоба 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мс - конденсатор просто не успевает зарядиться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 3 13 июня, 2020 Опубликовано 13 июня, 2020 · Жалоба 8 hours ago, HardEgor said: По всей видимости у вас после диода должен стоять большой конденсатор. Был такой))) Но, видимо недостаточно большой. 8 hours ago, HardEgor said: Зачем угловая частота, у вас синусоида? Нет, не синусоида. Это формула обобщённая. Конечно, если рассматривать моментальные значения(а по всему выходит, что так и надо рассматривать), то Вы похоже правы. Только на данном этапе мне фильтр вроде как и ни к чему. АЦП вполне может измерять уровень напряжения на "верхушке" ШИМ после делителя без фильтрации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 3 13 июня, 2020 Опубликовано 13 июня, 2020 · Жалоба Упёрся я в самом неожиданном месте. У меня отчего то не АЦП измеряет напряжение фазе во время PWM_ON. Причем весьма странным образом. Если подключаешь резисторную "звезду" вместо мотора, то на осциллографе наблюдается вот такая картинка: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 3 13 июня, 2020 Опубликовано 13 июня, 2020 · Жалоба Это сигналы навходе АЦП фазы (зелёный) и на входе АЦП референсного(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, но результат тот же. В чём тут фокус? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 13 июня, 2020 Опубликовано 13 июня, 2020 · Жалоба 2 часа назад, MPetrovich сказал: В дополнение ко всему, я не могу считать ни само V_BEMF, ни Prev_V_BEMF - в терминале одни нули. Однако V_ref считывается в терминал без проблем. Пробовал менять ADC_SampleTime, но результат тот же. В чём тут фокус? Может быть что-то пошло не так и вы запускаете АЦП в паузе ШИМа. Или длительность PWM_ON мала, и не хватает времени. Поставьте метку B12_OFF сразу после готовности результата АЦП и проверьте, в те ли моменты измеряете. Метод измерения BEMF при PWM_ON хорош только при большом коэф.заполнения на большой скорости. На малой скорости лучше измерять при PWM_OFF да еще и с усилением BEMF. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 3 13 июня, 2020 Опубликовано 13 июня, 2020 · Жалоба 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 при каждом такте ШИМ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба 8 часов назад, MPetrovich сказал: А в чём смысл установки метки именно после считывания результата конверсии? На завершение преобразования есть прерывание и это прерывание привязано к совершенно конкретному событию - концу преобразования. На начало преобразования прерывания нет, может вы будете дергать ногой в одном событии и на осциллографе все будет красиво, а преобразование на самом деле будет запускаться в совсем другое время от совсем другого события. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 3 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба 7 hours ago, Сергей Борщ said: может вы будете дергать ногой в одном событии и на осциллографе все будет красиво, а преобразование на самом деле будет запускаться в совсем другое время от совсем другого события. У меня нога-индикатор дергается только внутри прерывания. Вся процедура, которую я выкладывал выше - это обработчик прерывания по обновлению таймера, т.е. в начале активного периода ШИМ или PWM_ON. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба Как показывает моя практика разработчика, 99.9% ошибок - это твои собственные ошибки. Если вы видите что-то, что противоречит здравому смыслу (АЦП все время выдает 0), то ищите свою ошибку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 3 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба 27 minutes ago, Baser said: Как показывает моя практика разработчика, 99.9% ошибок - это твои собственные ошибки. Целиком и полностью согласен. В моём случае возможны ошибки абсолютно дурацкие, которые и нарочно не придумаешь))) Ищу... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться