Внезапно догадался ткнуть магнитом в имеющийся у меня генератор на 12.8 МГц и обнаружил, что он магнитится.
То есть, он будет искажать магнитное поле, которое я собираюсь мерить магнитометром, расположенным на этой же плате.
Искажение магнитного поля магнитомягкой железкой оценивается так (а магнитожёсткая просто смещает нули, с ней проще):
относительная_ошибка = ((длина + ширина + высота) / 2 / расстояние_до_магнитометра)
3
Это значит, что если хочется ошибку меньше 1/1000, то железка размерами 8 мм должна находиться от датчика на расстоянии больше 40 мм. Какая-то огромная плата получается!
Ну, помчался в лабаз, искать что-нибудь другое.
Тем более, что мне захотелось заодно поменять частоту с 12.8 на 7.3728 MГц.
Нашёл такой генератор, размер у него в два раза меньше, так что если он и железный (а скорее всего), то допустимое расстояние будет миллиметров 20, уже вполне приемлемо.
С новым генератором у UART получаются точные частоты (мне хотелось 230400).
С новым генератором в моём МК можно включить учетверение системной частоты, так что скорость счёта повысится в 2.3 раза, по сравнению с генератором на 12.8 МГц.
Сплошное щястие!!!
Потом задумался о скорости отсчётов.
Конечно, 400 в секунду — это хорошо. Но нужно ли?
У рулевых машинок предельная частота управляющих импульсов 140 в секунду, в три раза меньше.
Если складывать три последовательных отсчёта, то получится 133 в секунду, как раз уложится в 140.
И считать можно будет в три раза реже.
Но и ошибка приближения косинусов (1 - x
2 / 2) при максимальной скорости вращения будет 1/5000.
Но тут вскакивает вопрос, а будет ли в нормальном полёте максимальная скорость вращения?
Если машинка отрабатывает команду за 0.05 с, то "туда-сюда" она отработает за 0.1 с, это как бы 10 колебаний в секунду = 10 Гц.
Вообще-то, врядли машинка сможет управлять ракетой, которая колеблется с такой частотой, слишком большая она. Но, предположим, ракета так колеблется.
Если при этом колебания имеют амплитудную скорость 2000 градусов в секунду, то эта амплитуда колебаний будет равна:
x = A * sin(w * t) — колебания по синусоиде
dx/dt = A * w * cos(w * t) — скорость колебаний
Максимальная_скорость = A * w * Косинус_нуля
A = Максимальная_скорость / w
2000 град/с = 2000 / 2 / pi = 34.9 рад/с
10 Гц = 2 * pi * 10 = 62.8 рад/с
A = 34.9 / 62.8 = 0.55 радиана = 32 градуса.
Шибко много, однако! Если ракета будет рыскать на ± 32 градусов, это врядли можно назвать нормальным полётом!
Если же предположить, что рыскать она будет всего на несколько градусов, и частота этих рысканий будет меньше 10 Гц, то измеряемая гироскопами скорость вращения будет в десятки раз меньше максимальной, так что ошибки в арифметике будут совсем небольшие, миллионные и меньше.
То есть, не имеет особого смысла делать 400 вычислений в секунду, а лучше уменьшить скорость до той, которую машинки могут переварить — 400 / 3 = 133.
При этом вычисления (с новым генератором) будут занимать менее 30% времени.