Проверка возможностей автомобильного генератора в качестве электродвигателя.

Решил провести эксперимент, по возможности использования генератора от легкового автомобиля, как тягового двигателя с прямым приводом на колесо, для велосипеда или что-либо подобного.
У меня как раз есть исправный генератор, но использовать его в автомобиль я не могу, как и некоторые другие вещи, но зато попробую провести этот эксперимент сам. В интернете на специализированных форумах есть размышления, что так не делают, что и в конструкции генератора специально особым образом подобраны формы ротора и статора, для работы его как генератора. Да и наличие отдельной катушки возбуждения усложняет конструкцию. Но из достоинств – генератор не создает практически никаких сопротивлений вращению, если на него не подан ток, и он есть за бесплатно. Заниматься самому математическим анализом реализации такой возможности, нет достаточного опыта и данных, пока (если кто разложит все по полочкам — буду признателен).
Схема подключения генератора:





Генератор был аккуратно разобран:



Из него был удален диодный мост и схема регулятора напряжения, подключены провода к обмоткам генератора, и щеточному узлу катушки возбуждения:



Затем все было собрано аккуратно и стало иметь такой вид:



Скрепка – торчащая из задней крышки генератора, фиксирует подпружиненные щетки в заглубленном состоянии, что позволяет правильно установить заднюю крышку, ничего не сломав. Затем скрепка вытягивается, и щетки упираются в коллектор.

Далее, из имеющегося блока электроусилителя руля, работающего на трехфазный мотор, изымаем блок силовых транзисторов. К сожалению, использовать его как полноценный блок управления трехфазным мотором (BLDC) нельзя.



Поэтому подключим блок силовых транзисторов к имеющейся плате 2CAN (описано ранее), через самодельную плату с драйверами управления транзисторами. А так как лето у нас короткое, то плата сделана самым простым и быстрым проверенным способом лазерной печати и утюга:



Общая схема получилась примерно такая:



Так как на плате 2CAN разведены не все выводы платы и микроконтроллера, пришлось добавить соединений навесным монтажом:



Написана простая программа управления трехфазным двигателем, используя таймер №1.Пока решил не использовать датчики положения ротора, ограничившись только регулировкой частоты вращения и заполнением ШИМ (амплитуду синусоид). Если генератор покажет оптимистичные характеристики, то тогда и усложню схему и программу. Форму напряжения выбрал синусоидальную, коэффициенты для таймера рассчитал простой программой на javascript, (позволяет писать программы в любом текстовом редакторе и запускать на выполнение любым браузером), файл sine.html (в zip) прилагаю ниже.

При открытии его браузером, можно просмотреть значения, и скопировать в буфер обмена:


Такая конструкция получилось в итоге:



Форма результирующего напряжения двух фаз такая (осциллограф двухлучевой к сожалению):



(после простого R-C фильтра для щупа осциллографа), а так без фильтра на прямую:



В качестве источника питания был выбран аккумулятор 12В 7А, через предохранитель 30 Ампер питание подавалось на схему. Обороты генератора, которые меня интересовали, были в пределах от 0 до 420 оборотов в минуту. Исходя из того, что если на шкив генератора надеть колесо диаметром 20 см, и при этом скорость максимальную ограничить в 16км/час. Подключим генератор:



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



Далее все расчеты довольно примитивны, и возможно есть ошибки. В качестве груза выбрал две 5-литровых емкости с водой. При диаметре шкива 5,5см, генератор с уверенно поднимал этот груз при 50 % заполнении ШИМ таймера на высоту 50 см за 3 секунды. Ток от аккумулятора составлял порядка 16 Ампер, но и напряжение на нем падало до 11 Вольт (слабоват аккумулятор). Получается, гарантирован крутящий момент примерно 2,75 ньютона на метр, при 3 оборотах в секунду. Сила тяги генератора с колесом диаметром 20см, одетого напрямую на вал, составила бы 12,5 ньютона (условная скорость составила бы примерно 7км/час). Для ребёнка, стоящего на роликах может быть и хватит. Для реализации полной мощности потребовался бы аккумулятор большей емкости, и более толстые провода. Без нагрузки, генератор вращается без подачи тока на катушку возбуждения (как несинхронный трехфазный электродвигатель). По идее, учитывая, что при потребляемой мощности в 176 ватт, получаем мощность на совершение работы, очень примерно оцененной в 16 Ватт, КПД полученного устройства не радует. Даже если удастся увеличить КПД использованием датчиков положения ротора в два -три раза, тяга маловата все таки для взрослого человека. Значительная часть тока тратится на катушку возбуждения, при этом, в зависимости от нагрузки, оборотов и температуры генератора составляет это порядка 5 — 12 Ампер. Да и генератор в родном рабочем режиме крутится на горазбо более высоких оборотах (2100 — 18000 об/мин). Выходить на рабочие токи больше 30 Ампер в схеме посчитал нецелесообразным. Конечно, используя мотор с постоянными магнитами, можно значительно поднять КПД устройства. Но все равно, значительные токи в узлах схемы, при напряжении питания в 12 Вольт, не позволяют добиться приемлемых параметров при длительной работе мотора в тяговом режиме. А перематывать катушки статора генератора под другое напряжение, количество оборотов, делать ротор с неодимовыми магнитами — это уже надо быть сильно мотивированным на это. Практичнее переходить на готовые, относительно легко доступные BLDC моторы для велосипедов, скутеров и т.д. с напряжением 36 Вольт и более. Также был подключен оригинальный двигатель, и это совсем другая тема и возможности:



В автомобильных вентиляторах охлаждения, часто применяются двухфазные электродвигатели с постоянными магнитами, выдавая мощность под 300ватт (но коррозия и большие токи зачастую выводят из строя компактную схему управления, встроенную в мотор).

Других целей больше не было, остался удовлетворенным полученным отрицательным результатом :)

Приведу настройки таймера:

void    init_motor_pin(void)
{
        GPIO_InitTypeDef               GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(    RCC_APB2Periph_GPIOA    |
                                                        RCC_APB2Periph_GPIOB    |
                                                        RCC_APB2Periph_GPIOC    |
                                                        RCC_APB2Periph_AFIO        ,
                                                        ENABLE);
        //выводы нижних ключей драйвера TIM1_CH1-CH3
        GPIO_InitStructure.GPIO_Pin = CH1_GPIO_PIN | CH2_GPIO_PIN | CH3_GPIO_PIN;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
      GPIO_Init(CH123_GPIO_PORT,    &GPIO_InitStructure);
        //выводы верхних  ключей драйвера TIM1_CH1N-CH3N
        GPIO_InitStructure.GPIO_Pin = CH1N_GPIO_PIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
      GPIO_Init(CH1N_GPIO_PORT,    &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = CH2N_GPIO_PIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
      GPIO_Init(CH2N_GPIO_PORT,    &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = CH3N_GPIO_PIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
      GPIO_Init(CH3N_GPIO_PORT,    &GPIO_InitStructure);
        //выводы надо правильно сконфигуриовать
        //TIM1_CH1->PA8,TIM1_CH2->PA9,TIM1_CH3->PA10
        //TIM1_CH1N->PA7,TIM1_CH2N->PB0,TIM1_CH3N->PB1
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE);
        //вывод управления тока катушки возбуждения TIM3_CH1
        GPIO_InitStructure.GPIO_Pin = MG_GPIO_PIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
      GPIO_Init(MG_GPIO_PORT,    &GPIO_InitStructure);
        GPIO_PinRemapConfig( GPIO_FullRemap_TIM3, ENABLE );

        //резистор оборотов
        GPIO_InitStructure.GPIO_Pin = Rob_GPIO_PIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
      GPIO_Init(Rob_GPIO_PORT,    &GPIO_InitStructure);
        //резистор ШИМ
        GPIO_InitStructure.GPIO_Pin = Rpwm_GPIO_PIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
      GPIO_Init(Rpwm_GPIO_PORT,    &GPIO_InitStructure);
        //датчик напряжения батареи
        GPIO_InitStructure.GPIO_Pin = Vbatt_GPIO_PIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
      GPIO_Init(Vbatt_GPIO_PORT,    &GPIO_InitStructure);
}
//настроим таймер TIM1 в режим работы PWM канала CH1,CH1N,CH2,CH2N,CH3,CH3N,   
void    init_motor_tim1(void)
{
        TIM_TimeBaseInitTypeDef TIM_BaseConfig;                        // Конфигурация таймера
    TIM_OCInitTypeDef             TIM_OCConfig;                            // Конфигурация выхода таймера
        TIM_BDTRInitTypeDef         bdtr;
        RCC_APB2PeriphClockCmd(    RCC_APB2Periph_TIM1,    ENABLE);             //включим тактирование таймера TIM1
        //так как максимальная частота таймера 1 72МГЦ
        //зададим ее 24000*100, тогда прескалер для таймера = (SystemCoreClock / (24000 * 100)) — 1
    TIM_BaseConfig.TIM_Prescaler =  (uint16_t) (SystemCoreClock / (24000 * 100)) — 1;    //делим на 30
    TIM_BaseConfig.TIM_Period = 100-1;                    // Период — 100
    TIM_BaseConfig.TIM_ClockDivision = 0;                // Отсчет от нуля до TIM_Period
    TIM_BaseConfig.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_ARRPreloadConfig(TIM1, ENABLE);
    TIM_TimeBaseInit(TIM1, &TIM_BaseConfig);    // Инициализируем таймер №1
    //Конфигурируем выход 1    таймера, режим — PWM1
        //для обычной полярности
        TIM_OCConfig.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable;                    // Собственно — выход включен
      TIM_OCConfig.TIM_OCPolarity = TIM_OCPolarity_High;                            // Полярность => пульс — это единица (+3.3V)
    TIM_OCConfig.TIM_OutputNState = TIM_OutputNState_Enable;                //это для парных выходов
    TIM_OCConfig.TIM_OCNPolarity = TIM_OCPolarity_High;                            //TIM_OCNPolarity_Low;            //полярность для N выходов
    TIM_OCConfig.TIM_OCIdleState = TIM_OCIdleState_Set;                            //что делать в момент ожидания
    TIM_OCConfig.TIM_OCNIdleState = TIM_OCIdleState_Reset;    

    // Конфигурируем CH1->PA8        таймера, режим — PWM1
    TIM_OCConfig.TIM_Pulse = 30;        //для примера
    TIM_OC1Init(TIM1, &TIM_OCConfig);
        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);                //автоматическая перезагрузка таймера
    // Конфигурируем CH2->PA9        таймера, режим — PWM1
    TIM_OCConfig.TIM_Pulse = 40;        //для примера
        TIM_OC2Init(TIM1, &TIM_OCConfig);
        TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);                //автоматическая перезагрузка таймера
        // Конфигурируем CH3->PA10    таймера, режим — PWM1
    TIM_OCConfig.TIM_Pulse = 40;        //для примера
    TIM_OC3Init(TIM1, &TIM_OCConfig);
        TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);                //автоматическая перезагрузка таймера

        TIM_BDTRStructInit(&bdtr);
        bdtr.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
        bdtr.TIM_DeadTime = 64;//24*4;                                     // разница во фронтах 1мкс при таких значениях
        TIM_BDTRConfig(TIM1, &bdtr);

    TIM_Cmd(TIM1, ENABLE);                                                                // Включаем таймер
        TIM_CtrlPWMOutputs(TIM1, ENABLE);                                             // Пуск PWM выходов
}
//настроим таймер TIM3 в режим работы PWM канала CH1    (ок, все работает в PC6)
void    init_motor_tim3(void)
{
        TIM_TimeBaseInitTypeDef TIM_BaseConfig;            // Конфигурация таймера
    TIM_OCInitTypeDef TIM_OCConfig;                            // Конфигурация выхода таймера
        //включим тактирование таймера TIM3
        RCC_APB1PeriphClockCmd(    RCC_APB1Periph_TIM3,    ENABLE);    
        //так как максимальная частота таймеров 2,3,4, 36МГЦ
        //период перезагрузки таймера составит 2400000/100=24000
    TIM_BaseConfig.TIM_Prescaler = (uint16_t) (SystemCoreClock / (24000*100)) — 1;    //делим на 30
    // Период — 100 тактов => 2400000/100 = 24000 Hz
    TIM_BaseConfig.TIM_Period = 100;
    TIM_BaseConfig.TIM_ClockDivision = 0;
    // Отсчет от нуля до TIM_Period
    TIM_BaseConfig.TIM_CounterMode = TIM_CounterMode_Up;
    // Инициализируем таймер №3
    TIM_TimeBaseInit(TIM3, &TIM_BaseConfig);
    // Конфигурируем выход таймера, режим — PWM1
    TIM_OCConfig.TIM_OCMode = TIM_OCMode_PWM1;
    // Собственно — выход включен
    TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable;
    // Пульс длинной 50 тактов => 50/100 = 50%
    TIM_OCConfig.TIM_Pulse = 50;        //для примера
    // Полярность => пульс — это единица (+3.3V)
    TIM_OCConfig.TIM_OCPolarity = TIM_OCPolarity_High;
    // Инициализируем первый выход таймера №1 (нам надо ремап на PC6)
    TIM_OC1Init(TIM3, &TIM_OCConfig);
        //автоматическая перезагрузка таймера
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
    TIM_ARRPreloadConfig(TIM3, ENABLE);
    // Включаем таймер
    TIM_Cmd(TIM3, ENABLE);
}
//    таймер настроим на частоты кратные времени (60) для удобства
//    по событиям таймера 4 будет происходить загрузка новых значений для ШИМ для таймера 1
//    настроим таймер 4 на (48000) прерываний в секунду, что могли с запасом варьировать обороты
//    72000000/(48000*100)=15
void    init_motor_tim4(void)
{
    TIM_TimeBaseInitTypeDef TIM_BaseConfig;            // подключаем структуру таймера
    NVIC_InitTypeDef                 NVIC_InitStructure;    // контроллера прерываний
    RCC_APB1PeriphClockCmd(    RCC_APB1Periph_TIM4,    ENABLE);    //включаем таймер 4
  TIM_BaseConfig.TIM_Prescaler =  (uint16_t) (SystemCoreClock / (48000*100)) — 1;    //
  TIM_BaseConfig.TIM_Period = 100-1;
    TIM_BaseConfig.TIM_ClockDivision = 0;
    TIM_BaseConfig.TIM_CounterMode = TIM_CounterMode_Up; //прямой счет
    TIM_TimeBaseInit(TIM4, &TIM_BaseConfig);         //производится базовая инициализация таймера
    TIM_ARRPreloadConfig(TIM4, ENABLE);                 //включает использование регистра предзагрузки ARR
    TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);        //конфигурируем прерывание по переполнению таймера (TIM_IT_Update)
    TIM_Cmd(TIM4, ENABLE);                                            //запускается таймер
    //добавим прерывание по таймеру 4
    NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
//по событиям таймера 4 проверяем не надо ли перезагрузить таймеры новыми значениями
void    motor_div(void)
{
    if(mot_tmp>=mot_div)
    {
        //загрузим очередные значения в таймеры, какждый из своей таблицы
        TIM1->CCR1=(amp_motor*sina[table_sin])/100;
        TIM1->CCR2=(amp_motor*sinb[table_sin])/100;
        TIM1->CCR3=(amp_motor*sinc[table_sin])/100;
        TIM3->CCR1=amp_motor;

        table_sin++;                                            //подготовимся к следующему элементу таблицы
        if(table_sin>=100){table_sin=0;}    //вернемся на начало если дошли до конца
        mot_tmp=0;                                                //сбросим
    }
    else
    {
        mot_tmp++;
    }
}


А табличные значения получаем как написано выше (редактируем имя распечатываемого на экран массива ) :) Плохо что видео нельзя тут приложить, довольно забавно. Если есть вопросы – без проблем задавайте, пишите :)

С уважением, Астанин Сергей, ICQ 164487932.

Добавил сам проект, правда внутри много лишнего осталось от проекта общения по CAN, но мотору не мешает.
  • +7
  • 18 февраля 2016, 18:58
  • astaninss
  • 2
Файлы в топике: sine.zip, 2canMotor.zip

Комментарии (10)

RSS свернуть / развернуть
В целом интересно, но как то сумбурно изложено. Как то всё в кучу, при этом детали рассмотрены поверхостно. Имеет смысл поработать над стилем изложения. Как говорили ещё в школе, хорошую статью надо писать с ПЛАНОМ.
+5
Ели мне картинка не изменяет в глазах, то там электроусилитель ТАЗ-овский?
0
  • avatar
  • kalik
  • 18 февраля 2016, 23:58
Плохо что видео нельзя тут приложить, довольно забавно.
Можно. Заливаешь на ютуб, получаешь ссылку вида
http://www.youtube.com/watch?v=xxxxxxxxxx
и вставляешь ее в тег video.
0
  • avatar
  • Vga
  • 19 февраля 2016, 10:12
ок, добавлю, это еще со старого сайта текст остался…
0
Еще обрати внимание, под каждым комментарием есть ссылка «ответить». Используй ее для ответа на конкретный комментарий.
0
Лучше уж тогда стартер использовать. Особенно новые, импортные — с магнитами и планетаркой.
Моща под киловатт.
Коллега делал ребенку багги со стартером от ЗиЛа в качестве двигла. Управление шимом на 555 :)
Потом заменил на обычный бензиновый движок. Надоело аккумулятор заряжать по три раза на дню.
0
Я не очень понял какой тип двигателя, шетки наталкивают на мысль о DC а вот синусоида уже к асинхронам… уточните этот момент)
0
По видимому, синхронная машина. Щетки — для обмотки возбуждения на роторе.
0
Генератор с Субару?
0
Диоды в выпрямителе что, в корпусе ТО-247 что ли?
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.