Электроника - это просто Теоретические и практические вопросы для начинающих электронщиков. |
23.02.2014, 13:26
|
|
Частый гость
Регистрация: 06.10.2008
Адрес: Ростов-на-Дону
Сообщений: 49
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
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
|
|
|
|
23.02.2014, 13:32
|
|
Частый гость
Регистрация: 06.10.2008
Адрес: Ростов-на-Дону
Сообщений: 49
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
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 |
|
|
|
|
23.02.2014, 13:37
|
|
Частый гость
Регистрация: 06.10.2008
Адрес: Ростов-на-Дону
Сообщений: 49
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
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.
Причина: баг в коде
|
|
|
|
23.02.2014, 13:44
|
|
Частый гость
Регистрация: 06.10.2008
Адрес: Ростов-на-Дону
Сообщений: 49
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
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)}; |
|
|
|
|
23.02.2014, 13:57
|
|
Частый гость
Регистрация: 06.10.2008
Адрес: Ростов-на-Дону
Сообщений: 49
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Драйвер шагового двигателя
Вот весь проект. Если запустить симулятор, он будет графики ШИМ на выводах одного мотора выдавать.
cnc_driver.zip
Померять программно индуктивности/сопротивления моторов пока не удалось, т.к. smd транзисторы оказались поддельными, с неправильной разводкой выводов и неправильной полярностью.
|
|
|
|
07.03.2014, 12:21
|
|
Частый гость
Регистрация: 06.10.2008
Адрес: Ростов-на-Дону
Сообщений: 49
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Драйвер шагового двигателя
Решил измерить потери при передаче туда-обратно через usb-com порт.
Частота послано ошибок не дошло
9600: 104004 25 132
115200: 103164 258 1068
Передача пакетная, ошибки считаются в пакетах по 10 байт, частота в бит/сек, остальное в байтах. Если rx-tx контакты замкнуть, то потери = 0.
Кто-нибудь пробовал мерять потери? А то 2.5 % на частоте 115200 - это как-то многовато, мне кажется.
|
|
|
|
17.04.2014, 09:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: Драйвер шагового двигателя
Сообщение от eddy
|
Итак, промучившись вчера полдня в попытках сделать управление полностью "железным", я плюнул на это дело и реализовал через ШИМ, а в обработчике прерывания счетчика (в конце каждого периода) считаются шаги. Дубово, но "и так сойдет".
Для проверки подключил один ШД (а вообще управлять система будет пятью двигателями) и сфотографировал пару осциллограмм.
ШИМ со скважностью 50%, контроллер ШД работает по переднему фронту управляющего импульса, включено деление шагов на 16 (т.е. 16 этих прямоугольных импульсов == 1 шаг):
![](http://imageshack.us/scaled/thumb/842/urws.jpg)
Соответствующее напряжение на обмотке ШД (со сдвигом по фазе, скорее всего, но остальные параметры остались теми же):
![](http://imageshack.us/scaled/thumb/6/3iri.jpg)
P.S. Это не на нормальных драйверах ШД, а на попсовых тошибовских.
|
Таки дошли руки (правда, пока на макетке - нормальную плату сделаю, когда сверла придут, а то сверлить нечем) до испытания драйвера L6208N. Стоит сказать, что тестовый шаговый двигатель — хитрый, у него сопротивление обмотки 1.5Ом, поэтому управлять им при помощи обычных ключей без контроля тока нельзя! Итак, вот что получается на обмотке шаговика (напряжение) при работе в полношаговом режиме на частоте 400Гц (соответственно, 100 шагов в секунду):
![](http://storage6.static.itmages.ru/i/14/0417/s_1397712559_8140154_201e967239.jpg)
Поподробней напишу в ЖЖшке (с картинками и видео).
(ось Y на осциллографе инвертирована)
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
13.04.2015, 10:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Странная штука с L6208N
Вроде бы, на макетке все работало и момент вполне нормальный был, но как собрал оконечную плату, появились проблемы: во-первых, очень маленький момент получается; во-вторых, двигатель крутится то в одну, то в другую сторону. Подключаю двигатель к обычному драйверу (на тошибовском регуляторе) — момент отличный, проблем нет.
Судя по осциллограммам, у меня почему-то ШИМ "не догоняет" ток до нужного значения (на тошибовском нормальное заполнение, а у меня какой-то редкий частокол получается).
Может ли это быть из-за неправильно подобранных параметров Roff/Coff (у меня 51кОм и 1нФ, соответственно)? Драйвер работает в режиме slow decay, полношаговый. Делитель Vref настроен на ток 1.1А.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
13.04.2015, 12:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
|
Re: Драйвер шагового двигателя
Сообщение от eddy
|
во-вторых, двигатель крутится то в одну, то в другую сторону.
|
Похоже, что работает только одна обмотка.
|
|
|
|
13.04.2015, 14:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: Драйвер шагового двигателя
Нет, там все ОК: осциллограммы правильные. Просто тока почему-то не хватает.
Кстати, где-бы почитать, как на основе параметров двигателя (сопротивление и индуктивность обмоток) рассчитать наиболее оптимальные параметры: Roff и Coff в RC-цепочке управляемой логики; выбрать правильно режим затухания (fast decay или slow decay) и наиболее оптимальную скорость работы?
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:14.
|
|