Пытаюсь управлять скоростью шагового двигателя, переопределяя делитель частоты в основном цикле, но получается неадекватная частота вращения. Подскажите как правильно управлять частотой вращения? Переопределять делитель только в обработчике прерываний?
В коде пин 2 использую для старт стопа двигателя.
//шаговый двигатель с драйвером степ-дир
//в простейшем случае вращения с постоянной скоростью без ускорения
//09.02.20
//***********************************************//
Код: Выделить всё
#include <TimerOne.h>
#include <StepDirDriver.h>
StepDirDriver myMotor(10, 11, 12); // создаем объект типа StepDirDriver, задаем выводы для сигналов
#include <MsTimer2.h> //библиотека прерывания по таймеру
// обработчик прерывания
#include <Button.h> //библиотека обработки сигнала датчика типа кнопка
#define GORELKA_PIN20 2 //к этому пину подключаем контакты реле управляемого напряжением включения горелки (220 В).К пину подтянут +5в через 10кОм на нем высокое Пин
//становится активен , если замыкается на GND
int N = 10; //количество считываний кнопок в объектах типа кнопка для формирования массива осреднения в методе AWERAGE библиотеки <Button.h>
//это же и количество пустых циклов loopв начале программы для корректной работы метода AWERAGE
Button gorelka4(GORELKA_PIN20, N); //создание объекта gorelka4 контактов реле управляемого включением горелки (типа кнопка)
volatile bool prevStatePress4 = false; //признак предыдущего состояния контактов реле, управляемого напряжением включения горелки (синими проводами), перед фактом
//размыкания контактов
bool pin2; //переменная характеризующая пин 2
int divider;
void setup()
{
// Serial.begin(9600);
pinMode(GORELKA_PIN20, INPUT); //пин к которому присоединены (НР) контакты реле, управляемого включением горелки (появление напряжения на синих проводах)
//pinMode(2, INPUT);
Timer1.initialize(250); // инициализация таймера 1, период 250 мкс = 0.25 мс
Timer1.attachInterrupt(timerInterrupt, 250); // задаем обработчик прерываний
myMotor.setMode(0, false); // шаговый режим, без фиксации при остановке
myMotor.setDivider(10); // делитель частоты 10 (1 оборот в сек) для двигателя с 1 об = 400 полушагов и и частотой прерываний 250 мкс
//Rpm = 60 000 / ( divider * Tcontrol * Nдвигателя * Nмикрошагов)
//Rpm – скорость вращения в оборотах в минуту;
//Tcontrol – период вызова метода control() в мс; В нашем случае 250 мкс = 0.25мс
//Nдвигателя – число шагов двигателя на полный оборот; В нашем случае 200 шагов/оборот
//Nмикрошагов – число микро шагов двигателя на одну фазу. Для шагового режима Nмикрошагов = 1, для полу шагового Nмикрошагов = 2 и т.д
//в нашем случае Nмикрошагов = 2
myMotor.step(0); // начальный запуск
MsTimer2::set(2,timerInterupt2); // задаем период прерывания по таймеру 2 мс
MsTimer2::start(); // разрешаем прерывание по таймеру
}
//-------------------------------------- обработчик прерывания 0,25 мс по первому таймеру
void timerInterrupt()
{
//myMotor.setDivider(divider);
myMotor.control(); // управвление двигателем
}
//----------------------------------------------------------------------------------------------
//функция прерывания по таймеру 2
void timerInterupt2()
{
gorelka4.filterAvarage(); // вызов метода фильтрации по среднему для контактов реле, управляемого напряжением включения горелки
if (gorelka4.flagPress == false)
{
//Serial.println("gorelka4.flagPress ");Serial.println(gorelka4.flagPress);
myMotor.step(0);//останов двигателя
}
if (gorelka4.flagPress == true) //включилась горелка и контакты реле, управляемого синими проводами горелки замкнулись (на пине 4 стало низкое)
{
//divider = 17;
//myMotor.setDivider(divider);
myMotor.step(80000);//запуск двигателя на большое число шагов для непрерывного вращения
}
}
//------------------------------------------------------------------------------------------------------
void loop()
{
divider = 17;
myMotor.setDivider(divider);
}