Здравствуйте, хочу сделать драйвер для qcwdrsstc фазо-сдвигающий мост, на мк.
Есть у меня stm32f103c8. Работает он на частоте 72МГц, имеет 4 таймера на каждом - 4 канала, таймеры работают на 72МГц, есть DMA, на выходах мк максимальное время фронта и среза 120нс на нагрузку в 50пФ.
Суть работы такова (коротко) :
С ОС катушки Теслы поступает сигнал, 1-ый таймер измеряет длину импульса, 2-ой таймер добавляет задержку этому сигналу в зависимости от частоты сигнала и постоянного значения(предиктор).
3-ий таймер добавляет задержку в зависимости от частоты и переменной
фазовая_задержка. Процессор постоянно считает значение
фазовая_задержка, которое он пересылает в регистры 3-го таймера.
Немнго детальней:
фазовая_задержка =
максимальная_задержка\(100\
переменная_изменяющияся_со_временем)
Все переменные типа float,
максимальная_задержка - это число, пересылаемое 1-ым таймером через DMA в память.
переменная_изменяющияся_со_временем будет формироваться программно или 4-ым таймером.
Эта операция и прочие будут выполнятся процессором циклически и сразу передаваться в регистры 3-его таймера.
Чтобы на выходе силового моста получалось такое:
Теперь таймеры:
1-ый таймер: по фронту сигнала от ОС на 1-ом канале, таймер начинает считать(на частоте 72МГц) пока на 2-ой канал не прийдет срез, после этого накопленное в таймере число записуется через DMA в память, а счетчик таймера обнуляется.
2-ой и 3-тий таймер будут двигать фазу по отдельности, один из них будет как предиктор, другой активно добавлять задержку сигналу в зависимости от частоты сигнала и переменной
фазовая_задержка.
Есть несколько вариантов как это сделать.
Вариант1:
1-ый канал этих таймеров настроен на генерацию одиночных ШИМ импулсов. 2-ой канал при фронте входного сигнала включает 1-ый канал, Trigger Mode.
Вариант2:
3-ий канал настроен на генерацию переодических ШИМ импульсов, в регистр этого канала CCR3 помещено время фазового сдвига.
4-ый канал также настроен на генерацию переодических ШИМ импульсов, но в регистр этого канала CCR4 помещено время выходного импульса.
В авто перезагружаемый регистр ARR загружено, например, максимальное число.
2-ой канал ловит фронт от внешнего сигнала, перезапуская таймер, Reset Mode.
На выходах 3-тего и 4-ого канала стоит внешний логический XOR с выхода которого забираем сигнал.
Наверно, есть еще мого вариантов, как это сделать.
Итак:
С выхода 2-ого таймера сигнал усилится и поступит на, например, левый полумост, силовго моста.
С выхода 3-ого таймера - на правый полумост.
Если stm32f103c8 не будет справлятся, то STM32F407VET6 точно все затянет.
Что вы о этом думаете? Можно ли сделать нормальный драйвер на базе МК, без кучи логики в виде ПЛИС? Или МК слишком медленный?