Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Электроника - это просто Теоретические и практические вопросы для начинающих электронщиков.

 
Опции темы
Непрочитано 23.02.2014, 13:26  
backlan
Частый гость
 
Аватар для backlan
 
Регистрация: 06.10.2008
Адрес: Ростов-на-Дону
Сообщений: 49
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
backlan на пути к лучшему
По умолчанию Re: Драйвер шагового двигателя

Программных граблей тоже хватило. На 4 драйвера надо 16 выводов ШИМ, их не хватило, поэтому пришлось использовать комплементарные выходы для управления одной катушкой. Когда один вывод управляется ШИМ, второй подключён к нулю.
Код:
template ‹int inductor› void set_inductor_pulse_width (int len)
{
	if (len › 0) // == 0 не рассмотрен отдельно, поэтому два графика нормальные
	{
		//set_pulse_width‹inductor*2+1›(0);   //нужно только для отладки, чтобы рисовались нормальные графики
		enablePWM‹inductor*2+1›(false);     //отключили от ШИМ
		set_pin_state‹inductor*2+1›(false); //заземлили
		
		enablePWM‹inductor*2›(true);        //подключили ШИМ
		set_pulse_width‹inductor*2›(len);   //задали ширину импульсов
	}
	else
	{
		//set_pulse_width‹inductor*2›(0);   //нужно только для отладки
		enablePWM‹inductor*2›(false);     //отключили от ШИМ
		set_pin_state‹inductor*2›(false); //заземлили
		
		enablePWM‹inductor*2+1›(true);        //подключили ШИМ
		set_pulse_width‹inductor*2+1›(-len);   //задали ширину импульсов
	}
}
Разводку пинов сделал в MicroXplorer.
stm32f100c_map2.zip
Реклама:
backlan вне форума  
Непрочитано 23.02.2014, 13:32  
backlan
Частый гость
 
Аватар для backlan
 
Регистрация: 06.10.2008
Адрес: Ростов-на-Дону
Сообщений: 49
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
backlan на пути к лучшему
По умолчанию Re: Драйвер шагового двигателя

Чтобы включить ШИМ на некоторых таймерах, пришлось почитать datasheet.
Код:
	TIM-›CR1 |= TIM_CR1_ARPE;   //размер импульса ШИМ меняется в начале нового импульса
	TIM-›CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1PE   //левый шим на всех каналах
			| TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2PE;

...

	TIM1-›CCER |= TIM_CCER_CC1E
			| TIM_CCER_CC4E
			| TIM_CCER_CC1NE
			| TIM_CCER_CC2NE
			| TIM_CCER_CC3NE; //подключаем все каналы

...

//Без этого не работают!!!
	TIM1-›BDTR |= TIM_BDTR_MOE;   //второй вариант - задать значения сигналов в начале периода
	TIM15-›BDTR |= TIM_BDTR_MOE;  //через биты OIS1, OIS1N и т.д.
	TIM16-›BDTR |= TIM_BDTR_MOE;  //описание в RM0041, стр. 264
backlan вне форума  
Непрочитано 23.02.2014, 13:37  
backlan
Частый гость
 
Аватар для backlan
 
Регистрация: 06.10.2008
Адрес: Ростов-на-Дону
Сообщений: 49
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
backlan на пути к лучшему
По умолчанию Re: Драйвер шагового двигателя

Для USART сделал самодельный fifo кольцевой буфер.

Код:
template ‹class item, int bits› //какие элементы хранятся, сколько бит в счётчике (т.е. размер буфера = 2^bits)
class FIFOBuffer
{
	public:
	int first; //первый элемент в очереди
	int last;  //следующий за последним (первый свободный)
	static const int mask = (1 ‹‹ bits) - 1;
	static const int size = 1 ‹‹ bits;
	item buffer[size];

	int Size()     { return size - 1; }
	int Count()    { return (last - first) & mask; }
	bool IsFull()  { return (last + 1) & mask == first; } //остался один элемент - массив заполнен,
	bool IsEmpty() { return last == first; }              //совпадение указателей - массив пуст
	void Clear()   { last = first = 0; }
	void Push(item value) { buffer[last] = value; last = (last+1) & mask; }
	item Pop()     { int index = first; first = (first+1) & mask; return buffer[index]; }
	item Front()   { return buffer[first]; }

//второй вариант
/*
	int Size()     { return size; }
	int Count()    { return last - first; }
	bool IsFull()  { return first + size == last; }
	bool IsEmpty() { return last == first; }
	void Clear()   { last = first = 0; }
	void Push(item value) { buffer[(last++) & mask] = value;}
	item Pop()     { return buffer[(first++) & mask]; }
	item Front()   { return buffer[first & mask]; }
*/
	FIFOBuffer()   { Clear(); }
};

Последний раз редактировалось backlan; 07.03.2014 в 12:00. Причина: баг в коде
backlan вне форума  
Непрочитано 23.02.2014, 13:44  
backlan
Частый гость
 
Аватар для backlan
 
Регистрация: 06.10.2008
Адрес: Ростов-на-Дону
Сообщений: 49
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
backlan на пути к лучшему
По умолчанию Re: Драйвер шагового двигателя

Оказалось что использование косинуса приводит к увеличению программы на 3 кб (из 16 доступных). Пришлось сделать заполнение таблицы косинусов на этапе компиляции.
Код:
#define DIV_BITS_COUNT  0
const int DIV_BITS  =   DIV_BITS_COUNT; //число битов, отведённых на "дробную часть" шага
const int SUB_STEPS =   1‹‹DIV_BITS;    //число микрошагов в одном шаге

const int COS_AMPLITUDE   = 127;
const int COS_TABLE_COUNT = SUB_STEPS*4;

//constexpr нету
//static_assert нету
//static const double нету

//вычисление косинуса с точностью float на препроцессоре

#define cos_t(x) (((1-x*x/2.0 \
                  *(1.0-x*x/3.0/4 \
                  *(1.0-x*x/5.0/6 \
                  *(1.0-x*x/7.0/8 \
                  *(1.0-x*x/9.0/10 \
                  *(1.0-x*x/11.0/12 \
                  *(1.0-x*x/13.0/14 \
                  *(1.0-x*x/15.0/16 \
                  *(1.0-x*x/17.0/18 \
                  *(1.0-x*x/19.0/20 \
                  *(1.0-x*x/21.0/22 \
                  *(1.0-x*x/23.0/24 \
                  *(1.0-x*x/25.0/26 \
                 )))))))))))))))

#define cos_i(x) ((int8_t)(COS_AMPLITUDE * cos_t(((2*M_PI*(x))/COS_TABLE_COUNT))))

//смысла в 10 битах нет, это просто для теста скорости
#define A10(x) A9(x) A9(x + 2048)
#define A9(x) A8(x) A8(x + 1024)
#define A8(x) A7(x) A7(x + 512)
#define A7(x) A6(x) A6(x + 256)
#define A6(x) A5(x) A5(x + 128)
#define A5(x) A4(x) A4(x +  64)
#define A4(x) A3(x) A3(x +  32)
#define A3(x) A2(x) A2(x +  16)
#define A2(x) A1(x) A1(x +   8)
#define A1(x) A0(x) A0(x +   4)
#define A0(x) F(x)   F(x +   2)
#define F(x)  I(x)   I(x +   1)

#define I(x) cos_i(x),

//это шаманство для автоматической подстановки нужного количества элементов массива
#define init(a,b) conc(a, b)
#define conc(A, n) A##n

int8_t cosTable[COS_TABLE_COUNT] = {init(A, DIV_BITS_COUNT)(0)};
backlan вне форума  
Непрочитано 23.02.2014, 13:57  
backlan
Частый гость
 
Аватар для backlan
 
Регистрация: 06.10.2008
Адрес: Ростов-на-Дону
Сообщений: 49
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
backlan на пути к лучшему
По умолчанию Re: Драйвер шагового двигателя

Вот весь проект. Если запустить симулятор, он будет графики ШИМ на выводах одного мотора выдавать.
cnc_driver.zip

Померять программно индуктивности/сопротивления моторов пока не удалось, т.к. smd транзисторы оказались поддельными, с неправильной разводкой выводов и неправильной полярностью.
backlan вне форума  
Непрочитано 07.03.2014, 12:21  
backlan
Частый гость
 
Аватар для backlan
 
Регистрация: 06.10.2008
Адрес: Ростов-на-Дону
Сообщений: 49
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
backlan на пути к лучшему
По умолчанию Re: Драйвер шагового двигателя

Решил измерить потери при передаче туда-обратно через usb-com порт.
Частота послано ошибок не дошло
9600: 104004 25 132
115200: 103164 258 1068

Передача пакетная, ошибки считаются в пакетах по 10 байт, частота в бит/сек, остальное в байтах. Если rx-tx контакты замкнуть, то потери = 0.
Кто-нибудь пробовал мерять потери? А то 2.5 % на частоте 115200 - это как-то многовато, мне кажется.
backlan вне форума  
Непрочитано 17.04.2014, 09:30  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Драйвер шагового двигателя

Сообщение от eddy Посмотреть сообщение
Итак, промучившись вчера полдня в попытках сделать управление полностью "железным", я плюнул на это дело и реализовал через ШИМ, а в обработчике прерывания счетчика (в конце каждого периода) считаются шаги. Дубово, но "и так сойдет".
Для проверки подключил один ШД (а вообще управлять система будет пятью двигателями) и сфотографировал пару осциллограмм.
ШИМ со скважностью 50%, контроллер ШД работает по переднему фронту управляющего импульса, включено деление шагов на 16 (т.е. 16 этих прямоугольных импульсов == 1 шаг):

Соответствующее напряжение на обмотке ШД (со сдвигом по фазе, скорее всего, но остальные параметры остались теми же):


P.S. Это не на нормальных драйверах ШД, а на попсовых тошибовских.
Таки дошли руки (правда, пока на макетке - нормальную плату сделаю, когда сверла придут, а то сверлить нечем) до испытания драйвера L6208N. Стоит сказать, что тестовый шаговый двигатель — хитрый, у него сопротивление обмотки 1.5Ом, поэтому управлять им при помощи обычных ключей без контроля тока нельзя! Итак, вот что получается на обмотке шаговика (напряжение) при работе в полношаговом режиме на частоте 400Гц (соответственно, 100 шагов в секунду):

Поподробней напишу в ЖЖшке (с картинками и видео).

(ось Y на осциллографе инвертирована)
__________________
Союз Советских Социалистических Округов Северной Америки
eddy на форуме  
Непрочитано 13.04.2015, 10:35  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
eddy на пути к лучшему
По умолчанию Странная штука с L6208N

Вроде бы, на макетке все работало и момент вполне нормальный был, но как собрал оконечную плату, появились проблемы: во-первых, очень маленький момент получается; во-вторых, двигатель крутится то в одну, то в другую сторону. Подключаю двигатель к обычному драйверу (на тошибовском регуляторе) — момент отличный, проблем нет.
Судя по осциллограммам, у меня почему-то ШИМ "не догоняет" ток до нужного значения (на тошибовском нормальное заполнение, а у меня какой-то редкий частокол получается).

Может ли это быть из-за неправильно подобранных параметров Roff/Coff (у меня 51кОм и 1нФ, соответственно)? Драйвер работает в режиме slow decay, полношаговый. Делитель Vref настроен на ток 1.1А.
__________________
Союз Советских Социалистических Округов Северной Америки
eddy на форуме  
Непрочитано 13.04.2015, 12:10  
pambaru
Почётный гражданин KAZUS.RU
 
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: Драйвер шагового двигателя

Сообщение от eddy Посмотреть сообщение
во-вторых, двигатель крутится то в одну, то в другую сторону.
Похоже, что работает только одна обмотка.
pambaru вне форума  
Непрочитано 13.04.2015, 14:23  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Драйвер шагового двигателя

Нет, там все ОК: осциллограммы правильные. Просто тока почему-то не хватает.

Кстати, где-бы почитать, как на основе параметров двигателя (сопротивление и индуктивность обмоток) рассчитать наиболее оптимальные параметры: Roff и Coff в RC-цепочке управляемой логики; выбрать правильно режим затухания (fast decay или slow decay) и наиболее оптимальную скорость работы?
__________________
Союз Советских Социалистических Округов Северной Америки
eddy на форуме  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Драйвер биполярного шагового двигателя Segriv Поиск схем. Делимся схемами 3 24.05.2012 16:17
Драйвер двигателя из DVD san200802 Информация по радиокомпонентам 7 05.12.2011 05:03
[Решено] Контроллер шагового двигателя vspishkin Поиск схем. Делимся схемами 13 07.01.2011 09:17
Посоветуйте в выборе шагового двигателя и МК для него 210702 Автоматика и аппаратура связи 5 10.10.2008 11:30
Поясните внутренности шагового двигателя. EXIS Автоматика и аппаратура связи 11 21.06.2008 00:22


Часовой пояс GMT +4, время: 23:14.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot