Закончим сегодня всё на тех же 4+kHz,
но с выпиленной логикой esp32,
и реализацией на бодрых технологиях STM
Итак вместо упоротого цикла у нас теперь:
- таймер который дёргает ногами
- при переключении ног запускает АЦП на 8 измерений
- АЦП в режиме DMA, значит оно само складывает нам данные в массив
- (до этого момента процессор и не работал совсем)
- т.к. 8 - это 2 в 3 степени, то мы получаем среднее значение из 8 просто сложив их, а потом сделав битовый сдвиг в право на 3.
В общем всё это шевелится быстро и практически без участия процессора.
Реализация конечно скорее спортивная) потому что никому в здравом уме не нужно измерять EC с частотой 4+kHz.
А дискретизация с частотой 8kHz уже может использоваться в телефонах для оцифровки речи.
Осталось сделать чтобы АЦП измеряло напряжение не каждый раз когда дёргаются ноги,
а например каждый 100й раз =) и тогда EC будет измеряться 40 раз в секунду,
что тоже конечно дохрена для воды, но более чем достаточно для работы в любых других приборах.
но с выпиленной логикой esp32,
и реализацией на бодрых технологиях STM
Итак вместо упоротого цикла у нас теперь:
- таймер который дёргает ногами
- при переключении ног запускает АЦП на 8 измерений
- АЦП в режиме DMA, значит оно само складывает нам данные в массив
- (до этого момента процессор и не работал совсем)
- т.к. 8 - это 2 в 3 степени, то мы получаем среднее значение из 8 просто сложив их, а потом сделав битовый сдвиг в право на 3.
В общем всё это шевелится быстро и практически без участия процессора.
Реализация конечно скорее спортивная) потому что никому в здравом уме не нужно измерять EC с частотой 4+kHz.
А дискретизация с частотой 8kHz уже может использоваться в телефонах для оцифровки речи.
Осталось сделать чтобы АЦП измеряло напряжение не каждый раз когда дёргаются ноги,
а например каждый 100й раз =) и тогда EC будет измеряться 40 раз в секунду,
что тоже конечно дохрена для воды, но более чем достаточно для работы в любых других приборах.
This media is not supported in your browser
VIEW IN TELEGRAM
Зацените точность, с которой таймер держит частоту переключения лапок.
Аж душу греет 🥰
Аж душу греет 🥰
This media is not supported in your browser
VIEW IN TELEGRAM
Видимо я как-то странно перед созданием гербера подвигал этот разьем у дисплея tm1637,
и там и линия питания пропала, и зепля у разьёма не подцепилась :(
Вобщем нашёл ещё одну багу, прицепил землю, добавил библиотеку и дисплей заработал.
#ссылочки
Пока всё что сделано идёт по блогу https://istarik.ru/
АЦП: https://istarik.ru/blog/stm32/113.html
Таймер: https://istarik.ru/blog/stm32/118.html
Дисплей: https://istarik.ru/blog/stm32/132.html
Примеры реализации в его репозитории:
https://github.com/stDstm/Example_STM32F103/tree/master/TM1637_F103/Src
Если где-то чего-то с первого раза не понятно - смотрю на ютбубе в первую очередь народстрим https://www.youtube.com/watch?v=0fpdNWFnggQ и его описание на сайте.
Вот этот чувак ещё подробно и хорошо, но очень занудно разбирает устройство АЦП https://www.youtube.com/watch?v=_fCVWvL6Eq8
и там и линия питания пропала, и зепля у разьёма не подцепилась :(
Вобщем нашёл ещё одну багу, прицепил землю, добавил библиотеку и дисплей заработал.
#ссылочки
Пока всё что сделано идёт по блогу https://istarik.ru/
АЦП: https://istarik.ru/blog/stm32/113.html
Таймер: https://istarik.ru/blog/stm32/118.html
Дисплей: https://istarik.ru/blog/stm32/132.html
Примеры реализации в его репозитории:
https://github.com/stDstm/Example_STM32F103/tree/master/TM1637_F103/Src
Если где-то чего-то с первого раза не понятно - смотрю на ютбубе в первую очередь народстрим https://www.youtube.com/watch?v=0fpdNWFnggQ и его описание на сайте.
Вот этот чувак ещё подробно и хорошо, но очень занудно разбирает устройство АЦП https://www.youtube.com/watch?v=_fCVWvL6Eq8
Графики измерения напряжения в прямую и обратную сторону.
В stm32 много прикольных фишек, которые могут всё делать за тебя. Например мигать лапками в противофазе по таймеру - это просто конфигурируемая опция которая называется комплементарные выходы, и скорости там можно получить сумасшедшие. При этом переключение происходит по таймеру не сразу, а с настраиваемым сдвигом. В итоге получаем 2 прерывания: таймер обновился, лапки переключились.
Те ничего не делая и лишь меняя 2 цифры мы меняем частоту таймера и задержку для измерения АЦП.
Получилось:
2500 тиков нужно чтобы DMA наполнило 16 ячеек АЦП и усреднило данные
200 тиков нужно чтобы всё точно переключилось.
Итого частота которую получается выжать - это 2700 тиков. А результат таких измерений на картинке.
В stm32 много прикольных фишек, которые могут всё делать за тебя. Например мигать лапками в противофазе по таймеру - это просто конфигурируемая опция которая называется комплементарные выходы, и скорости там можно получить сумасшедшие. При этом переключение происходит по таймеру не сразу, а с настраиваемым сдвигом. В итоге получаем 2 прерывания: таймер обновился, лапки переключились.
Те ничего не делая и лишь меняя 2 цифры мы меняем частоту таймера и задержку для измерения АЦП.
Получилось:
2500 тиков нужно чтобы DMA наполнило 16 ячеек АЦП и усреднило данные
200 тиков нужно чтобы всё точно переключилось.
Итого частота которую получается выжать - это 2700 тиков. А результат таких измерений на картинке.
This media is not supported in your browser
VIEW IN TELEGRAM
2700 тиков нужно на измерение.
72MHz у нас частота stm32f103 bluepill
Делим одно на другое, получаем:
26666*Hz частота замера АЦП.
За это время мы померяем половину - положительное или отриацтельное приложение напряжения.
А полный цикл это 2 измерения или частота
13333
Хз зачем я упарываюсь над этими цифрами =)
Там кстати есть ещё несколько мест для оптимизации, но
даже текущие действия излишни.
У процессора остаётся ещё куча времени чтобы крутить фриртос и спамить в юсарт 5 раз в секунду.
[*] - для справки частота дискретизации звука для радио — 22 050 Гц
PS: в итоге поставил таймер на 3600 тиков чтобы с учётом аналогичных вычислений видеть на экране "осцилографа" красивые 10kHz
72MHz у нас частота stm32f103 bluepill
Делим одно на другое, получаем:
26666*Hz частота замера АЦП.
За это время мы померяем половину - положительное или отриацтельное приложение напряжения.
А полный цикл это 2 измерения или частота
13333
Хз зачем я упарываюсь над этими цифрами =)
Там кстати есть ещё несколько мест для оптимизации, но
даже текущие действия излишни.
У процессора остаётся ещё куча времени чтобы крутить фриртос и спамить в юсарт 5 раз в секунду.
[*] - для справки частота дискретизации звука для радио — 22 050 Гц
PS: в итоге поставил таймер на 3600 тиков чтобы с учётом аналогичных вычислений видеть на экране "осцилографа" красивые 10kHz
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
#stm32
Надо не забыть начало работы с отладками нуклео:
1) обновляем stlink на jlink с помощью мануала и тулзов с сайта segger
2) Берем svd файл из папки программы https://www.st.com/en/development-tools/stm32cubeprog.html или качаем с сайта
https://stm32-rs.github.io/stm32-rs/ и кладём в проект
Остальное вроде всё понятно. launch.json такой:
Надо не забыть начало работы с отладками нуклео:
1) обновляем stlink на jlink с помощью мануала и тулзов с сайта segger
2) Берем svd файл из папки программы https://www.st.com/en/development-tools/stm32cubeprog.html или качаем с сайта
https://stm32-rs.github.io/stm32-rs/ и кладём в проект
Остальное вроде всё понятно. launch.json такой:
{
"version": "0.2.0",
"configurations": [
{
"name": "Cortex Debug",
"cwd": "${workspaceRoot}",
"executable": "./build/stm32-G031K8T6-board.elf",
"svdFile": "./JLink/stm32g031.svd",
"request": "launch",
"type": "cortex-debug",
"servertype": "jlink",
"device": "STM32G031K8",
"interface": "swd",
"ipAddress": null,
"serialNumber": null,
// "rtos": "FreeRTOS",
}
]
}
Обновил комп, радуюсь теперь 10 поколению intelCore и монику с диагональю 28" (3840х2160), 32Гб оперативки и очень-очень быстрому nvme-ssd на 500гб =)
Под это дело пришлось переустановить систему, и важно запомнить несколько моментов, потому что на восстановление работы с девайсами ушло 2 вечера:
1) esp32 норм всё, ставим приложение https://marketplace.visualstudio.com/items?itemName=espressif.esp-idf-extension и оно само всё за тебя делает.
2) а вот с stm32 прям печаль. Перебрал все мануалы в интернетах и кучу плагинов для vscode и уже опечалился, но никак не мог скомпилить проект.
А проблема с stm32 в какой-то несовместимости последних версий arm-gcc и build-tools. В итоге решил это таки образом:
- Установил STM32CubeIDE
- Посмотрел как она компилирует
- Нашёл внутри папочки с тулзами, положил их отдельно по красивому пути
- Прописал пути в PATH
STM32CubeIDE - прям колхозный комбаин после которого хочется помыть руки, но там есть прикольные штуки которые можно будет позже посомтреть
Под это дело пришлось переустановить систему, и важно запомнить несколько моментов, потому что на восстановление работы с девайсами ушло 2 вечера:
1) esp32 норм всё, ставим приложение https://marketplace.visualstudio.com/items?itemName=espressif.esp-idf-extension и оно само всё за тебя делает.
2) а вот с stm32 прям печаль. Перебрал все мануалы в интернетах и кучу плагинов для vscode и уже опечалился, но никак не мог скомпилить проект.
А проблема с stm32 в какой-то несовместимости последних версий arm-gcc и build-tools. В итоге решил это таки образом:
- Установил STM32CubeIDE
- Посмотрел как она компилирует
- Нашёл внутри папочки с тулзами, положил их отдельно по красивому пути
- Прописал пути в PATH
STM32CubeIDE - прям колхозный комбаин после которого хочется помыть руки, но там есть прикольные штуки которые можно будет позже посомтреть
Развёл плату с камушком Stm32G031K8T6.
Главная задача разведения - понять можно ли это сделать на 2х слоях, и на какие ноги для этого придётся посадить функционал.
Спортивный интерес - уложить это в минимальные размеры. Зачем на плате енкодер я хз на самом деле, при заказе не буду заказывать его распайку. вместо енкодера всегда можно сделать просто 3 кнопочки.
Увлекает этот процесс, как будто сидишь и решаешь ребус.
После того как плата разведена - можно тестировать функционал камня на отладке nucleo уже сразу используя правильные ноги. Это следующий шаг моего пути.
Главная задача разведения - понять можно ли это сделать на 2х слоях, и на какие ноги для этого придётся посадить функционал.
Спортивный интерес - уложить это в минимальные размеры. Зачем на плате енкодер я хз на самом деле, при заказе не буду заказывать его распайку. вместо енкодера всегда можно сделать просто 3 кнопочки.
Увлекает этот процесс, как будто сидишь и решаешь ребус.
После того как плата разведена - можно тестировать функционал камня на отладке nucleo уже сразу используя правильные ноги. Это следующий шаг моего пути.
3D-шка без дисплея.
Тут правда дырочек под модуль не хватает, они отъехали вбок вместе с дисплеем.
Очень хочется взять и заказать плату, чтобы она побыстрее приехала, чтобы потыкать различные моменты и поправить косяки которые наверняка есть в разводке. И чтобы следующую плату уже заказать как предсерийный образец =)
Но тут как всегда есть одно НО =)
Микроконтроллеры на lcsc кончились 😭😭😭😭
Ну чтож, будем следить за их наличием по ссылке
https://lcsc.com/product-detail/ST-Microelectronics_STMicroelectronics-STM32G031K8T6_C432203.html
Тут правда дырочек под модуль не хватает, они отъехали вбок вместе с дисплеем.
Очень хочется взять и заказать плату, чтобы она побыстрее приехала, чтобы потыкать различные моменты и поправить косяки которые наверняка есть в разводке. И чтобы следующую плату уже заказать как предсерийный образец =)
Но тут как всегда есть одно НО =)
Микроконтроллеры на lcsc кончились 😭😭😭😭
Ну чтож, будем следить за их наличием по ссылке
https://lcsc.com/product-detail/ST-Microelectronics_STMicroelectronics-STM32G031K8T6_C432203.html