1. В сообществе нашего форума Вконтакте создан раздел по продаже электронных компонентов.
    Каждый может продать в нем свои залежавшиеся детали. Подробности здесь.

Hoverboard Hack

Тема в разделе "STM8/STM32", создана пользователем timsoon, 11 июн 2018.

  1. timsoon

    timsoon В доску свой

    Сообщения:
    373
    Симпатии:
    44
    Род занятий:
    КИПиА, it, и прочее
    Адрес:
    г.Капчагай
    Всех приветствую.
    Вот задался таким вопросом: поиск решений для управления BLDC моторами с датчиками холла.
    Двигаюсь в двух направлениях : Самодельный драйвер и применение гироскутеровских плат.
    Кто может помочь с кодом, и там и там.
    В самодельной плате надо дописать резкий реверс и торможение.
    А по переделке гириков , нашел готовый проект на гитхаб, не могу переделать под свои нужды - опыта в стм32 с гулькин ...
    Если у кого коммерческий подход, скажите цену - рассмотрю.
    что есть - прилагается :
     
    : Hoverboard, bldc
  2. timsoon

    timsoon В доску свой

    Сообщения:
    373
    Симпатии:
    44
    Род занятий:
    КИПиА, it, и прочее
    Адрес:
    г.Капчагай
    По самоделу(обращался к знакомому Володе, все совпадения случайны:)):
    Код:
    /*
    * GccApplication1.c
    *
    * Created: 24.11.2017 19:37:48
    *  Author: iskan
    */
    
    
    // Подключение бесколлекторного двигателя к AVR(с датчиками Холла)
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    // Фаза U(Верхнее плечо)
    #define UH_ON   TCCR0A |=  (1 << COM0A1);
    #define UH_OFF  TCCR0A &= ~(1 << COM0A1);
    
    // Фаза U(Нижнее плечо)
    #define UL_ON   PORTD |=  (1 << PD7);
    #define UL_OFF  PORTD &= ~(1 << PD7);
    
    // Фаза V(Верхнее плечо)
    #define VH_ON   TCCR0A |=  (1 << COM0B1);
    #define VH_OFF  TCCR0A &= ~(1 << COM0B1);
    
    // Фаза V(Нижнее плечо)
    #define VL_ON   PORTD |=  (1 << PD4);
    #define VL_OFF  PORTD &= ~(1 << PD4);
    
    // Фаза W(Верхнее плечо)
    #define WH_ON   TCCR2A |=  (1 << COM2B1);
    #define WH_OFF  TCCR2A &= ~(1 << COM2B1);
    
    // Фаза W(Нижнее плечо)
    #define WL_ON   PORTD |=  (1 << PD2);
    #define WL_OFF  PORTD &= ~(1 << PD2);
    
    unsigned char speed;
    
    // Обработчик внешнего прерывания
    ISR(PCINT0_vect)
    {
        unsigned char position;
        // Считываем значения датчиков
        position = (PINB & ((1 << PB2)|(1 << PB1)|(1 << PB0)));
        switch(position) // Переключаем обмотки
        {
            case 5: UH_ON; UL_OFF; VH_OFF; VL_ON; WH_OFF; WL_OFF; break;
            case 1: UH_ON; UL_OFF; VH_OFF; VL_OFF; WH_OFF; WL_ON; break;
            case 3: UH_OFF; UL_OFF; VH_ON; VL_OFF; WH_OFF; WL_ON; break;
            case 2: UH_OFF; UL_ON; VH_ON; VL_OFF; WH_OFF; WL_OFF; break;
            case 6: UH_OFF; UL_ON; VH_OFF; VL_OFF; WH_ON; WL_OFF; break;
            case 4: UH_OFF; UL_OFF; VH_OFF; VL_ON; WH_ON; WL_OFF; break;
        }
        PORTC = position;
    }
    
    // Функция изменения скорости
    static void set_speed(unsigned char speed)
    {
        TIFR0 = TIFR0;    // Очищаем флаг прерывания TC0
        while( !(TIFR0 & (1<<TOV0)));  // Ждем переполнения таймера
        cli();
        OCR0A = speed; // Изменяем ШИМ
        OCR0B = speed;
        OCR2B = speed;
        sei();
    }
    
    int main( void )
    {
        TCCR0A |= (1 << COM0A1)|(0 << COM0A0)| // Сброс вывода OC0A при совпадении
        (1 << COM0B1)|(0 << COM0B0)| // Сброс вывода OC0B при совпадении
        (1 << WGM01)|(1 << WGM00); // Режим Fast PWM
        TCCR0B |= (1 << CS00); // Предделитель CLK/1
      
        TCCR2A |= (1 << COM2B1)|(0 << COM2B0)| // Сброс вывода OC2B при совпадении
        (1 << WGM01)|(1 << WGM00);   // Режим Fast PWM
        TCCR2B |= (1 << CS20); // // Предделитель CLK/1
      
        PCMSK0 |= (1 << PCINT2)|(1 << PCINT1)|(1 << PCINT0); // Активируем входы внешних прерываний
        PCICR |= (1 << PCIE0);    // Разрешаем прерывание по изменению состояния порта B
      
        ADMUX |= (1 << MUX1)|(1 << MUX0); // Вход ADC3
        ADCSRA |= (1 << ADEN) | (1 << ADPS1); // Разрешаем АЦП, предделитель на 4
      
        DDRC |= (1 << PC2)|(1 << PC1)|(1 << PC0); // Порт С - выход(светодиоды)
        PORTC &= ~(1 << PC2)|(1 << PC1)|(1 << PC0);
      
        DDRB |=  (1 << PB2)|(1 << PB1)|(1 << PB0); // Кратковреммено подаем лог.1 на входы датчиков
        PORTB |= (1 << PB2)|(1 << PB1)|(1 << PB0); // для первоначального запуска двигателя
        PORTB &= ~(1 << PB2)|(1 << PB1)|(1 << PB0);
      
        DDRB = 0x00; // Порт B - вход
      
        sei(); // Глобально разрешаем прерывания
      
        DDRD = 0xFF; // Порт D - выход
      
        while(1)
        {
            ADCSRA |= (1 << ADSC); // Запускаем преобразование АЦП
            while ( ADCSRA & (1 << ADSC) ); // Ждем окончания преобразования
            speed = ADC/4; // Считываем АЦП
            set_speed(speed); // Изменяем скорость
        }
    }

    Вложения:

    Последнее редактирование: 11 июн 2018
  3. timsoon

    timsoon В доску свой

    Сообщения:
    373
    Симпатии:
    44
    Род занятий:
    КИПиА, it, и прочее
    Адрес:
    г.Капчагай
    По другому пути пошел пока результат таков:
    Последнее редактирование: 29 июн 2018
  4. timsoon

    timsoon В доску свой

    Сообщения:
    373
    Симпатии:
    44
    Род занятий:
    КИПиА, it, и прочее
    Адрес:
    г.Капчагай

    --- Сообщения объединены, 6 авг 2018 ---
    radioengineer и Buba_Chkhadze нравится это.

Поделиться этой страницей