Пришли датчики AS5045 и новый контроллер StormBGC32 v1.32 с драйверами DRV8313
http://www.olliw.eu/storm32bgc-v1-wiki/ ... rM32_v1.32 (лучше брать 1.31!!! меня китайцы надули)
Старый датчик справа новый слева
В этот раз никаких проволочек, датчики приклеил на двойной скотч, быстро, аккуратно, красиво.
Раньше было вот так
post335261.html#p335261post335796.html#p335796В этот раз решил использовать тонкие гибкие шлейфы с коннекторами. (паять провода с шагом 1.27 мало удовольствия).
Начиналось всё хорошо, развёл новые платы всё припаял включил а не работает, ни одна лампочка не светит.
Я забыл что шлейф зеркально подводит контакты на разных сторонах, в итоге замкнул + с -
Слава богу всё обошлось, переразвёл плату которая крепится к контроллеру, и всё запустилось.
Контроллер изначально идёт с STM32F1 но позволяет установить STM32F4 , две перемычки нужно выпаять и впаять конденсаторы на их место, что я и сделал.
Поскольку прежний мой контроллер использовал продвинутые таймеры Tim1,Tim8 а этот использует три обычных Tim3,Tim2,Tim4
драйвер BLDC пришлось переписать, да и вообще все ножки по другому задействованы.
Поскольку много чего пришлось менять переповерил всю программу и пришёл к таким выводам.
1) я использовал SPI в режиме RXonly с DMA, при этом при каждом новом чтении цепочки датчиков я заново настраивал соединение SPI а по окончании полностью выключал SPI контроллер.
Всплыли следующие косяки которые я раньше не замечал.
- когда SPI выключен он освобождает ножки в результате если они не подтянуты никуда на них остаётся плавающее напряжение
- в режиме Master RXonly сигнал SPI clk никак не привязан к количеству считываемых данных, т.е. он просто тупо молотит пока его не остановят, а поскольку я ещё и DMA юзал то программа вообще плохо контролировала эту ножку, она могла запросто считать за 200us и потом ещё 100us молотит пока не очнётся и не выполнит команду SPI stop
но и тут не всё так просто, в момент когда мы говорим стоп на выходе SPI clk могло быть как 1 так и 0 , т.е. после выключения работают встроенные подтягивающие резисторы, в результате там частенько проскакивали медленные фронты из 0 в 1.
короче косяк на косяке, решил переделать забил на DMA читаю программно, и не вырубаю SPI полностью а лишь останавливаю его SPID3.spi->CR1 &= ~(SPI_CR1_SPE);
теперь все фронты чёткие без сюрпризов, на время чтения лочу программу чтобы другие потоки не перехватили управление
возможно этим были вызваны проблемы с непредсказуемым уходом в режим калибровки
2) в старом контроллере силовые транзисторы напрямую подключены к контроллеру, без промежуточных драйверов в результате транзисторы довольно сильно грелись не зависимо от того какой deadtime я ставил, Это также влияло на точность движения мотора на малых оборотах, в новом контроллере DRV8313 у низ очень маленький вcтроенный deadtime плавность движения повысилась, драйверы почти не греются
3)
AS5045 в отличие от As5040 выдают в другую сторону положительное направление(под вопросом, возможно просто фазы моторов отличаются от старого контроллера), убил на это один вечер, не мог понять почему данные есть а моторы не крутятся.
4) as5045 выдают 18бит+1 в режиме цепного чтения, распарсить это оказалось не так тривиально как кажется,получается данные размазаны между несколькими байтами (например 5тый датчик в цепочке размазан по трём байтам)
ещё вечер убил на то чтобы это решить.
короче, всё заработало , двойной скотч рулит
Зы а вот так я травил платы
(фото пересвечено, в реальности раствор тёмно зелёный)