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

Детекция ЭДС в регуляторе бесколлекторного двигателя.

Гироскутеры на них не просто бегают, они на них равновесие держат. Именно этим определяется необходимость в датчиках Холла.

 

Мне кажется для этих дел уже давно гироскопы используют.

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


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

Гироскутеры на них не просто бегают, они на них равновесие держат. Именно этим определяется необходимость в датчиках Холла.

д.Холла - именно только для определения положения ротора. Для определения наклона доски - гироскоп.

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


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

д.Холла - именно только для определения положения ротора. Для определения наклона доски - гироскоп.

Зачем дублировать одну и ту же информацию? Это же не робот у которого надо знать положение колесика.

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


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

д.Холла - именно только для определения положения ротора. Для определения наклона доски - гироскоп.

Я предельно ясно выразилась - "держат равновесие". Гироскоп определяет наклон. А Холлы - держат

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


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

Читать много лень. :)

Для авиа-назначения, можно считать, что нагрузка примерно постоянна (вентиляторная нагрузка)? И можно обойтись без обратной связи? Если так, то можно и синусным ШИМом по-управлять, заранее зная параметры инерции вала с пропеллером.

Но ТС ведь хочет этот моторчик для авто применить. А там уже так не поработать. Обратная связь по положению ротора нужна. И самое простое тут - датчики Холла :laughing:

На 3d rc вертолетах во всю используют гувернер оборотов (система поддержания постоянных оборотов) либо в регуляторе либо в flybarless system (ФБЛке), если гувернер используют в ФБЛке то, сейчас, обычно берут (цифру) с регулятора, либо используют датчик оборотов в простом случае это припаянные провода на два провода из трех от регулятора к двигателю.

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

 

 

Я предельно ясно выразилась - "держат равновесие". Гироскоп определяет наклон. А Холлы - держат

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

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


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

Я предельно ясно выразилась - "держат равновесие". Гироскоп определяет наклон. А Холлы - держат

Тогда уж скорее мотор "держит". Или управляющее ПО. Но не Холлы. :laughing:

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


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

Тут недавно была информация про плату https://www.terraelectronica.ru/news/4985?u...icroelectronics

Вот к ней почти все доступно и исходники и плата.

Можно посмотреть что и как реализовано.

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


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

Зачем дублировать одну и ту же информацию? Это же не робот у которого надо знать положение колесика.

Вы о чём? :wacko:

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


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

Вы о чём? :wacko:

О том что для удержания площадки гироскопа в горизонтальном положении не надо дополнительно никаких датчиков Холла, достаточно гироскопа на самой площадке, ведь там не важно 5 или 10 см он отъедет в сторону для самовыравнивания.

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


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

О том что для удержания площадки гироскопа в горизонтальном положении не надо дополнительно никаких датчиков Холла, достаточно гироскопа на самой площадке, ведь там не важно 5 или 10 см он отъедет в сторону для самовыравнивания.

Вы мне то это зачем пишете? Я разве писал, что д.Холла для определения наклона? Почитайте мои сообщения....

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


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

Может вы не будете спорить, а ответите мне про deadtime? Вопрос был на предыдущей странице в конце

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


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

Может вы не будете спорить, а ответите мне про deadtime? Вопрос был на предыдущей странице в конце

Во-первых: у меня например это только первая страница. Размер страниц тут у всех свой. :laughing:

А во-вторых: почему отсутствует? Вы на процедуру commutation() внимательно посмотрите. Где там верхний и нижний ключи пересекаются?

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


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

Еще можете посмотреть исходники BLHeli https://github.com/bitdump/BLHeli , популярная открытая прошивка для регуляторов (авиа: дроны, вертолеты).

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


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

Что-то не получается у меня с ЭДС. Господа, взгляните на схему цепочки детектирования в статье в первом сообщении, на ту же схему, но выложенную мной в PDF и скажите, будет ли отличаться алгоритм работы с компаратором?

У меня ЭДС детектируется, прерывание срабатывает где надо (хотя впрочем, посмотрите на осциллограмму и оцените).

Но двигатель пищит и не стартует.

 

ОСЦИЛЛОГРАММА - красный график - вход компаратора, синий - строка PORTD.3=~PORTD.3 в самом начале обработчика прерывания от компаратора, чтобы понять, в какой момент времени он срабатывает.

 

 

Код (мне его пришлось переделать) привожу

 

#include <mega8.h>
#include <delay.h>

// Фаза U(Верхнее плечо)
#define UH_ON   PORTD.4=1;
#define UH_OFF  PORTD.4=0;

// Фаза U(Нижнее плечо)
#define UL_ON   PORTD.5=1;
#define UL_OFF  PORTD.5=0;

// Фаза V(Верхнее плечо)
#define VH_ON   PORTC.5=1;
#define VH_OFF  PORTC.5=0;

// Фаза V(Нижнее плечо)
#define VL_ON   PORTC.4=1;
#define VL_OFF  PORTC.4=0;

// Фаза W(Верхнее плечо)
#define WH_ON   PORTC.3=1;
#define WH_OFF  PORTC.3=0;

// Фаза W(Нижнее плечо)
#define WL_ON   PORTB.0=1;
#define WL_OFF  PORTB.0=0;

#define PHASE_ALL_OFF   UH_OFF;UL_OFF;VH_OFF;VL_OFF;WH_OFF;WL_OFF;

#define SENSE_U     ADMUX = 6; // Вход обратной ЭДС фазы U 
#define SENSE_V     ADMUX = 7; // Вход обратной ЭДС фазы V
#define SENSE_W     ADMUX = 0; // Вход обратной ЭДС фазы W

#define SENSE_UVW   (ACSR&(1 << ACO)) // Выход компаратора

#define START_PWM   10 // Минимальный ШИМ при запуске
#define WORK_PWM   100 // Рабочий уровень ШИМ

unsigned char start_stop = 0;
unsigned char current_phase = 0;
volatile unsigned char motor_pwm = WORK_PWM;
volatile unsigned char commutation_step = 0;
volatile unsigned char rotor_run = 0; // Счетчик импульсов обратной ЭДС

// Крутим по часовой стрелке
void commutation(unsigned char startup)
{
    switch (commutation_step)
    {
        case (0):
            if(!SENSE_UVW || startup) 
            {
                UH_ON; // На фазе U - ШИМ
                WH_OFF; // Фаза W отключена
                SENSE_W; // Активируем вход фазы W
                commutation_step = 1; // Следующий шаг
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;

        case (1):
            if(SENSE_UVW || startup)
            {
                VL_OFF; // На фазе V - лог. 0
                WL_ON;  // На Фазе W - лог. 1
                SENSE_V; // Активируем вход фазы V
                commutation_step = 2;
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;

        case (2):
            if(!SENSE_UVW || startup)
            {
                UH_OFF; // Фаза U отключена
                VH_ON;  // На фазе V - ШИМ     
                SENSE_U; // Активируем вход фазы U
                commutation_step = 3;
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;
     
        case (3):
            if(SENSE_UVW || startup)
            {
                UL_ON;  // На фазе U - лог. 1
                WL_OFF; // На Фаза W - лог. 0
                SENSE_W; // Активируем вход фазы W
                commutation_step = 4;
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;

         case (4):
            if(!SENSE_UVW || startup)
            {
                VH_OFF;  // Фаза V отключена
                WH_ON;   // На фазе W - ШИМ
                SENSE_V; // Активируем вход фазы V
                commutation_step = 5;
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;

        case (5):
            if(SENSE_UVW || startup)
            {
                UL_OFF; // На фазе U - лог. 0
                VL_ON;  // На Фазе V - лог. 1
                SENSE_U; // Активируем вход фазы U
                commutation_step = 0;
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;
    }
}
// Обработчик прерывания по компаратору. Детектор обратной ЭДС


// Analog Comparator interrupt service routine
interrupt [ANA_COMP] void ana_comp_isr(void)
{
PORTD.3=~PORTD.3;
rotor_run++; // инкрементируем импульсы
if(rotor_run > 200) rotor_run = 200;
if(rotor_run == 200) // Если импульсы обратной ЭДС присутствуют, крутим наполную 
{

commutation(0);

}
}

// Обработчик прерывания по переполнению Т0. Работа двигателя без сигналов обратной ЭДС
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{   

commutation(1); // Если сработало прерывание, есть пропуски импульсов обратной ЭДС
rotor_run = 0;  // Сбрасываем счетчик импульсов

}

// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
         
/*
// // ЭТО ПОПЫТКА СДЕЛАТЬ ПРОГРАМНМНЫЙ ШИМ, РАЗБЕРУСЬ ПОТОМ
   if (commutation_step==0) UH_ON;
   if (commutation_step==2) VH_ON;
   if (commutation_step==4) WH_ON;
  */ 
   
       
}

// Timer2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
         
// ЭТО ПОПЫТКА СДЕЛАТЬ ПРОГРАМНМНЫЙ ШИМ, РАЗБЕРУСЬ ПОТОМ
    /*
   if (commutation_step==0) UH_OFF;
   if (commutation_step==2) VH_OFF;
   if (commutation_step==4) WH_OFF;
   */  
}



void main(void)
{


// Порты ввода/вывода

DDRD.4=1; // UH
DDRD.5=1; // UL
DDRC.5=1; // VH
DDRC.4=1; // VL
DDRC.3=1; // WH
DDRB.0=1; // WL

DDRD.3=1;
PORTD.3=0;

/*
while(1)
{

PORTD.4=1; // UH
PORTD.5=0; // UL
PORTC.5=1; // VH
PORTC.4=0; // VL
PORTC.3=1; // WH
PORTB.0=0; // WL
delay_ms(10);

PORTD.4=0; // UH
PORTD.5=0; // UL
PORTC.5=0; // VH
PORTC.4=0; // VL
PORTC.3=0; // WH
PORTB.0=0; // WL
delay_ms(10);
  
}
  */
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 15,625 kHz
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x02;
OCR2=20;

// T0 - для старта и работы двигателя без сигналов обратной ЭДС
TCCR0=0x05;

TIMSK |= (1 << TOIE0)| (1 << TOIE2)|(1 << OCIE2); // Разрешаем прерывание по переполнению T0

                                                                                      

PHASE_ALL_OFF; // Выключаем все фазы 
     
// Аналаговый компаратор
ADCSRA &= ~(1 << ADEN); // Выключаем АЦП
SFIOR |= (1 << ACME); // Отрицательный вход компаратора подключаем к выходу мультиплексора АЦП
ACSR |= (1 << ACIE); // Разрешаем прерывания от компаратора

#asm("sei") // Глобально разрешаем прерывания

start_stop=1;

if(start_stop)
{

ACSR |= (1 << ACIE); // Разрешаем прерывание от компаратора
TIMSK |= (1 << TOIE0)| (1 << TOIE2)|(1 << OCIE2); // Разрешаем прерывание по переполнению T0
  
  
  if(rotor_run == 200) // Если импульсы обратной ЭДС присутствуют, можем менять ШИМ
  {
   // OCR2=0x0F;
  }

}
else
{

PHASE_ALL_OFF; // Все фазы выключены
ACSR &= ~(1 << ACIE); // Запрещаем прерывание от компаратора
TIMSK &= ~(1 << TOIE0); // Запрещаем прерывание по переполнению T0

}

}

post-64708-1528638982_thumb.jpg

Изменено пользователем murmur

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


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

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

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

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

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

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

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

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

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

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