MPetrovich 6 24 мая, 2020 Опубликовано 24 мая, 2020 · Жалоба 11 hours ago, Baser said: Почему не видно пачек коммутации на фазе длиной 2 шага и пауз в коммутации с чистым BEMF длиной в 1 шаг ? Начну с того, что на второй картинке на желтом луче виден не один шаг а два и "пустой" шаг с BEMF - это первая половина желтой пачки. На этом шаге BEMF переходит через зелёный "ноль" сверху вниз. На зелёном сигнале не должно быть "шерсти" от ШИМ 10кГц, поскольку её напрочь отрезает фильтр. Это по схеме дядюшки Сяо без фильтрации на осциллограмме BEMF видно частоту ШИМ. Эх, вот на работе у меня 4-х лучевой осциллограф стационарный с большим экраном... Вот на нём бы все фазы и BEMF сразу б можно было увидеть. Но домой мне его никто не даст - больно дорогая игрушка))). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 24 мая, 2020 Опубликовано 24 мая, 2020 · Жалоба 17 hours ago, Baser said: Зелёный сигнал снимался непосредственно с фазы. На последних картинках зелёный сигнал снимался с ноги-входа АЦП после фильтра. А тот сигнал, что снимался непосредственно с фазы не может быть чистым от ШИМ. Вы наверное про него спрашивали. 17 hours ago, Baser said: Почему не видно пачек коммутации на фазе длиной 2 шага Не могу сказать - не знаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 25 мая, 2020 Опубликовано 25 мая, 2020 (изменено) · Жалоба Снова картинка. На ней хорошо видно как зеленый BEMF пересекает линию ZeroCross. Причем практически образцово - сигнал треугольный пересекает на каждом шаге коммутации. Однако, у меня отчего то идут очень частые пропуски определения события ZeroCross. Я вывожу в терминал на каждом шаге значение переменной ZeroCross - TRUE или FALSE, что соответствует состоянию события. Так вот FALSE даже чаще, чем TRUE. Отчего ткая петрушка - не понимаю, хоть убейся! Изменено 25 мая, 2020 пользователем MPetrovich Исправил неточность Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 25 мая, 2020 Опубликовано 25 мая, 2020 (изменено) · Жалоба На всякий случай выложу кусок кода, где АЦП измеряет 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 } Изменено 25 мая, 2020 пользователем MPetrovich Исправил ошибки Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 25 мая, 2020 Опубликовано 25 мая, 2020 · Жалоба 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 фильтра) и никакого гистерезиса. А шумы на осциллограмме довольно большие. Все это как-то мало похоже на рабочую программу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 25 мая, 2020 Опубликовано 25 мая, 2020 · Жалоба 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 добавить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 26 мая, 2020 Опубликовано 26 мая, 2020 · Жалоба 8 часов назад, MPetrovich сказал: перед uint8_t добавить? volatile Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 26 мая, 2020 Опубликовано 26 мая, 2020 · Жалоба Ага,спасибо, теперь понятно вроде. Надо написать: "volatile i=10; while(i>0)i--; //10*0,167~1,7uSec". Так? Сергей, а что Вы скажите по процедуре, которую я привёл выше? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 26 мая, 2020 Опубликовано 26 мая, 2020 · Жалоба В 24.05.2020 в 18:28, MPetrovich сказал: В 24.05.2020 в 00:46, Baser сказал: Почему не видно пачек коммутации на фазе длиной 2 шага Не могу сказать - не знаю. Я говорил про первую картинку из этого поста. Вами было сказано, что это сигнал на фазе. Под фазой я понимаю обмотку. Так вот, это что угодно, только не сигнал на одной из трех фаз. На фазе, если смотреть от минуса источника питания (земли), должны быть уровни нуля и +12В. Я их не вижу. Или вы НЕ ТО меряете, или НЕ ТАМ, или не относительно земли. Или если все предыдущее правильно, то у вас просто не до конца открываются ключи Если хотите помощи, тогда рисуйте свою схему (всю), рисуйте как вы подключаете питание, все земли и осциллограф. И описывайте ваш программный алгоритм. На ваших картинках я не вижу похожести ни с одной картинкой из многочисленных App.Notes Послушался своего совета (а я себе плохого не посоветую ), взял из хлама винчестер и посмотрел сигнал фазы. Изучайте, 7200rpm: Совершенно чистый и красивый сигнал, никаких шумов и помех. Управление там конечно более сложное, с синхронным выпрямлением, но общий принцип тот же. Дальше я подключил к фазе цепочку делителя с фильтром: фаза -> 100K -> 15K || 1nF -> Gnd А вот делитель с фильтром: фаза -> 100K -> 15K || 10nF -> Gnd Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 26 мая, 2020 Опубликовано 26 мая, 2020 · Жалоба Сегодня пол дня пытался вытаскивать результаты конверсий АЦП в терминал. В режиме "на лету" ничего хорошего не выходит, поскольку начинает тормозится коммутация и в конце концов мотор стопорится. Тогда я решил вываливать некоторое количество сэмплов в буфер и потом, остановив мотор, их распечатывать. Примерно прикинул, что максимум сэмплов - это 40шт\шаг и взяв 12 шагов (один полный оборот) получил 480. Создал буфер uint16_t buf[512] и стал сваливат туда все сэмплы за 12 шагов. Потом стоп машина и печатать в терминал. Вобщем покувырклся - информтивность всего этого мероприятия довольно слабенькая, хотя видно как сигнал увеличивается и уменьшается. Видно также, что выбросов практически нет. Ну и все... Взялся после всей этой мороки снова за осциллограф. Замерил величину порогового напряжения и решил подсунуть её как константу. Раньше то я на каждом шаге мерил эту опору. Воткнул константу в процедуру, которую, кстати, выкладывал, и... вдруг заработало! То есть после запуска мотор не дёргается, а ровненько так крутит. Вот так неожиданность! Однако это все манипуляции были для фиксированного к-та заполнения ШИМ. Ну, думаю, пора порегулировать ШИМ и посмотреть на поведение моторчика. Включил опрос потенциометра и запустил. И снова прокатило! Работает, зараза! Правда на ШИМ больше 75% сбивается синхронизация, но зато в нижнем диапазоне работает аж от 10%!!! Это я такой предел программно задал, чтоб было время на конверсию. Вобщем, сегодняшний день был для меня прям прорывным))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 28 мая, 2020 Опубликовано 28 мая, 2020 · Жалоба On 5/26/2020 at 11:30 PM, Baser said: Или вы НЕ ТО меряете, или НЕ ТАМ, или не относительно земли. Или если все предыдущее правильно, то у вас просто не до конца открываются ключи Озадачился этим вопросом. Действительно, сигнал с фаз совершенно не похож ни на что. Пробовал подключать без мотора к ключам, которые включаются одновременно по алгоритму переключения шагов - один резистор на верхний ключ и на землю, второй резистор на нижний ключ и на +12В. Смотрел осциллографом относительно земли. Получилось: импульсы снизу и сверху навстречу друг другу одинаковой длительности и одинаковой амплитуды 12В. Попробую подключить "звезду" из резисторов вместо мотора и посмотрю сигнал на ней. Есть у меня подозрение, что пока мотор не в фазе с импульсами ШИМ, таким странным образом проявляется влияние обмоток друг на друга. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 28 мая, 2020 Опубликовано 28 мая, 2020 (изменено) · Жалоба Снял осциллограммы на резисторной "звезде" и на затворах нижних и верхних ключей. Это на затворе верхнего ключа после драйвера IR2103S, то же самое и на всех фазах Это на затворе нижнего ключа. Тут все нормально - обычный правильный ШИМ. Отчего у меня на верхнем ключе такая петрушка - не понятно. Прочитал апнот https://static.chipdip.ru/lib/159/DOC000159771.pdf Добавил резистор от соединения истока верхнего со стоком нижнего к ноге Vs драйвера - напряжение подкачки. Не помогло. Проверил диоды подкачки - нормальные. Увеличил емкость подкачки - не помогло. Вот, блин, ерунда то! Понятно отчего такая хрень на моторе получается. Мудрено, что он вообще крутится и даже управляется! Что самое непонятное - это то, что если разорвать соединение ключей и использовать их по отдельности, как ключ от плюса на нагрузку к земле и как ключ от земли на нагрузку к плюсу - то ключи работают нормально. Я в предыдущем посте уже писал об этом. Ну отчего же так выходит то! Изменено 28 мая, 2020 пользователем MPetrovich дополнение Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 28 мая, 2020 Опубликовано 28 мая, 2020 · Жалоба Вот, для полноты картины схема силовой части: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 28 мая, 2020 Опубликовано 28 мая, 2020 · Жалоба 1 час назад, MPetrovich сказал: Это на затворе верхнего ключа после драйвера IR2103S, то же самое и на всех фазах Похоже не хотят до конца закрываться верхние ключи. А питание на драйверах не прыгает? И разве в таком режиме этот драйвер можно применять, когда ШИМ только на верхнем ключе, а нижний ключ закрыт? Схема накачки питания верхнего ключа при этом работать не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 28 мая, 2020 Опубликовано 28 мая, 2020 · Жалоба 18 minutes ago, Baser said: Похоже не хотят до конца закрываться верхние ключи. Похоже. Только не понятно отчего? 19 minutes ago, Baser said: А питание на драйверах не прыгает? Там ёмкость 1000мкФ+0,1мкф керамика. 20 minutes ago, Baser said: И разве в таком режиме этот драйвер можно применять, когда ШИМ только на верхнем ключе, а нижний ключ закрыт? Так в каждый момент времени в зависимости от шага верхний ключ через обмотки замыкается на нижний и на землю. Типичная мостовая схема. 22 minutes ago, Baser said: Схема накачки питания верхнего ключа при этом работать не будет. Отчего же? Емкость подкачки заряжается в период открывания нижнего ключа, а верхний при этом закрыт. Потом верхний ключ закрывается и емкость подскакивает выше напряжения питания, что позволяет ей открыть затвор верхнего ключа. И вообще, эта схема взята мной из Атмеловского апнота по контроллеру для BLDC))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться