PROGCONT.RU

Форма входа







Регистрпция Вход/

STM32F частотный преобразователь для трёхфазного асинхронного двигателя.

Ссылка на видео в YouTube Прежде чем вам начинать изучать данную тему прошу ознакомится с предыдущей статьёй «STM8S Простой частотник для трехфазного асинхронного двигателя» где я описываю как должно происходить управление трёхфазным двигателем с помощью ШИМ( широтно-импульсная модуляция), если заинтересуетесь созданием данного устройства то используйте мою программу для расчёта синуса ШИМ «Расчет таблицы SIN для управления асинхронным трехфазным двигателем» в разделе «Программы».

 В данном проекте в отличие от предыдущего будут использованы более продвинутые основные компоненты это конечно контроллер STM32F030C8 и драйвер силовых ключей IR2136 а вот драйвер LCD TM1628 был заменен с TM1638 просто из за дешевизны, в статье я тоже покажу принципиальную схему своего устройства, код программы, проект написанный для IAR который сможете запустить в компиляторе и конечно попробую всё это описать.


 Но НЕ выкладываю печатную плату потому что возможно допущены нарушения разводки силовой части которые могут быть опасны поэтому предлагаю включить голову и сделать самим!


Драйвер IR2136 и дополнительных сведения о несущей частоте.

нет рисункаНачнём изучение с драйвера IR2136 который предназначен для работы с трёхфазными двигателями.
 Данная микросхема имеет следующие преимущества:
   1) Сразу шесть выводов для управления верхними и нижними ключами силовых транзисторов;
   2) Защиту от между фазовой перегрузки;
   3) Защиту от одновременного включения транзистора верхнего и нижнего плеча;
   4) Входные выводы управления силовыми ключами внутри микросхемы подтянуты к стабилизированному напряжению 5.2 вольта, что облегчает управление и исключает непроизвольное включение силовых ключей при подачи напряжения на драйвер;
   5) Задержку( dead-time) меду включением верхнего и нижнего ключа;
 К недостаткам отнесу лишь один пункт это капризная система защиты которая срабатывает не только по превышению тока между фазами но и от разряда конденсаторов bootstrap схемы к чему может привести две ситуации первая это неправильное управление при старте силовыми ключами и второе нарушение разводки силовой части платы.

 Давайте разберем эти две проблемы, первая решается просто перед пуском мотора мы должны выключить верхние ключи а нижние включить, переждать некоторое время пока зарядятся конденсаторы bootstrap схемы( на рисунке ниже C2-C4 ёмкостью 4.7u).

 Вторая более сложная проблема это неправильная разводка силовой части платы из за которой будут происходить обратные выбросы напряжения на выводах VS1,2,3 драйвера IR2136 во время состояния мёртвого времени(одновременно закрыт верхний и нижний транзистор) в силовых ключах, что приводит к блокировки заряда конденсаторов bootstrap и соответственно дальнейший их разряд что приводит опять же к аварийному состоянию драйвера.
 Поэтому вам придётся соблюсти следующие правила при разводке силовой плат:
   а) использование коротких проводников максимально возможной толщины между ключами и драйвером, без петель и отклонений;
   б) избегание пересечений трасс и межслойных переходов они вносят дополнительно существенную паразитную индуктивность в цепь;
   в) снижение индуктивности выводов электрорадиоэлементов за счет снижения высоты расположения их корпусов над поверхностью печатной платы;
   г) размещение обоих ключей локализовано в «силовой» части в непосредственной близости от драйвера для максимального сокращения длины трасс;
   д) соединения цепей Vs и COM рекомендуется выполнять так, как изображено на рисунке ниже.

нет рисунка

 И немного о выборе несущей частоты генерации ШИМ, в частотных преобразователях с мощностью от 0.4 кВт до 4 кВт используются несущая частота в районе до 8 кГц и для мощностью более 5.5 кВт не должна превышать 4 кГц, что гарантирует самые низкие потери в преобразователе. Частота выбирается из рекомендуемого диапазона в зависимости от мощности двигателя, чем мощней тем ниже частота. Высокие частоты переключения создают в преобразователе дополнительное тепло, которое уменьшает срок службы преобразователя, потери являются результатом искажений в кабелях двигателя при высоких частотах. Это означает, что если бы преобразователь работал на более низкой частоте переключения, он мог бы обслуживать двигатель при меньших затратах энергии или обслуживать более крупный двигатель, но слишком сильное занижение частоты вызывает резонанс магнитных полей в статоре и роторе двигателя на определённых скоростях вращения, что приводит к вибрациям.

нет рисунка


Схема устройства.

 Устройство состоит из двух плат, платы управления и силовая часть.

нет рисунканет рисунка

 И фотографии плат, как получилось у меня.

нет рисунканет рисунка


Код программы.

 Основная часть программы где происходит всё управление работой частотного преобразователя, для IAR качаем готовый проект STM32_3_fase_moto.

#include "stm32f0xx.h"
#include "lcd_init.h"
#include "tim1_init.h"
void TIM1_BRK_UP_TRG_COM_IRQHandler( void);
//Положение фаз в таблице синуса.
uint8_t Fase1= 0;
uint8_t Fase2= 20;
uint8_t Fase3= 40;
//Продолжительность аварийного торможения.
uint16_t cycle_stop= 0;
/*Таблица ШИМ, минимальное значение 75 и максимальное не должно превышать 8000-75=7925, в 75 это 1/24000000*75= 3 микросекунды находится: 1 микросекунда это Dead-time + 2 микросекунды продолжительность HIN для IR2136( Data Sheet No. PD60166 revU, стр 5 под первой таблицей).*/
uint16_t Sin_pwm_tab[ 60]={ 4000, 4410, 4816, 5213, 5596, 5963, 6307, 6626, 6917, 7175, 7399, 7586, 7733, 7839, 7903, 7925,
7903, 7839, 7733, 7586, 7399, 7175, 6917, 6626, 6307, 5963, 5596, 5213, 4816, 4410, 4000, 3590, 3184, 2787, 2404, 2037, 1693,
1374, 1083, 825, 601, 414, 267, 161, 97, 75, 97, 161, 267, 414, 601, 825, 1083, 1374, 1693, 2037, 2404, 2787, 3184, 3590};
//Переменная для сканирования кнопок.
uint16_t scan_button= 0;
//Режим работы частотника.
uint16_t work= 0;

int main(){
RCC_DeInit();
FLASH_PrefetchBufferCmd( ENABLE);
FLASH_SetLatency( FLASH_Latency_1);
RCC_PLLConfig( RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);//SYSCLK=4Мгерц*12=48Мгерц.
RCC_PLLCmd( ENABLE); //Доступ к PLL разрешен.
while( RCC_GetFlagStatus( RCC_FLAG_PLLRDY)== RESET);//Ждем пока PLL не будет готов.
RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK); //Выбираем PLL как источник частоты.
while( RCC_GetSYSCLKSource()!= 0x08);//Ждем пока PLL не станет источником.
//Включаем тактирование выводов TIM1, LCD и управления IR2136.
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA |RCC_AHBPeriph_GPIOB, ENABLE);
//Настраиваем контроллер для работы с LCD.
Init_Lcd( );
//Настраиваем TIM1 и его выводы для работы с IR2136.
Init_Tim1( );
//Настройка выводов ENABLE ir2136 и включение реле питания ключей.
GPIO_InitTypeDef gpio_control;
gpio_control.GPIO_Pin= GPIO_Pin_9| GPIO_Pin_8;//Вывод включение реле и вывод включение ENABLE IR2136.
gpio_control.GPIO_Mode= GPIO_Mode_OUT;
gpio_control.GPIO_OType= GPIO_OType_PP;
gpio_control.GPIO_PuPd= GPIO_PuPd_NOPULL;
GPIO_Init( GPIOB, &gpio_control);
GPIO_ResetBits( GPIOB, GPIO_Pin_9);//Выключаем реле питания силового модуля.
GPIO_SetBits( GPIOB, GPIO_Pin_8);//Включаем ENABLE IR2136.
for( uint32_t i=0; i <10000000; i++);//Ожидание заряда конденсаторов и стабилизации IR2136.
GPIO_SetBits( GPIOB, GPIO_Pin_9);//Включаем реле питания силового модуля.
//Отображаем на LCD начальное состояние частотника.
Display_Rotation_Lcd( work, 0);

while( 1){
for( uint32_t i=0; i <100; i++);
//Сканирование кнопок.
scan_button= Scan_Button_Lcd();
for( uint32_t i=0; i <100; i++);
switch( scan_button){
//Меняем направление.
case 4:
work= 1;
if( TIM1->BDTR & TIM_BDTR_MOE){ Display_Rotation_Lcd( work, 5);}else{ Display_Rotation_Lcd( work, 0);}
break;
//Меняем направление.
case 8:
work= 0;
if( TIM1->BDTR & TIM_BDTR_MOE){ Display_Rotation_Lcd( work, 5);}else{ Display_Rotation_Lcd( work, 0);}
break;
//Остановка частотника.
case 16:
Stop_Pwm_Tim1( );
Display_Rotation_Lcd( work, 0);
break;
//Экстренное торможение.
case 32:
work= 2;
Display_Rotation_Lcd( 0, 0);
break;
//Пуск частотника.
case 64:
Start_Pwm_Tim1( );
Display_Rotation_Lcd( work, 5);
break;
default:
//По умолчанию.
break;
}
}
return 0;
}

void TIM1_BRK_UP_TRG_COM_IRQHandler( void){
//Прерывание от аварийной ситуации в драйвере IR2136.
if( TIM_GetFlagStatus( TIM1, TIM_FLAG_Break)){
TIM_ClearFlag( TIM1, TIM_FLAG_Break);
TIM_Cmd( TIM1, DISABLE);
}
//Прерывание от переполнения периода TIM1.
if( TIM_GetFlagStatus( TIM1, TIM_FLAG_Update)){
TIM_ClearFlag( TIM1, TIM_FLAG_Update);
//Вращение в одну сторону.
if( work== 0){
TIM_SetCompare1( TIM1, Sin_pwm_tab[ Fase1]);
TIM_SetCompare2( TIM1, Sin_pwm_tab[ Fase2]);
TIM_SetCompare3( TIM1, Sin_pwm_tab[ Fase3]);
Fase1++;
Fase2++;
Fase3++;
if( Fase1== 60) Fase1=0;
if( Fase2== 60) Fase2=0;
if( Fase3== 60) Fase3=0;
} //Вращение в другую сторону.
if( work== 1){
TIM_SetCompare1( TIM1, Sin_pwm_tab[ Fase2]);
TIM_SetCompare2( TIM1, Sin_pwm_tab[ Fase1]);
TIM_SetCompare3( TIM1, Sin_pwm_tab[ Fase3]);
Fase1++;
Fase2++;
Fase3++;
if( Fase1== 60) Fase1=0;
if( Fase2== 60) Fase2=0;
if( Fase3== 60) Fase3=0;
}
//Экстренное торможение.
if( work== 2){
if( cycle_stop< 800){
TIM_SetCompare1( TIM1, 0);
TIM_SetCompare2( TIM1, 0);
TIM_SetCompare3( TIM1, 2500);
cycle_stop++;
}else{ TIM_SetCompare3( TIM1, 0); Stop_Pwm_Tim1(); cycle_stop= 0; work= 0;}
}
}
}

 Код где выполняется настройка TIM1 для управления частотным преобразователем.

#include "tim1_init.h"
void Init_Tim1( void){
//Подключаем выводы к альтернативной функции TIM1.
GPIO_PinAFConfig( GPIOA, GPIO_PinSource8, GPIO_AF_2);//TIM1_CH1.
GPIO_PinAFConfig( GPIOA, GPIO_PinSource9, GPIO_AF_2);//TIM1_CH2.
GPIO_PinAFConfig( GPIOA, GPIO_PinSource10, GPIO_AF_2);//TIM1_CH3.
GPIO_PinAFConfig( GPIOB, GPIO_PinSource12, GPIO_AF_2);//BREAK.
GPIO_PinAFConfig( GPIOB, GPIO_PinSource13, GPIO_AF_2);//TIM1_CH1N.
GPIO_PinAFConfig( GPIOB, GPIO_PinSource14, GPIO_AF_2);//TIM1_CH2N.
GPIO_PinAFConfig( GPIOB, GPIO_PinSource15, GPIO_AF_2);//TIM1_CH3N.
//Настройка выводов для ШИМ управления обмотками двигателя.
GPIO_InitTypeDef pwm_gpio;
pwm_gpio.GPIO_Pin =GPIO_Pin_8| GPIO_Pin_9| GPIO_Pin_10;
pwm_gpio.GPIO_Mode =GPIO_Mode_AF;
pwm_gpio.GPIO_OType =GPIO_OType_OD;
pwm_gpio.GPIO_PuPd =GPIO_PuPd_NOPULL;
pwm_gpio.GPIO_Speed =GPIO_Speed_Level_3;
GPIO_Init( GPIOA, &pwm_gpio);
pwm_gpio.GPIO_Pin =GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
GPIO_Init( GPIOB, &pwm_gpio);
//Настройка вывода для BREAK.
GPIO_InitTypeDef break_gpio;
break_gpio.GPIO_Mode= GPIO_Mode_AF;
break_gpio.GPIO_Pin= GPIO_Pin_12;
break_gpio.GPIO_PuPd= GPIO_PuPd_NOPULL;
GPIO_Init( GPIOB, &break_gpio);

//+++Все настройки TIM1.+++
RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE);
//Основная настройка.
TIM_TimeBaseInitTypeDef Timer1_init;
Timer1_init.TIM_ClockDivision= TIM_CKD_DIV4;//Предделитель равный четырём для TIM_DeadTime.
Timer1_init.TIM_CounterMode= TIM_CounterMode_Up;//Отсчёт периода вверх TIM1.
Timer1_init.TIM_Prescaler= 1;//Предделитель 2 счётчика TIM1, продолжительность одного такта таймера 1/24000000=0.000 000 041.
Timer1_init.TIM_Period= 8000;//48000000/(8000*2)=3000Гц частота несущей, если частота генерации синусоиды 50Гц то массив синуса состоит из 3000/50=60 элементов.
Timer1_init.TIM_RepetitionCounter= 0;//Прерывание сразу после отсчёта периода таймера.
TIM_TimeBaseInit( TIM1, &Timer1_init);
TIM_ARRPreloadConfig( TIM1, ENABLE);
TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig( TIM1, TIM_OCPreload_Enable);
TIM_OC3PreloadConfig( TIM1, TIM_OCPreload_Enable);

//Настройка управления выводами при работе и остановке.
TIM_OCInitTypeDef pwm_fase;
pwm_fase.TIM_OCMode= TIM_OCMode_PWM1;//Выводы будут отрабатывать прямой сигнал ШИМ.
pwm_fase.TIM_OCPolarity= TIM_OCPolarity_Low;//Активное состояния выводов низкое прямых выводов.
pwm_fase.TIM_OCNPolarity= TIM_OCNPolarity_Low;//Активное состояния выводов низкое обратных выводов.
pwm_fase.TIM_OutputState= TIM_OutputState_Enable;//Включаем выводы прямой полярности.
pwm_fase.TIM_OutputNState= TIM_OutputNState_Enable;//Включаем выводы обратной полярности.
pwm_fase.TIM_OCIdleState= TIM_OCIdleState_Set;//При остановке TIM1 на прямых выводах будет низкий уровень.
pwm_fase.TIM_OCNIdleState= TIM_OCNIdleState_Reset;//При остановке TIM1 на обратных выводах будет низкий уровень.
pwm_fase.TIM_Pulse= 0;
TIM_OC1Init( TIM1, &pwm_fase);
TIM_OC2Init( TIM1, &pwm_fase);
TIM_OC3Init( TIM1, &pwm_fase);
//Включаем прерывание от окончания отсчёта периода TIM1 и от аварийной ситуации.
NVIC_InitTypeDef i_tim1;
i_tim1.NVIC_IRQChannel= TIM1_BRK_UP_TRG_COM_IRQn;
i_tim1.NVIC_IRQChannelCmd= ENABLE;
i_tim1.NVIC_IRQChannelPriority= 0;
NVIC_Init( &i_tim1);
TIM_ClearFlag( TIM1, TIM_FLAG_Update);
TIM_ITConfig( TIM1, TIM_IT_Update, ENABLE);
TIM_ClearFlag( TIM1, TIM_FLAG_Break);
TIM_ITConfig( TIM1, TIM_IT_Break, ENABLE);
//Настройка мёртвого времени и как должна срабатывать защита от аварийной ситуации.
TIM_BDTRInitTypeDef Protection_pwm;
Protection_pwm.TIM_AutomaticOutput= TIM_AutomaticOutput_Disable;//Разблокировка выводов при срабатывании защиты, установлено программное.
Protection_pwm.TIM_Break= TIM_Break_Enable;//Включен вывод защиты TIM1_BKIN( PB12).
Protection_pwm.TIM_BreakPolarity= TIM_BreakPolarity_Low;//При срабатывании защиты выводы в низком состоянии.
Protection_pwm.TIM_DeadTime= 12;//Значение 12 Dead-time 1 микросекунда, для IR2136( Data Sheet No. PD60166 revU, стр 5 в первой таблице) должно быть не меньше External dead_time>400 ns.
Protection_pwm.TIM_LOCKLevel= TIM_LOCKLevel_OFF;//Защита регистров от случайной перезаписи отключена.
Protection_pwm.TIM_OSSIState= TIM_OSSIState_Enable;//Состояние выводов во время остановки( IDLE) TIM1 включена.
Protection_pwm.TIM_OSSRState= TIM_OSSRState_Enable;//Состояние выводов во время работы TIM1 включена.
TIM_BDTRConfig( TIM1, &Protection_pwm);
}
//Функция запуска генерации ШИМ.
void Start_Pwm_Tim1( void){
TIM_CtrlPWMOutputs( TIM1, ENABLE);
TIM_Cmd( TIM1, ENABLE);
}
//Функция остановки, установкой бита генерируем аварийную остановку и вызывается прерывание.
void Stop_Pwm_Tim1( void){ TIM1->EGR|= 0x80;}

 Код настройки контроллера для работы с драйвером LCD TM1628 через интерфейс SPI и управления индикацией.

#include "lcd_init.h"
//Массив для отображения символов.
uint8_t symbol[12]={ 63, 6, 91, 79, 102, 109, 125, 7, 127 , 111, 70, 112};
void Init_Lcd( void){
GPIO_PinAFConfig( GPIOB, GPIO_PinSource3, GPIO_AF_0);
GPIO_PinAFConfig( GPIOB, GPIO_PinSource5, GPIO_AF_0);
//Настройка выводов для SPI.
GPIO_InitTypeDef spi1_gpio;
spi1_gpio.GPIO_Pin =GPIO_Pin_5;//DIO
spi1_gpio.GPIO_Mode =GPIO_Mode_AF;
spi1_gpio.GPIO_PuPd =GPIO_PuPd_NOPULL;
GPIO_Init( GPIOB, &spi1_gpio);
spi1_gpio.GPIO_Pin =GPIO_Pin_3;//CLK
spi1_gpio.GPIO_Mode =GPIO_Mode_AF;
spi1_gpio.GPIO_OType =GPIO_OType_OD;
spi1_gpio.GPIO_PuPd =GPIO_PuPd_NOPULL;
GPIO_Init( GPIOB, &spi1_gpio);
spi1_gpio.GPIO_Pin = GPIO_Pin_4;//STB
spi1_gpio.GPIO_Mode =GPIO_Mode_OUT;
spi1_gpio.GPIO_OType =GPIO_OType_OD;
spi1_gpio.GPIO_PuPd =GPIO_PuPd_NOPULL;
GPIO_Init( GPIOB, &spi1_gpio);
GPIO_SetBits( GPIOB, GPIO_Pin_4);
//Настройка SPI.
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE);
SPI_InitTypeDef spi1_initStructure;
SPI_StructInit( &spi1_initStructure);
spi1_initStructure.SPI_Direction = SPI_Direction_1Line_Tx;
spi1_initStructure.SPI_DataSize = SPI_DataSize_8b;
spi1_initStructure.SPI_CPOL = SPI_CPOL_Low;
spi1_initStructure.SPI_CPHA = SPI_CPHA_1Edge;
spi1_initStructure.SPI_NSS = SPI_NSS_Soft;
spi1_initStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
spi1_initStructure.SPI_FirstBit = SPI_FirstBit_LSB;
spi1_initStructure.SPI_Mode = SPI_Mode_Master;
SPI_Init(SPI1, &spi1_initStructure);
SPI_RxFIFOThresholdConfig (SPI1, SPI_RxFIFOThreshold_QF);
SPI_Cmd( SPI1, ENABLE);
//Отправка команд для конфигурации TM1628.
Send_Command_Lcd( 64);//Инкремент адреса.
Send_Command_Lcd( 141);//Средняя яркость.
}
//Функция отправки команды.
void Send_Command_Lcd( uint8_t com){
GPIO_ResetBits( GPIOB, GPIO_Pin_4);
SPI_SendData8( SPI1, com);
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE));
while( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_BSY));
GPIO_SetBits(GPIOB, GPIO_Pin_4);
}
//Функция опрашивает кнопки и возвращаем 8 бит о нажатых кнопок.
uint8_t Scan_Button_Lcd( void){
uint8_t scan_result=0;
GPIO_ResetBits(GPIOB, GPIO_Pin_4);
SPI_SendData8( SPI1, 66);
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE));
while(SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_BSY));
SPI_BiDirectionalLineConfig( SPI1, SPI_Direction_Rx);
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_RXNE));
scan_result|=SPI1-> DR;//Холостое сканирование.
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_RXNE));
scan_result|= SPI1-> DR<< 1;
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_RXNE));
scan_result|= SPI1-> DR<< 2;
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_RXNE));
scan_result|= SPI1-> DR<< 3;
GPIO_SetBits(GPIOB, GPIO_Pin_4);
SPI_BiDirectionalLineConfig( SPI1, SPI_Direction_Tx);
return scan_result;
}
//Функция отображает цифры.
void Display_Digit_Lcd( uint16_t digit){
GPIO_ResetBits( GPIOB, GPIO_Pin_4);
SPI_SendData8( SPI1, 192);
while( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_BSY));
SPI_SendData8( SPI1, symbol[ digit/100]);
digit=digit-( digit/100*100);
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE));
SPI_SendData8( SPI1, 0);
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE));
SPI_SendData8( SPI1, symbol[ digit/10]);
digit=digit-( digit/10*10);
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE));
SPI_SendData8( SPI1, 0);
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE));
SPI_SendData8( SPI1, symbol[ digit]);
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE));
while( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_BSY));
GPIO_SetBits( GPIOB, GPIO_Pin_4);
}
//Функция отображает индикацию для вращения.
void Display_Rotation_Lcd( uint8_t work, uint8_t work_on_off){
GPIO_ResetBits( GPIOB, GPIO_Pin_4);
SPI_SendData8( SPI1, 192);
while( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_BSY));
switch( work){
case 0:
SPI_SendData8( SPI1, symbol[ 10]);
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE));
SPI_SendData8( SPI1, 0);
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE));
break;
case 1:
SPI_SendData8( SPI1, symbol[ 11]);
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE));
SPI_SendData8( SPI1, 0);
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE));
break;
}
SPI_SendData8( SPI1, symbol[ work_on_off]);
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE));
SPI_SendData8( SPI1, 0);
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE));
SPI_SendData8( SPI1, symbol[ 0]);
while( !SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE));
while( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_BSY));
GPIO_SetBits( GPIOB, GPIO_Pin_4);
}


Хроника неудач в процессе разработки частотного преобразователя.

 Первый испытательный пуск на двигателе 180 Ватт удачно, аппарат оставлен включенным, через две минуты взрыв выгорели дорожки вокруг диодных мостов. Причина не удачи забыл смыть активный флюс, урон не значительный убило стабилизатор L7805CV всё остальные компоненты живы.

нет рисунка

 Второй испытательный пуск на двигателе 2.2 кВатт в жёстком режиме сразу 50 герц без плавного пуска и снижения коэффициента мощности, не запускается срабатывает защита по току с одной стороны радует с другой хотелось что бы он покрутился проверить нагрев транзисторов, решил закоротить шунты то есть убрать защиту. Пуск что то затрещало но двигатель не закрутился, выключил сразу включил тут сразу бабах, вывод не фига отключать защиту, итог ниже.

нет рисунка

Комментарии  Только зарегистрированные пользователи могут оставлять комментарии!

NOgoodspeedmen   2020-01-11 22:57:05
Я вижу проект претерпел серьёзные изменения! stm8 что отпал?

NOgoodspeedmen   2020-01-11 22:59:15
Как на счет модулей типа FSBB30CH60C цена невелика (в Китае) а если стрельнет то все одно все выгорает.

NOteseiaaw   2020-01-14 00:03:18
stm8 вполне пригодны, но stm32f030 почти та же цена но больше возможностей!

NOteseiaaw   2020-01-14 00:06:56
FSBB30CH60C к этим модулям нужен радиатор который очень дорого стоит, транзисторы меньше греется.

NOtranscription   2020-04-22 12:51:15
Добрый день! Отличная статья и видео. Можете помочь с поиском инфы или статей чтобы пересчитать на другой двигатель. У меня есть в наличии IR2136, STM32, разные мосфеты (IRF5330N, FPQ85N06, IRFZ44N, BUK7575-100A). Мне нужно управлять двигателем 500 Вт. Рабочее напряжение 60 В. Собираем электромашину для соревнования Shell-Eco marathon.

NOIamI   2022-03-11 18:53:19
Доброго времени суток! Вопрос конечно не в тему в части АД, но про выдачу переменки. Купил и ожидаю доставки солнечных батарей, контроллер сетевой как и панели стоит конских денег поэтому его пока не купил. Собственно вводная для вопроса - понимая смысл создания переменного тока из постоянки с частотой 50 Гц задумался о создании сетевого инвертора, работающего параллельно сети и по датчику тока перед счетчиком, утилизирующего в балласт лишнюю энергию, не допуская перетока в сеть. Сделать синусоиду из постоянки направление ясно, вопрос как синхронизировать выработку и не допускать перетока в сеть, можете намекнуть в СТМ куда двигаться. Информации в интернете маловато по этому направлению

NOMarkusDJ   2023-02-20 01:26:54
Спокойной ночи! Я пытаюсь запустить код на STM32F030C6T6, но не могу. Выходы запускаются последовательно, PA9 и PA8, но ШИМ не генерируется... Я удалил часть TM1628 и вручную ввел значение Scan_Button_Lcd() как 64. Что еще я должен сделать? Спасибо, что сделали код доступным!

NOteseiaaw   2023-02-22 08:49:13
Здравствуйте, без tm1628 кнопки работать не будут, они сканируются через эту микросхему, контролер через spi получает данные какая кнопка нажата.