А на действующее оборудование в доступе? Если да,я бы промерил бы на нём всё что можно.
Но поднимать напряжение надо. И как выше сказали,настраивать ускорение. Я на чпу деревяшечной намучился с этим. Если стартует резче чем нужно,то может произойти срыв и мотор просто загудит на месте. Длину проводов учитывай.
Да вот проблема в том, что действующее оборудование не в доступе, потому что оно и действующее, заказчик не даст линию остановить, надо изголяться
Напряжение а) выше 30В не поднять, так как нет подходящего источника питания; б) на производстве питаются от тех же 24В, которые способен выдать ПЛК
Сейчас напишу адекватный код для ускорения, попробую с ним чистый loop(), если получится, буду пробовать ввести прерывания, чтобы не ломалось чтение, на которое уходит ~150мкс
Если не получится, пробовать с шимом не буду, думаю, хотя можно и там дискретно частоту увеличивать
Ну и последняя надежда будет на плк, чтобы он останавливал шаговик, когда скажет ардуино
Ну и на хрен брать задачу на которую нет времени. Форум ее за тебя точно делать не будет.
Если бы меня кто-то спрашивал, я бы точно не занимался сейчас шаговиками
Сделать за меня, кажется, я не просил, нигде не было смысла “вот задача, расскажите, как сделать”
Я описал, что я делаю, что получается, спросил советы, мнения, разве не для этого форум?
Можно поподробней что и откуда 24 бита приходят?
24 бита идет с ацп
С частотой 80Гц он подает сигнал, что можно забирать значение, пока сигнала нет, я выполняю yield(), в которую пробовал вставить tick() (3 строка)
Значение готово - считываю его 24 бита, + отправляю биты для режима, в котором ацп должен работать, в моем случае 2 дополнительно
Время выполнения замерил через micros, знаю, что не прецизионно, но когда речь идет о разнице 84 и 150мкс, уже не так важно строить конструкции высокой точности
/*ЧТЕНИЕ СЫРОГО ЗНАЧЕНИЯ*/
long read() {
while (bitRead(_SFR_IO8(_Read), _dataPin) == HIGH) yield();
timer = micros();
_weight = 0;
for (uint8_t i = 0; i < 24; i++) { // посылка сигналов тактирования
bitSet(_SFR_IO8(_Write), _clkPin); //digitalWrite(_clock, HIGH);
delayMicroseconds(1);
_weight <<= 1;
if (bitRead(_SFR_IO8(_Read), _dataPin)) _weight |= 1;
bitClear(_SFR_IO8(_Write), _clkPin); //digitalWrite(_clock, LOW);
delayMicroseconds(1);
}
for (uint8_t i = 0; i < _chan + 1; i++) {
bitSet(_SFR_IO8(_Write), _clkPin); //digitalWrite(_clock, 1);
delayMicroseconds(1);
bitClear(_SFR_IO8(_Write), _clkPin); //digitalWrite(_clock, 0);
delayMicroseconds(1);
}
if (_weight & 0x800000) _weight |= 0xFF000000; // отрицательные
timer = micros() - timer;
return _weight;
}
Самое простое - пустить пульс с таймера. И измерять его не глазом, а частотометром. Софтэмуляция степа выше 2000pps параллельнл с другим функционалом на авр-ке практически обречена на провал.
А говорили рабство побеждено.
Вот так сделать. Провести работу. Самую обычную, которой миллионы инженеров занимаются каждый день.
Чтение ацп,думаю,возможно разделить на байты. Может и поможет,смотря какая скорость передачи,какой интерфейс. Если и2с на 400кГц, 1 байт всего 20-30мкс,если не ошибаюсь. SPI можно ещё быстрей. В частоту 5000ш/с (200мкс) укладывается с огромным запасом. Ещё время будет пофилонить) Ну или расчёты какие проводить.
Ацп же ведомое наверно,ждёт пока данные МК примет или как? Перечитал внимательно. При 80Гц(12.5мс) по данной методике можно ютуб успеть скачать)
Не совсем понял эту конструкцию. Программно читать побитно моветон. Это аппаратный spi за считанные микросекунды сделает.
Предлагаю погонять аксельстеппер и посмотреть что он сумеет выдать в пустом лупе. Параллельный контроль частотометром/осциллографом.
С плавным ускорением в while true и без библиотеки для шаговика, лучшее, чего удалось добиться, период в 150мкс раз через раз, быстрее уже не получается, таймер не дал мне желаемого результата, если я его правильно использовал
Попробую с плк сейчас,
//While(1)
while (1){
if (micros() - timer >= period ) {
bitClear(PORTC, 0);
delayMicroseconds(4);
bitSet(PORTC, 0);
if(period >=150){
period -= 1;
}
timer = micros();
}
}
//Таймер
ISR (TIMER1_A) {
bitClear(PORTC, 0);
delayMicroseconds(4);
bitSet(PORTC, 0);
if (period <= 4000) {
period++;
Timer1.setFrequency(period);
}
}
Наоборот, МК ждет, пока ацп готово отправить
80 Гц это только готовность АЦП, меня беспокоило то время, когда ацп уже отправляется биты
Не совсем понял, почему моветон?
У АЦП нет SPI интерфейса, если что, ниже отрывок из даташита, в котором описано получение данных с АЦП: отправляется импульс SCK, выдается один бит с АЦП
Отрывок из даташита
Pin PD_SCK and DOUT are used for data
retrieval, input selection, gain selection and power
down controls.
When output data is not ready for retrieval,
digital output pin DOUT is high. Serial clock
input PD_SCK should be low. When DOUT goes
to low, it indicates data is ready for retrieval. By
applying 25~27 positive clock pulses at the
PD_SCK pin, data is shifted out from the DOUT
output pin. Each PD_SCK pulse shifts out one bit,
starting with the MSB bit first, until all 24 bits are
shifted out. The 25th pulse at PD_SCK input will
pull DOUT pin back to high (Fig.2).
Input and gain selection is controlled by the
number of the input PD_SCK pulses (Table 3).
PD_SCK clock pulses should not be less than 25
or more than 27 within one conversion period, to
avoid causing serial communication error.
Думаете, библиотека сможет быть быстрее моего простого кода с регистрами?
Не сможет. Потому что там правильно рассчитывается разгонная кривая. Но и медленнее.
А как только насуете в свой скетч ещё чего-то кроме степа то и с вашим методом шаговый пойдёт, как заводчанин в пятницу вечером.
Ознакомился с документацией, аксельстеппер тоже не помощник
\par Performance
/// The fastest motor speed that can be reliably supported is about 4000 steps per
/// second at a clock frequency of 16 MHz on Arduino such as Uno etc.
/// Faster processors can support faster stepping speeds.
А теперь сравним с SPI
Не забывайте что у SPI полярность SCK и DATA можно поменять.
Таким образом просто принимаем в 3 захода по 1 байту. Потратим такты только на чтение 3х байт куда надо.
Похоже, что вы вообще не пытаетесь вникнуть в то, что вам пишут, считая что есть “волшебная команда”, по которой шаговик начнет работать как авиационная турбина.
Да, действительно, в рамках теста можно и SPI использовать, но итоговый проект должен включать в себя 4 канала по 1 АЦП и ЦАП на каждом, управляется все через 1 Nano, когда есть уже 4 SPI девайса и на SPI прицепить еще 4 без чипселекта
Наверняка, это возможно, но не стоит экономии пары десятков микросекунд в итоговом проекте