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

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

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

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

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

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

Далее, из имеющегося блока электроусилителя руля, работающего на трехфазный мотор, изымаем блок силовых транзисторов. К сожалению, использовать его как полноценный блок управления трехфазным мотором (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, но мотору не мешает.
Источник

Оставить комментарий

Вы можете использовать следующие теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>