Расчет оборотов ШД при управлении через таймер
- Войдите на сайт для отправки комментариев
Добрый день.
Имеется связка из шагового двигателя (2 обмотки, 4 вывода, 200 шагов на оборот) и драйвера. На драйвере скорее всего (потому что оказался кетай с неверными таблицами по выбору тока) выставлен режим 1/16 - но не суть важно (если выставить предполагаемый по таблице 1/32, то количество оборотов двигателя станет в 2 раза меньше, но в таблице у других кетайцев все по-другому).
Сигналы на драйвер в стиле STEP-DIR-EN. Код получился такой:
#define STEP_PIN 3 //volatile unsigned long pulses = 10000; //30 об мин //volatile unsigned long pulses = 20000; //15 об мин //volatile unsigned long pulses = 30000; // 10 об мин //volatile unsigned long pulses = 60000; // 5 об мин //volatile unsigned long pulses = 5000; // 60 об мин = 1 об сек volatile unsigned long pulses = 2500; // 120 об мин = 2 об сек void setup() { pinMode(STEP_PIN, OUTPUT); digitalWrite(STEP_PIN, LOW); cli (); TCCR1A = 0; TCCR1B = 0; OCR1A = pulses; TCCR1B |= (1 << WGM12); TCCR1B |= (1 << CS10); TIMSK1 |= (1 << OCIE1A); sei (); } ISR (TIMER1_COMPA_vect) { digitalWrite(STEP_PIN, HIGH); OCR1A = pulses; digitalWrite(STEP_PIN, LOW); } void loop() { }
МК мега328, генератор кварцевый, 16 Мгц. Двигатель уверенно крутит где-то до 150-200 об/мин, потом срывается, но даже 120 об/мин достаточно выше крыши. Минимальные обороты от нуля работают без срыва.
Собственно сама физическая работа ШД устраивает - ток, нагрев, звук - все отлично, не заедает, не заикается.
Скорость двигателя задается переменной pulses, путем записи в OCR1A. Тоже работает, но с одним но.
Удобочитаемее было-б указывать человеческие обороты в минуту. Но, не могу понять как собрать формулу для перерасчета. Единственное что закономерно - если надо в 2 раза уменьшить обороты, то переменная должна быть увеличена в 2 раза. И тут затык... Голова отключилась...Может кто знает как выглядит заветный перевод оборотов в минуту?
Дык у тя щоччик щитат до 65535 а сравниваццо с 0CR1A...
И нахера в векторе 0CR1A присваивать обратно к счёту? Нипанятна.
Тыуш тагда в векторе флаг кванта выставляй а уже в майне флаг обрабатывай...
f = f_cpu / period
Осилишь перестановку, которую пятиклассник осилит?
f = f_cpu / period
По такой формуле двигатель делает лишний поворот на некоторый угол...
Дык у тя щоччик щитат до 65535 а сравниваццо с 0CR1A...
И нахера в векторе 0CR1A присваивать обратно к счёту? Нипанятна.
Тыуш тагда в векторе флаг кванта выставляй а уже в майне флаг обрабатывай...
В перспективе плавный старт-стоп ШД. Тем не мненее присваивание или нет, в данном примере не влияет ни на что.
Тем не мненее присваивание или нет, в данном примере не влияет ни на что.
Мошт всё-таки пачитать пра Timer1 , его режимы и тд? Ну шоп пабыстрее палучилось?
а мона вопрос от дилетанта?! на хрена для 16 битного регистра использовать unsigned long??? в этом есть что-то сакральное?
Может л чше ещё раз даташит перечитать и въехать, как правильно работать с таймером ?
Хорошо, как видится работа таймера, на моем примере:
Таймер то зачем применяется? Для задания кванта времени или как?
Меандр генерируется для вращения ШД - это мжно считать приоритетной задачей. Также будет обработка кнопок и вывод на LCD - менее приоритетно, но на вращение ШД оказывать влияние не должно. Поэтому задумка с таймером...
Эту задачу можно на миллисах запросто сделать без таймера.
Ну вот выбор пал на таймеры, а не миллисы. Лаконичность кода подкупила...
Мелкое ковыряние привело к некоей формуле, которая по всей видимости работоспособна. Но есть сомнения в набегающей погрешности оборотов ШД, потому чтообороты в оборотах в секунду, и не всегда целые.
Скорость двигателя получается установить так:
pulses = (F_CPU / 3200 / 1.6)
3200 - это количество импульсов драйвера, когда выбран микрошаг 1/16, по всей видимости следует считать 200 импульсов на один оборот двигателя, умноженные на 16. В некоторую логику это вписывается
1.6 в данном случае количество оборотов в секунду.
Предварительно фактическое количество оборотов двигателя за расчетное время совпадает, шаги в требуемом диапазоне не пропускает и не срывается.
Однако осмысление что к чему так и не пришло....
Печаль