Можно ли генератор использовать как электродвигатель
Содержание статьи
Проверка возможностей автомобильного генератора в качестве электродвигателя.
Решил провести эксперимент, по возможности использования генератора от легкового автомобиля, как тягового двигателя с прямым приводом на колесо, для велосипеда или что-либо подобного.
У меня как раз есть исправный генератор, но использовать его в автомобиль я не могу, как и некоторые другие вещи, но зато попробую провести этот эксперимент сам. В интернете на специализированных форумах есть размышления, что так не делают, что и в конструкции генератора специально особым образом подобраны формы ротора и статора, для работы его как генератора. Да и наличие отдельной катушки возбуждения усложняет конструкцию. Но из достоинств — генератор не создает практически никаких сопротивлений вращению, если на него не подан ток, и он есть за бесплатно. Заниматься самому математическим анализом реализации такой возможности, нет достаточного опыта и данных, пока (если кто разложит все по полочкам — буду признателен).
Схема подключения генератора:
Генератор был аккуратно разобран:
Из него был удален диодный мост и схема регулятора напряжения, подключены провода к обмоткам генератора, и щеточному узлу катушки возбуждения:
Затем все было собрано аккуратно и стало иметь такой вид:
Скрепка — торчащая из задней крышки генератора, фиксирует подпружиненные щетки в заглубленном состоянии, что позволяет правильно установить заднюю крышку, ничего не сломав. Затем скрепка вытягивается, и щетки упираются в коллектор.
Далее, из имеющегося блока электроусилителя руля, работающего на трехфазный мотор, изымаем блок силовых транзисторов. К сожалению, использовать его как полноценный блок управления трехфазным мотором (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_APB2PeriphCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO , ENABLE); //выводы нижних ключей драйвера TIM1_Ch2-CH3 GPIO_InitStructure.GPIO_Pin = Ch2_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(Ch223_GPIO_PORT, &GPIO_InitStructure); //выводы верхних ключей драйвера TIM1_Ch2N-CH3N 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 = 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_Ch2->PA8,TIM1_CH2->PA9,TIM1_CH3->PA10 //TIM1_Ch2N->PA7,TIM1_CH2N->PB0,TIM1_CH3N->PB1 GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE); //вывод управления тока катушки возбуждения TIM3_Ch2 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 канала Ch2,Ch2N,CH2,CH2N,CH3,CH3N, void init_motor_tim1(void) { TIM_BaseInitTypeDef TIM_BaseConfig; // Конфигурация таймера TIM_OCInitTypeDef TIM_OCConfig; // Конфигурация выхода таймера TIM_BDTRInitTypeDef bdtr; RCC_APB2PeriphCmd( RCC_APB2Periph_TIM1, ENABLE); //включим тактирование таймера TIM1 //так как максимальная частота таймера 1 72МГЦ //зададим ее 24000*100, тогда прескалер для таймера = (SystemCore / (24000 * 100)) — 1 TIM_BaseConfig.TIM_Prescaler = (uint16_t) (SystemCore / (24000 * 100)) — 1; //делим на 30 TIM_BaseConfig.TIM_Period = 100-1; // Период — 100 TIM_BaseConfig.TIM_Division = 0; // Отсчет от нуля до TIM_Period TIM_BaseConfig.TIM_CounterMode = TIM_CounterMode_Up; TIM_ARRPreloadConfig(TIM1, ENABLE); TIM_BaseInit(TIM1, &TIM_BaseConfig); // Инициализируем таймер №1 //Конфигурируем выход 1 таймера, режим — PWM1 //для обычной полярности TIM_OCConfig.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCConfig.TIM_Outpute = TIM_Outpute_Enable; // Собственно — выход включен TIM_OCConfig.TIM_OCPolarity = TIM_OCPolarity_High; // Полярность => пульс — это единица (+3.3V) TIM_OCConfig.TIM_OutputNe = TIM_OutputNe_Enable; //это для парных выходов TIM_OCConfig.TIM_OCNPolarity = TIM_OCPolarity_High; //TIM_OCNPolarity_Low; //полярность для N выходов TIM_OCConfig.TIM_OCIdlee = TIM_OCIdlee_Set; //что делать в момент ожидания TIM_OCConfig.TIM_OCNIdlee = TIM_OCIdlee_Reset; // Конфигурируем Ch2->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_Dead = 64;//24*4; // разница во фронтах 1мкс при таких значениях TIM_BDTRConfig(TIM1, &bdtr); TIM_Cmd(TIM1, ENABLE); // Включаем таймер TIM_CtrlPWMOutputs(TIM1, ENABLE); // Пуск PWM выходов } //настроим таймер TIM3 в режим работы PWM канала Ch2 (ок, все работает в PC6) void init_motor_tim3(void) { TIM_BaseInitTypeDef TIM_BaseConfig; // Конфигурация таймера TIM_OCInitTypeDef TIM_OCConfig; // Конфигурация выхода таймера //включим тактирование таймера TIM3 RCC_APB1PeriphCmd( RCC_APB1Periph_TIM3, ENABLE); //так как максимальная частота таймеров 2,3,4, 36МГЦ //период перезагрузки таймера составит 2400000/100=24000 TIM_BaseConfig.TIM_Prescaler = (uint16_t) (SystemCore / (24000*100)) — 1; //делим на 30 // Период — 100 тактов => 2400000/100 = 24000 Hz TIM_BaseConfig.TIM_Period = 100; TIM_BaseConfig.TIM_Division = 0; // Отсчет от нуля до TIM_Period TIM_BaseConfig.TIM_CounterMode = TIM_CounterMode_Up; // Инициализируем таймер №3 TIM_BaseInit(TIM3, &TIM_BaseConfig); // Конфигурируем выход таймера, режим — PWM1 TIM_OCConfig.TIM_OCMode = TIM_OCMode_PWM1; // Собственно — выход включен TIM_OCConfig.TIM_Outpute = TIM_Outpute_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_BaseInitTypeDef TIM_BaseConfig; // подключаем структуру таймера NVIC_InitTypeDef NVIC_InitStructure; // контроллера прерываний RCC_APB1PeriphCmd( RCC_APB1Periph_TIM4, ENABLE); //включаем таймер 4 TIM_BaseConfig.TIM_Prescaler = (uint16_t) (SystemCore / (48000*100)) — 1; // TIM_BaseConfig.TIM_Period = 100-1; TIM_BaseConfig.TIM_Division = 0; TIM_BaseConfig.TIM_CounterMode = TIM_CounterMode_Up; //прямой счет TIM_BaseInit(TIM4, &TIM_BaseConfig); //производится базовая инициализация таймера TIM_ARRPreloadConfig(TIM4, ENABLE); //включает использование регистра предзагрузки ARR TIM_ITConfig(TIM4,TIM_IT_Up,ENABLE); //конфигурируем прерывание по переполнению таймера (TIM_IT_Up) 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, но мотору не мешает.
Источник
Как из автомобильного генератора сделать электродвигатель
Идея переделки автомобильного генератора в электродвигатель может быть интересна тем, у кого уже есть ненужный генератор. Плюс ко всему в б/у состоянии исправные они стоят дёшево.
Автомобильный генератор
Автомобильный генератор представляет из себя трёхфазную синхронную машину с электромагнитным возбуждением. Стало быть и электродвигатель у нас получится трёхфазный синхронный с электромагнитным возбуждением. Так что если вы услышите от кого-то, что из такого вот генератора можно сделать именно BLDC-электродвигатель, то знайте, что этот кто-то избавляется от электромагнитного возбуждения и наклеивает постоянные магниты на ротор.
Откручиваем заднюю крышку
Итак, снимаем заднюю крышку и достаём оттуда щёткодержатель с графитовыми щётками. Через эти щётки происходит питание обмотки возбуждения ротора посредством их контактна с кольцами на валу. Как можно видеть, никаких постоянных магнитов здесь нет, а значит эта архитектура не является BLDC.
Вынимаем щёткодержатель с щётками
Удаляем безвозвратно полупроводниковый выпрямитель в чёрном пластиковом кожухе. Там ещё есть ограничитель напряжения. Всё это нам не понадобится. Изначально генератор вырабатывает трёхфазный переменный ток, а этот мост выпрямляет его.
Удаляем выпрямитель
Далее необходимо поставить щёткодержатель на место. Если же вы всё-таки решили делать именно BLDC-электродвигатель, то вам этот щёточно-кольцевой узел не понадобится. Щёткодержатель можно удалить, а кольца с вала просто срезать. Но в таком случае вам придётся извлечь ротор из статора и доработать его на токарном станке — снять слой железа и наклеить на его поверхность постоянные неодимовые магниты.
Ставим щёткодержатель с щётками на место
Однако эти магниты критичны к перегреву, и вам придётся как-то всё это охлаждать, что не всегда удобно. Если же не заморачиваться с магнитами, а оставить родное возбуждение, то никакие перегревы такому электромотору не страшны.
Соединяем статорную обмотку в «звезду», прозвонив её предварительно. Далее подключаем провода для питания обмотки возбуждения. Она запитывается постоянным напряжением не более 12 В.
Соединяем выводы обмоток в «звезду» и подключаем провода к щёткам
Теперь вы можете взять любой синусный контроллер от электровелосипеда, который не векторный и работает без датчиков Холла. Это важно, потому что у нас не BLDC-электромотор, а трёхфазный синхронный. Лучше брать контроллер с напряжением не выше 36 В, а иначе самодельный электромотор может перегреваться. Сила тока у этого контроллера до 14 А, и таким образом он может выдать электромотору до 500 Вт мощности.
Велосипедный контроллер на 36 В 14 А
На таких параметрах мощности самодельный электродвигатель работает продолжительно без перегрева. Если хотите большую мощность, то его работа будет кратковременной, или же нужно дополнительно приколхозить охлаждение. Постоянное напряжение для питания обмотки возбуждение 12 В лучше брать от DC/DC-преобразователя с 36 В в 12 В, или же можно запитать эту обмотку от 36 В, но через резистор.
Газулька
КПД такого электродвигателя конечно же меньше, чем у BLDC с неодимовыми магнитами. Ведь здесь расходуется дополнительная энергия на питание обмотки возбуждения.
Источник
Можно ли использовать электродвигатель как генератор
Всем известно, что работа электродвигателя — это преобразование электрической энергии в механическую. Удастся ли заставить его преобразовывать механическую энергию в электрическую, чтобы использовать электродвигатель как генератор? Благодаря действующему в электротехнике принципу обратимости это возможно. Но нужно четко знать принцип работы агрегата и создать условия, способствующие превращению.
Законы, позволяющие использовать асинхронный электродвигатель как генератор
В генераторе напряжение, обычно подаваемое с аккумулятора, возбуждает в обмотке якоря магнитное поле, вращение же обеспечивается любым физическим устройством. В электродвигателе возможность подачи напряжения на обмотку якоря не предусмотрена. Чтобы он не поглощал, а вырабатывал электроэнергию, магнитное поле необходимо создать искусственно.
В асинхронном двигателе вращающееся магнитное поле ротора «отстает» от поля статора, обеспечивая процесс перехода электроэнергии в механическую энергию. Следовательно, чтобы запустить обратный процесс, нужно сделать так, чтобы поле статора вращалось медленнее поля ротора, либо чтобы оно вращалось в противоположную сторону.
Способы переделки электродвигателя в генератор
Есть два способа «регулировки» магнитного поля статора.
Торможение реактивной нагрузкой
Сделать это можно с помощью мощной конденсаторной батареи. Включите ее в цепь питания двигателя, который работает в обычном режиме. Заряд, накопленный в батарее, будет в противофазе с зарядом, создаваемым питающим напряжением, что приведет к замедлению последнего. После этого двигатель вместо поглощения тока начинает генерировать его, отдавая в сеть.
Любой транспорт на электротяге работает именно благодаря этому эффекту — при «самостоятельном» движении под уклон механическая энергия не требуется, и конденсаторная батарея автоматически подключается к цепи питания. Вырабатываемая энергия подается в сеть, чтобы затем опять преобразоваться в механическую.
Самовозбуждение электродвигателя
Остаточное магнитное поле ротора может произвести ЭДС, достаточное для зарядки конденсатора. Вследствие этого возникает эффект самовозбуждения, что делает возможным переход двигателя в режим генерации электроэнергии. Непрерывность этого процесса обеспечивает конденсаторная батарея, подпитывающаяся от произведенного тока.
Этот способ является более действенным, и именно он подходит, если вы хотите применить асинхронный электродвигатель как генератор.
Что нужно знать, чтобы электродвигатель работал как генератор
При переделке двигателя в генератор следует учитывать следующие технические детали:
- Не пытайтесь использовать электролитические конденсаторы — они не пригодны для подключения в цепь. Вам нужны неполярные конденсаторные батареи.
- В трехфазных машинах конденсаторы могут включаться по схеме «треугольник» или «звезда». В первом случае величина напряжения на выходе выше, а во втором генерация начинается на меньших оборотах ротора. Выбирайте оптимальный для достижения вашей цели вариант.
- Однофазные асинхронные двигатели с короткозамкнутым ротором тоже могут генерировать электроэнергию. Запуск осуществляется с помощью фазосдвигающего конденсатора.
Поскольку определить необходимую величину емкости конденсаторной батареи невозможно, остается подбирать ее по весу — он должен быть равен весу двигателя или слегка превышать его.
Насколько эффективно использование электродвигателя в качестве генератора
У использования электродвигателя как генератора есть свои «плюсы»:
- Агрегат достаточно прост в обслуживании и экономичен, поскольку конденсатор получает энергию от остаточного поля ротора и от вырабатываемого тока.
- Практически отсутствуют «побочные» траты энергии на магнитные поля или бесполезный нагрев.
И «минусы»:
- Преобразованный в генератор двигатель чувствителен к перепадам нагрузки.
- Частота вырабатываемого тока часто нестабильна.
- Такой генератор не может обеспечить промышленную частоту тока.
Если в вашем случае преимущества перевешивают недостатки, то применение асинхронного генератора целесообразно.
Источник