Запуск и управление оборотами бесколлекторного двигателя

Toto_G
Offline
Зарегистрирован: 20.11.2015

Здравствуйте,
Вопрос в целом стоит так - имеется такой двигатель (или очень похожий)

Бесколлекторный инраннер B28-47-16S Brushless Inrunner Motor 2400kv

Технические характеристики:
KV: 2400 rpm/v
Максимальный ток: 28A
Максимальная мощность: 470W
Ток простоя: 1.0A
Сопротивление: 0.038Ω
Рекомендуемый ESC: 35A
Количество элементов: 3-4SLipo
 

И стоит задача его включения. В кинематической схеме старт под нагрузкой и невозможностью вращения в обратную сторону (стоит храповик). Мощность потребуется в пределах 70-80%, обороты в пределах 50-100%, то есть до 40 000 в минуту

Почитал я литературу,  и сделал предварительные выводы-

1.Самый простой способ. взять на том же хобикинге Рекомендуемый ESC: 35A. Чтобы заставить его работать, ему нужно подать серво-сигнал, который представляет собой ШИМ, параметры пока не определил (частоту, напряжение).

http://forum.rcdesign.ru/f87/thread157044.html

https://habrahabr.ru/post/219723/

2. Построить . Силовая часть из 6 ключей и управление ардуиной.

http://www.avislab.com/blog/brushless05/ и снизу целый список. Хорошо всё рассказано, но не до конца.

Разбирался уже кто-нибудь с такими вопросами? Кто-то может что подсказать?

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Тут по генератору с регулируемой частотой и скважностью. Автор dimax ежедневно тут, думаю подскажет если что непонятно будет.

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

Toto_G
Offline
Зарегистрирован: 20.11.2015

 Добавочка.

http://www.hobbyking.com/hobbyking/store/__30285__HobbyKing_35A_Sensored_Sensorless_Car_ESC_1_10_1_12_AU_Warehouse_.html

esc 35a стоит дороже двигателя.  простой силовой мост с управлением от ардуинки дожен быть ощутимо дешевле. К тому же готовый весьма большой по размеру и избыточный по функционалу. Место где хочу использовать критично к габаритам. То есть всё лишнее надо выкинуть.

изменение оборотов не нужно плавное. достаточно будет 2-х или 3-х ступеней, с переключением кнопкой. Скажем 50-75-95% скорости. Нагрузка пульсирующая, но со временем не меняющаяся (сжатие пружины через редуктор с последующим отпусканием пружины - и следующий цикл)

trembo
trembo аватар
Онлайн
Зарегистрирован: 08.04.2011

Toto_G пишет:

.........и сделал предварительные выводы-

.......серво-сигнал, который представляет собой ШИМ, параметры пока не определил (частоту, напряжение).

Вам дело советуют, а вам не нравится.....
Что вам не ясно  в библиотеке СЕРВО ?

примерно 20 миллисикунд период, 1000 - минимальная скорость, 2000 максимальная (1500- середина)
5 Вольт

Ню-ню, определяйтесь со своими частотами- напряжениями. Флаг в руки.
Учтите только что трёхфазнику под нагрузкой с места стартануть ......
Ток сами посчитаете ?

11.1 (14.8) поделите на 0.038Ω
 

Toto_G
Offline
Зарегистрирован: 20.11.2015

trembo пишет:

римерно 20 миллисикунд период, 1000 - минимальная скорость, 2000 максимальная (1500- середина)

5 Вольт

? esc управляется 50 гц шимом? что такое 1000 и 2000?

trembo пишет:

Учтите только что трёхфазнику под нагрузкой с места стартануть ......
Ток сами посчитаете ?

11.1 (14.8) поделите на 0.038Ω

скажите, какая разница? если  двигатель будет запускать китайский esc, там они использут не закон ОМА, а закон ома, и поэтому ток там будет гораздо меньше?

есть ещё одна трудность. насколько я разобрался в алгоритмах, esc для моделей запускают двиг следующим образом - для того чтоб определить начальное положение ротора, подаётся небольшой ток на обмотки и ротор устанавливается в определённую точку, после этого уже подаются рабочие импульсы и движок погнал крутиться.  Так вот при установке начального положения ротор должен иметь возможность вращаться в обоих направлениях. Для моделей это роли не играет, треть-1\2 оборота вала, даже если назад. А вот в моей системе этот подход неприменим, назад ничего не вращается. Поэтому нужен пуск строго в одну сторону, т.е. предустановку можно сделать на снятом двигателе, но потом ? И возможно нужен будет двиг с датчиками холла и соответствующим esc

trembo
trembo аватар
Онлайн
Зарегистрирован: 08.04.2011
Toto_G
Offline
Зарегистрирован: 20.11.2015

http://www.jetcontrol.de/Bastelstube/d2pack.html  вот немец собрал , можно повторять, на "Примерно 30А на 15В"

приводит линки http://www.jetcontrol.de/Bastelstube/BLMC.html

 

вот на 8А. Author:         Ulrich Radig. http://www.ulrichradig.de/home/index.php/avr/brushless-motor-controller

даже исходник на С есть.

/*----------------------------------------------------------------------------
 Copyright:      Ulrich Radig (mail@ulrichradig.de)
 Author:         Ulrich Radig
 Remarks:        
 known Problems: none
 Version:        23.06.2011
 Description:    Brushless Motor Controller for ATmega48/88/168
 
 Dieses Programm ist freie Software. Sie kцnnen es unter den Bedingungen der 
 GNU General Public License, wie von der Free Software Foundation verцffentlicht, 
 weitergeben und/oder modifizieren, entweder gemдЯ Version 2 der Lizenz oder 
 (nach Ihrer Option) jeder spдteren Version. 

 Die Verцffentlichung dieses Programms erfolgt in der Hoffnung, 
 daЯ es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, 
 sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT 
 FЬR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License. 

 Sie sollten eine Kopie der GNU General Public License zusammen mit diesem 
 Programm erhalten haben. 
 Falls nicht, schreiben Sie an die Free Software Foundation, 
 Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. 
------------------------------------------------------------------------------*/

#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/twi.h>

//Motoradresse
#define MOTOR_ADR 0x70

//PHASE1 (U)
#define UH_DDR	DDRB |= (1<<3);
#define UH_ON	TCCR2A |= (1<<COM2A1);
#define UH_OFF	TCCR2A &= ~(1<<COM2A1);

//PHASE1 (U)
#define UL_DDR	DDRB |= (1<<1);
#define UL_ON	PORTB |= (1<<1);
#define UL_OFF	PORTB &= ~(1<<1);


//PHASE2 (V)
#define VH_DDR	DDRD |= (1<<5);
#define VH_ON	TCCR0A |= (1<<COM0B1);
#define VH_OFF	TCCR0A &= ~(1<<COM0B1);

//PHASE2 (V)
#define VL_DDR	DDRB |= (1<<2);
#define VL_ON	PORTB |= (1<<2);
#define VL_OFF	PORTB &= ~(1<<2);


//PHASE3 (W)
#define WH_DDR	DDRD |= (1<<3);
#define WH_ON	TCCR2A |= (1<<COM2B1);
#define WH_OFF	TCCR2A &= ~(1<<COM2B1);

//PHASE3 (W)
#define WL_DDR	DDRC |= (1<<3);
#define WL_ON	PORTC |= (1<<3);
#define WL_OFF	PORTC &= ~(1<<3);


#define PHASE_ALL_OFF	UH_OFF;UL_OFF;VH_OFF;VL_OFF;WH_OFF;WL_OFF;

#define SENSE_U		ADMUX = 0;
#define SENSE_V		ADMUX = 1;
#define SENSE_W		ADMUX = 2;

#define SENSE_H		(ACSR&(1<<ACO))

#define START_PWM   5

volatile unsigned long i2c_timeout = 0;
volatile unsigned char rx_pwm = 0;
volatile unsigned char rotor_state = 0;
volatile unsigned char rotor_run = 0;

//############################################################################
void next_commutate_state (unsigned char startup)
//############################################################################
{
	switch (rotor_state)
	{
		case (0):
			if(!SENSE_H || startup)
			{
				WH_OFF;
				UH_ON;
				SENSE_W;
				rotor_state = 1;
				TCNT1 = 1;
			}
			break;

		case (1):
			if(SENSE_H || startup)
			{
				VL_OFF;
				WL_ON;
				SENSE_V;
				rotor_state = 2;
				TCNT1 = 1;
			}
			break;

		case (2):
			if(!SENSE_H || startup)
			{
				UH_OFF;
				VH_ON;
				SENSE_U;
				rotor_state = 3;
				TCNT1 = 1;
			}
			break;
	
		case (3):
			if(SENSE_H || startup)
			{
				WL_OFF;
				UL_ON;
				SENSE_W;
				rotor_state = 4;
				TCNT1 = 1;
			}
			break;

		case (4):
			if(!SENSE_H || startup)
			{
				VH_OFF;
				WH_ON;
				SENSE_V;
				rotor_state = 5;
				TCNT1 = 1;
			}
			break;

		case (5):
			if(SENSE_H || startup)
			{
				UL_OFF;
				VL_ON;
				SENSE_U;
				rotor_state = 0;
				TCNT1 = 1;
			}
			break;
	}
}

//############################################################################
//back EMF zero crossing detection
ISR (ANALOG_COMP_vect) 
//############################################################################
{
	if(rotor_run == 200) next_commutate_state (0);
	
	rotor_run++;
	if(rotor_run > 200)
	{
		rotor_run = 200;
	}
}

//############################################################################
ISR (TIMER1_OVF_vect)
//############################################################################
{	
	next_commutate_state (1);
	rotor_run = 0;
	OCR2A = START_PWM;
	OCR2B = START_PWM;
	OCR0B = START_PWM;
}

//############################################################################
ISR (TWI_vect)
//############################################################################
{	
	switch (TWSR & 0xF8) //TW_STATUS 
	{  
		//Adresse empfangen
		case TW_SR_SLA_ACK:  
			TWCR |= (1<<TWINT);
			return;
			
		//Daten empfangen
		case TW_SR_DATA_ACK:
			rx_pwm = TWDR;
			TWCR |= (1<<TWINT);
			i2c_timeout = 0;
			return;

		//Bus-Fehler zurьcksetzen 
		case TW_NO_INFO:
			TWCR |=(1<<TWSTO) | (1<<TWINT); 

		//Bus-Fehler zurьcksetzen   
		case TW_BUS_ERROR:
			TWCR |=(1<<TWSTO) | (1<<TWINT); 
	}
	//Reset TW
	TWCR =(1<<TWEA) | (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
}

//############################################################################
//Hauptprogramm
int main (void) 
//############################################################################
{
	//Watchdog on
	WDTCSR = (1<<WDCE) | (1<<WDE);
	
	//Motordriver output
	UH_DDR;
	VH_DDR;
	WH_DDR;
	UL_DDR;
	VL_DDR;
	WL_DDR;
		
	//PWM for UH, VH and WH (>32KHz)
	TCCR0A |= (1<<COM0B1|1<<WGM01|1<<WGM00);
	TCCR0B |= (1<<CS00);
	
	TCCR2A |= (1<<COM2A1|1<<COM2B1|1<<WGM21|1<<WGM20);
	TCCR2B |= (1<<CS20);
	
	//TIMER1 for start commutation or Back EMF lost
	TCCR1B |= (1<<CS11);
	TIMSK1 |= (1<<TOIE1);

	PHASE_ALL_OFF;
	
	//Comperator init for back EMF
	ADCSRB	|= (1<<ACME);
	DIDR1	|= (1<<AIN0D);
	ACSR	|= (1<<ACIE);
		
	//I2C Init
	TWAR = MOTOR_ADR & 0xFE;
    TWCR = (1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);
	
	//Interrupts enabel
	sei();
	

	while(1)
	{	
		asm("wdr");
		if(rx_pwm > START_PWM)
		{
			ACSR |= (1<<ACIE);
			TIMSK1 |= (1<<TOIE1);
			
			if(rotor_run == 200)
			{
				OCR2A = rx_pwm;
				OCR2B = rx_pwm;
				OCR0B = rx_pwm;
			}
			i2c_timeout++;
			
			if(i2c_timeout>100000)
			{
				rx_pwm = 0;
			}
		}
		else
		{
			PHASE_ALL_OFF;
			ACSR&=~(1<<ACIE);
			TIMSK1 &= ~(1<<TOIE1);
		}
	}
}

 

Toto_G
Offline
Зарегистрирован: 20.11.2015

Вот "логик" mosfet надежно открываемые от 4,5 вольт, современные с минимальным сопротивлением канала

IRF7832 20 Ампер в SO-8! Импульс до 120 Ампер. Всего 4 мОм! N-MOSFET "Логик" для Н-мостов и источников питания.

IRF8788 24 Ампера в SO-8! Импульс до 190 А, всего 3 милиОма! N-MOSFET "Логик" для Н-мостов и источников питания. Улучшающая замена для IRF7831, IRF7832/Z и IRF7862

N-MOSFET "логик" IRLR7843 30 Вольт 110 Ампер длительно корпус D-PAK
Для импульсных блоков питания, для электропривода, для инверторов BLDC моторов и Н-мостов. Всего 3 милиОм при 5 В на затворе

ivan4567
Offline
Зарегистрирован: 24.10.2017

Здравствуйте! Вы имели дело с данной платой? Как ее программировать и управлять? Вопрос может показаться глупым, но я тольк начинаю делать первые шаги в этой области.

Александр2
Offline
Зарегистрирован: 12.01.2019

Здравствуйте! Помогите пожайлуста. Мне нужно запустить Б\к двигатель трехфазный FB-848-A-CF от старого принтера, имеется ли какая

нибудь схема без микроконтролера?