А обязательно ли корректировать каждую микросекунду?
Можно раз в 100мкс обновлять "новую цель" и чтобы PRU шпарило к ней.
Либо просто "раз в 100мкс вычислять новый интервал между импульсами", либо "раз в 100мкс вычислять новый интервал + прибавку к нему". При этом PRU будет каждые 100мкс получать более-менее правильные значения, а между делом линейно наращивать/сокращать интервал на полученное же значение.
Тогда деление в PRU не понадобится, а достаточно будет простого t1 := t1+dt;
Вот исходная формула: T = T0/(1+T0*a*t);, ее можно привести к виду: T = T0 + ΣdT.
T0 - текущий период известен, t - время разгона/торможения известно (изначально жестко задано), n - количество тактов известно (т.к. t известно), dT - приращение на каждом такте известно. Т.е. на каждом такте прибавляем к T0 накопленную сумму, суммируем от 0 до n. В основной программе один раз раcчитывается и передается в PRU dT и n
Последний раз редактировалось Вольд; 11.03.2017 в 17:34.
"Проблема" в том, что для правильной физики процесса формула должна быть не для задержек, а для частоты.
Т.е. частота должна расти линейно, а задержки будут расти как разница корней.
Другое дело, что если обновлять T0 раз в 100мкс, то никто не заметит подлога и наверняка будет всех устраивать.
PS. В моём блоке PRU_STEPPER реализована корректировка длительности каждого импульса только из-за того, что так было _проще_ сделать. Да, да. Именно проще всю программу написать в PRU, т.к. тогда её гораздо проще отлаживать. По крайней мере мне. Запускаешь на эмуляторе и всё видишь.
Если же делать половину программы в "100мкс таймере" и "половину в PRU", то отлаживать становится сложнее, т.к. у меня нет "эмулятора КДС кода".
Например: в КДС программе можно и нужно использовать нормальные деления REAL'ов. А мой эмулятор делался для PRU, в котором дробных вообще нет.
Последний раз редактировалось Вольд; 11.03.2017 в 18:10.