Энкодер из BLDC

Данный топик является развернутым ответом на вопрос, поднятый в этой теме: Увеличить разрешение энкодера из HDD. Единственным HDD со съемным двигателем в моем хламе оказался SCSI Seagate емкостью 73GB 2004 года выпуска. Вот такой:


За основу решил взять схему из этой статьи: Валкодер из двигателя. Схема была немного переработана с учетом обработки трех фаз, гистерезис усилителей уменьшен в связи скромным выходным напряжением двигателя. Мой экземпляр даже на высоких оборотах выдавал не более 1 вольта, на оборотах, приближенных к реальности получалось 10-30 мВ (скорее всего связано с его высокооборотистостью). Дополнительное осложнение в моем случае заключалось в том, что у него не было отвода от середины обмоток, я решил сделать искусственный отвод резисторным делителем, правда, было сомнение на этот счет. Окончательный вариант схемы выглядит так:



Оставалось это к чему-нибудь подключить и немножко покодить. Под руку попалась STM8S-Discovery. Для начала я снял таблицу состояний, так выглядят два полных цикла:
Число Ф1 Ф2 Ф3
0x01 0 0 1
0x05 1 0 1
0x04 1 0 0
0x06 1 1 0
0x02 0 1 0
0x03 0 1 1
0x01 0 0 1
0x05 1 0 1
0x04 1 0 0
0x06 1 1 0
0x02 0 1 0
0x03 0 1 1
0x01 0 0 1

Код, обрабатывающий изменение в каждой из фаз выглядит незатейливо:
inline uint8_t GetValue()
{
	return (GpioD::Read() >> 2U) & 0x07;
}

int main()
{
	SysClock::Select(SysClock::HSE);
	GpioA::WriteConfig<0xFF, GpioBase::In_Pullup>();
 	GpioB::WriteConfig<0xFF, GpioBase::In_Pullup>();
 	GpioC::WriteConfig<0xFF, GpioBase::In_Pullup>();
 	GpioD::WriteConfig<0xFF, GpioBase::In_Pullup>();
//Encoder connected to PD2, PD3, PD4	
        GpioD::SetConfig<P2 | P3 | P4, GpioBase::In_float>();
	Uart::Init<Uarts::DefaultCfg, 921600UL>();
	__enable_interrupt();
	uint8_t ch = GetValue();
	uint8_t value = 0;
	int16_t encoder;
	while (true)
	{
		value = GetValue();
		if(ch != value)
		{
			switch(ch)
			{
			case 1:{
				if(value == 5) ++encoder;
				if(value == 3) --encoder;
			}
				break;
			case 5:{
				if(value == 4) ++encoder;
				if(value == 1) --encoder;
			}
				break;
			case 4:{
				if(value == 6) ++encoder;
				if(value == 5) --encoder;
			}
				break;
			case 6:{
				if(value == 2) ++encoder;
				if(value == 4) --encoder;
			}
				break;
			case 2:{
				if(value == 3) ++encoder;
				if(value == 6) --encoder;
			}
				break;
			case 3:{
				if(value == 1) ++encoder;
				if(value == 2) --encoder;
			}
				break;
			default:
				;
			}
			ch = value;
			Uart::Puts("\r     \r");
			Uart::Puts(encoder);
//       Get state table
//			Uart::Puts(ch, 16);
//			Uart::Puts("\t");
//			Uart::Puts((ch >> 2U) & 0x01, 2); Uart::Puts("\t");
//			Uart::Puts((ch >> 1U) & 0x01, 2); Uart::Puts("\t");
//			Uart::Puts(ch & 0x01, 2); Uart::Puts("\r\n");
		}
        }
}

Итоговое разрешение такого энкодера — 18 шагов на оборот, чего хватит для большинства применений. Эксперимент считаю успешным. Энкодер в работе:


На этом все, спасибо за внимание.

P.S.: На PCB в аттаче есть перемычка под микросхемой.
  • +13
  • 22 июля 2015, 22:54
  • hrandib
  • 1
Файлы в топике: pcb.zip

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

RSS свернуть / развернуть
Хм, пол месяца назад выкинул небольшую кучку таких движков(( Вот теперь пришло время кусать локти…
Кладезь датчиков пропал
0
осталось найти применение ))
0
Да как сказать? Применений очень много… недавно делал СУ экструдера с ДПТ (эконом класс из того что было), так вот там стабилизацию скорости по ЭДС двигателя пришлось делать… А сейчас сижу и думаю, что прилепил бы вот такой движок и в профиты!
0
с таким количеством кликов на оборот я бы его только на ui поставил.
0
При достаточных оборотах можно оцифровывать аналоговый сигнал и определять его фазу — эти движки гонят хороший, чистый синус.
0
Двигатель дает 5000 об/мин. регулировка идет в пределах (валенок в право — валенок влево) на 500 единиц. Дальше редуктор понижающий частоту до частоты мясорубки. Как бы супер точностей не требуется… Энкодер с парой тысяч импульсов на оборот и даром тут не нужен, для решения такой задачи вполне подходит
+1
в такой ситуации вообще достаточно таходатчика на одной оптопаре
-1
С оптопарами в свое время сильно напоролся… не любят они «тяжелых условий труда»
пыль, грязь, мазут и т.д.
+1
3д принтер и мазут? О_о
0
Почему именно 3Д принтер? Я имел дело как с пищевыми (макарошки так делают), топливо для пиролизных котлов (опилочки в катыши), всякого рода строй-ремонт жидкости, клея, смеси и т.д.
Экструзия представляет собой непрерывный технологический процесс, заключающийся в продавливании высоковязкого материала на основе расплава, либо пастообразной многофазной дисперсной системы, либо металла, через формующий инструмент (экструзионную головку, фильеру), с целью получения изделия с поперечным сечением нужной формы. В промышленности переработки полимеров методом экструзии изготавливают различные погонажные изделия, такие, как трубы, листы, плёнки, оболочки кабелей, элементы оптических систем светильников- рассеиватели и т. д. Аналогично полимерам методом экструзии изготавливаются разнообразные алюминиевые профили. Основным технологическим оборудованием для переработки полимеров в изделия методом экструзии являются одночервячные, многочервячные, поршневые и дисковые экструдеры.
В 3Д принтере всего лишь один из частных случаев=))
0
по инерции подумал )
0
а как они себя ведут на малых оборотах? Счет не пропадает?
0
Пороговая скорость где-то в 2 раза меньше скорости в видео. Чувствительность в целом показалась достаточной. Еще нужно учитывать, что это наихудший вариант, 4-х проводный движок от обычного 7200rpm винта должен вести себя заметно лучше.
0
Ухты!!!
А можешь сделать метрику?
График зависимости показываемой скорости от задаваемой при разных скоростях и ускорениях, и выложить сюда?
0
Задаваемой чем? Рука не очень прецизионный инструмент :)
0
Всегда по разному=)) Иногда бюджет бывает весьма мизерным, иногда время поджимает сильно (ждать прихода заказа с Китая долговато). Как для варианта — «подпереть палкой» ИМХО отличный вариант.
0
найти винт со съемным двигателем, 4 опера (пусть даже два сдвоенных, они чаще в тумбочке валяются), кучу рассыпухи… скорее всего в магазин забежать все же придется, я бы наверно там же купил какой нибудь pec16
0
pec16 врядли выдержит больших скоростных нагрузок + пыль, грязь, мазут и т.д.
+1
про скоростные и прочее ниже ответил. магниторезистор тут шикарен и бюджетен.
0
Бюджетней и шикарней будет датчик Холла ИМХО
Но опять же возникают вопросы с креплениями, корпусами, магнитиками и т.д.
Тут наверное лучше сформулировать так:
Каждая задача имеет свое собственное решение, с необходимой для нее элементной базой. Соответственно бывают решения весьма разнообразны и эксклюзивны=))
0
Ну просторы и объемы хламья в мастерских иногда удивляют а иногда ужасают…
Любой, кто перевозил мастерскую — меня поймет=))
+1
ну как бы сильно разные вещи. если хочется получить 400 кликов на оборот, то проще купить готовый, но дорогой. если нужен ui — проще и дешевле купить готовый с валом полходящим для туевой хучи готовых ручек. если хочется потрахаться — надо делать свой.
0
А если нужен энкодер для механики, а платить тыщу не хочется?
0
для механики с таким количеством тиков? на ну нафиг. я лучше магнитный резистор поставлю.
+1
Где то видел абсолютный энкодер на основе распечатанной на бумаге шкалы — автор использовал его в приводе своего телескопа
Сейчас стало возможно сделать самому на основе металлизированного стеклянного жёсткого диска… накатить ЛУТом и протравить,
чтобы получить такое на 2048 шагов
Фотки внутренностей абсолютного энкодера
+2
шикарно…
0
Под «хватит для большинства применений» я подразумевал именно UI. Не думал, что кто-то будет рассматривать использование в качестве датчика угла/скорости.
0
А почему бы и нет?=)) Корпус добротный, удар два молотком выдержит точно… Вибрации тоже не сильно страшны. Замутить к такому крепление проще простого если есть доступ к токарному станку=))
Буду благодарен, если к посту прикрепите файлик печатки под ЛУТ
0
Скорее всего у меня просто нет подходящих задач.
0
В pdf? Вечером прикреплю.
0
Спасибо
0
Прикрепил, обрати внимание на измененнный P.S. в статье. Плата под ЛУТ — зеркальная.
0
Можно и на нулевой скорости вытащить информацию о положении, используя нелинейности магнитопровода. Подаетя высокочастотный сигнал и анализируется отклик. Ключевые слова для поиска high frequency injection.

У меня получалась точность около 10 градусов, при хорошей динамике, руками такие ускорения не накрутить. И двигатель был rc, с меньшей индуктивностью.
+2
Хорошая статейка, сразу вспомнил, как несколько лет назад делал энкодер из шаговика и ещё из оптической мышки
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.