-
Постов
367 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные AVI-crak
-
-
On 12/2/2022 at 2:02 PM, yes said:
размотки нет, записаны команды начиная от текущей (i-той), потом (i-1), (i-2) ... (i-количество пакетов в памяти).
Ну хорошо, а почему на ютюбе ноль роликов с демонстрацией сего действа. Насколько я понимаю - это не сложно, и даже не требуется реальная программная ошибка, достаточно нажать "стоп".
-
On 12/1/2022 at 4:55 PM, jcxz said:
Непонимающим советую купить платку типа OM13054 и увидеть как это всё работает на практике.
Даже арбузы перед покупкой проверяют десятками способов. А тут ноль роликов на ютюбе с размоткой потока команд в обратную строну.
Я реально хочу это увидеть, и не верю что на это способна отладка без полноценной трассировки.
-
Итак, я успел просмотреть десяток роликов про трассировку с участием реального МК. Рекламных и обучающих роликов ещё больше, но если там нет доски - то ролик пропускается.
Дык вот, каждый ролик демонстрирует как могло-бы работать, но не работает, потому что у нас нет отладчика за тысячу баксов. А те возможности что демонстрируется - доступны для меня на древней версии embitz, и относительно свежем stlink3.
Чего я хочу увидеть - отмотку буфера операций ядра назад от точки сбоя.
-
On 11/30/2022 at 8:02 PM, jcxz said:
Советую всё же почитать
Неее, чтобы меня заинтересовать - нужен мешок плюшек.
Или видеопрезентация реального захвата экрана компа во время трассировки МК, с простым и практичным закадровым голосом. Можно нарезку сделать, главное чтобы смысл не улетучивался. Вот с этим ETB в главной роли.
-
То о чём говорится - требует jtag отладчика с реальными аппаратными линиями трассировки, через swd трассировка в реальном времени невозможна.
GTAG + 16линий трассы + аппаратный полный usb3.1 + быстрая память на пару гиг ->>> имеет ценник выше 1к зелени. Предназначен для очень жирных фпга и мк. Программное обеспечение тоже имеет не гуманный ценник, и не продаётся в нашей стране. Кроме того, железяка в любой момент может превратиться в кирпич, если заокеанскому партнёру чего-то не понравится. Офлайн железка работать не умеет, и кстати не продаётся у нас.
Свистоперделки с одной линией трассировки, не способны на трассировку в реальном времени даже на заниженной до 1МГц тактовой ядра мк. Оригинальный stlink3 - тоже не может, я проверял.
Я не знаю других вариантов, но с удовольствием послушал-бы о них.
-
On 11/3/2022 at 12:56 AM, Arlleex said:
одновременные доступы к шинам в STM32 распределены по карусельному типу
Верно, кто раньше встал - того и тапки. Но есть тонкости, арбитраж шины происходит по приоритетам. Ядро может "выключить" поток дма, а дма уже нет. Более того, дма память-память в случае выигрыша - будет молотить до конца, остальные каналы будут в ожидании. Если в этот момент ядро обратится к памяти - сработает очередь.
Просто для возникновения подобных условий нужно ооочень сильно постараться, ну прям совсем сильно. В простом коде подобные события огромная редкость, а если использовать хал - исчезающая редкость. Однако полностью исключать данный вариант сбоя - глупо. Тем-более что цена не высока, всего одна запись
_VAL2FLD(DMA_SxCR_PL, 1)
On 11/3/2022 at 1:18 AM, Arlleex said:Мне кажется, Вы не владеете вопросом =(
Тогда просветите плиз значение поля приоритета для дма. Чего это такое и зачем оно там вообще.
-
On 11/3/2022 at 12:56 AM, Arlleex said:
параллельно они не могут быть обслужены
Могут, в случае занятости системной шины данных на то самое "таки огромное время". Хотя точнее будет не параллельно, а одновременно, в момент освобождения системной шины данных, а там как повезёт.
-
On 11/2/2022 at 11:50 PM, OPTIMA said:
Хоть один факт покажите?
Линейные измерения точным инструментом, чем больше стадий перемаркиров - тем тоньше корпус. А вообще это была хохма, ну кроме цветной революции. ST сдвигает заказы на 2024 год всем подряд, ну и старые висят уже два года. Чем она кормится, мне лично не очень понятно.
-
On 11/3/2022 at 12:22 AM, Arlleex said:
Зачем разные?
Пока в проекте используется всего два дма - проблем особых нету. Но если задействовать три и более - начинаются проблемы. Даже при использовании программной функции копирования могут быть проблемы, потому как ядро имеет приоритет выше дма. Приоритеты для дма работают весьма прикольно, они создают очередь для триггеров обмена, в данном случае от spi. На режим память-память - приоритеты ставить бесполезно. Если в проекте используется несколько периферийных узлов с одним регистром на чтение/запись - не обязательно строить лесенку из приоритетов, достаточно обеспечить разницу в пределах каждого узла.
Чего произойдет при преждевременной записи раньше чтения данных от spi - потеря данных, и взведённый флаг ошибки.
-
On 11/2/2022 at 9:30 PM, Reystlin said:
Организовал в итоге работу SPI через DMA
Отрезал нули - получилось красиво и компактно. Но изначальный полный длинный вариант нужно где-то сохранить, и использовать для копирования.
Первоначально примеры были только на передачу, а сейчас ещё и чтение. Нулевой и пятый поток обращаются на один адрес периферии, в этом случае нужно использовать уровни (разные!!!) приоритета для дма.
_VAL2FLD(DMA_SxCR_PL, 1)| /// priority level 0-3
Управление ногой перенести в прерывание дма на чтение, оно срабатывает самым последним.
Если хочется чтоб всё было красиво - реализуй все прерывания ошибок: от дма, от spi. В нормальном режиме они даже срабатывать не будут, но явно спасут от зависаний. Есно нужна функция разгребания всех возможных ошибок, отдельная функция!!!!. Отладка подобных функций достаточно прикольное занятие, я использовал для этих целей напильник. Принудительно вносил помехи в линии передачи данных.
-
Всё очень просто.
Чип дип закупается в платане, платна закупается на али, продавец али закупается во Вьетнаме у подвального мастера Лии. Товарищ Лии покупает в китае чипы серии GD по 2 бакса, стачивает название, и заново маркирует как STM. Компания GD скупила огромное количество бракованных кристаллов st, перешивает под свои изделия, и заливает в пластик.
А сама компания ST ничего не делает уже почти два года, у них там цветная революция на 48 полов.
-
Извиняюсь, f407 нету, проверить не смог. Но IDE весело собирает код без ошибок. Исправил.
Spoilervoid SPI3_Send(volatile uint8_t *data, uint16_t len) { DMA1->HIFCR = (DMA_HIFCR_CTCIF5 | DMA_HIFCR_CHTIF5 | DMA_HIFCR_CTEIF5 | DMA_HIFCR_CDMEIF5 | DMA_HIFCR_CFEIF5); DMA1_Stream5->CR = 0; DMA1_Stream5->NDTR = len; DMA1_Stream5->M0AR = (uint32_t)data; DMA1_Stream5->PAR = (uint32_t)(&SPI3->DR); DMA1_Stream5->CR = _VAL2FLD(DMA_SxCR_CHSEL, 0)| /// channe - tmigger _VAL2FLD(DMA_SxCR_DIR, 1)| /// memory_to_peripheral DMA_SxCR_MINC| /// memory increment mode DMA_SxCR_EN; while(!(DMA1->HISR & DMA_HISR_TCIF5 )); while((SPI3->SR & (SPI_SR_BSY | SPI_SR_TXE)) != SPI_SR_TXE); };
-
Опубликовано · Изменено пользователем AVI-crak · Пожаловаться
Spoiler#include "gpio_one.h" /// https://github.com/AVI-crak/gpio_one void SPI3_Init() { RCC->APB1ENR |= RCC_APB1ENR_SPI3EN; RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN; RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; gpio_one_pin(zap_gpio.C.pin10.v_af06_i2s3_ck_spi3_sck.speed4.lock_on); gpio_one_pin(zap_gpio.C.pin11.v_af06_spi3_miso.speed4.lock_on); gpio_one_pin(zap_gpio.C.pin12.v_af06_i2s3_sd_spi3_mosi.speed4.lock_on); gpio_one_pin(zap_gpio.A.pin15.v_af06_i2s3_ws_spi3_nss.speed4.lock_on); SPI3->CR1 = 0x0; SPI3->CR2 = SPI_CR2_SSOE | //Вывод NSS - выход управления SPI_CR2_TXDMAEN; SPI3->CR1 = _VAL2FLD(SPI_CR1_BR, 2)| // Baud rate control /8 SPI_CR1_MSTR | // Режим Master SPI_CR1_BIDIMODE | // 1 линия SPI_CR1_BIDIOE | // только передача SPI_CR1_SPE; // вкл }; void SPI3_Send(volatile uint8_t *data, uint16_t len) { DMA1->LIFCR = (DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0); DMA1_Stream5->CR = 0; DMA1_Stream5->FCR = 0; DMA1_Stream5->NDTR = len; DMA1_Stream5->M0AR = (uint32_t)data; DMA1_Stream5->PAR = (uint32_t)(&SPI3->DR); DMA2_Stream5->CR = _VAL2FLD(DMA_SxCR_CHSEL, 0)| /// channe - tmigger _VAL2FLD(DMA_SxCR_DIR, 1)| /// memory_to_peripheral _VAL2FLD(DMA_SxCR_MBURST, 1)| /// incremental_burst_of_4_beats DMA_SxCR_MINC| /// memory increment mode DMA_SxCR_EN; while(!(DMA1->LISR & DMA_LISR_TCIF0 )); while((SPI3->SR & (SPI_SR_BSY | SPI_SR_TXE)) != SPI_SR_TXE); };
-
Желательно использовать макрос _VAL2FLD(field, value) для заполнения полей регистра, он позволяет избежать ошибки переполнения. DMA кроме номера потока (в названии), имеет номер канала - по которому принимает управление на запись/чтение CHSEL[3:0]. Информация о каналах DMA находится Reference manual для вашего мк.
Регистр DMAx_Streamx->CR имеет 19 обязательных полей для заполнения, буквально 19 строк. Каждый раз печатать одинаковые буквы весьма утомительно, одинаковые буквы для любого дма. Проще один раз напечатать запись в переменную всех обязательных полей, и при copy/paste - удалять ненужное в данный момент. Удалять проще чем печатать заново.
-
On 10/20/2022 at 10:03 PM, jcxz said:
При активном кодинге обычное количество нажатий клавиш в день у меня = 20-30 тысяч. Иногда бывает и больше (до 40тыс).
Набивание текста по шаблону не является интеллектуальной работой!!! У меня при набивании таблиц получалось по 10к строк в день, и запястья потом болели. Больше выжать не смог, слишком много разной информации из разных источников, которые нужно свести в одну строку, и так пока глаза не опухнут. Однако я не считаю эту работу интеллектуальной, потому как её может выполнять даже обезьяна с купленным дипломом.
На второй день решил автоматизировать это дело, получилось примерно две сотни строк моего кода, и в сотни раз больше - чужого, ошибки вылавливал с неделю. Вот это настоящий кодинг, когда приходится думать над алгоритмом, и множество раз его переписывать. Скачать скетч как в аурдино, или например заполнять готовые структуры графических элементов - это всё не то. Алгоритма не существовало до этого момента, и это самое основное.
Вся "обезьянья работа" была выполнена моим алгоритмом за час с небольшим. Без ошибок и в идеальном виде. На работу выделяли три месяца, остаток я потратил на свои проекты. Без угрызений совести и ночных кошмаров. Но в эти 200 строк мне пришлось пялится целую неделю!!! То-есть по вашему критерию, моя скорость кодинга ниже плинтуса.
stm32cubeide - вообще не использую, не срослось.
-
On 9/25/2022 at 3:37 PM, student23 said:
Как вы поняли, управляю двигателем через ШИМ.
А подумать?
Коллекторный двигатель выдаёт эдс когда вращается, а ток потребляет по формуле ("напряжение питания" минус "эдс мотора") делённое на омическое сопротивление обмоток. Ток измерять можно, но только в момент замкнутого ключа шима - синхронно. Хотя гораздо точнее обороты считываются с эдс, измерением напряжения в момент открытого ключа шима. Там прям линейная зависимость, и многократно дешевле получается.
-
On 8/23/2022 at 1:24 AM, x893 said:
Аккумулятор фазы - очень сложно для меня.
У нас в ПТУ этому не учили2001 год, студент сдаёт диплом на модный тогда Z80. Престарелый электорат сонно кивает носом, решительно нихрена не понимая в теме. И тут один из них слышит знакомое слово аккумулятор..
- Скажите голубчик, аккумулятор у вас кислотный или щелочной?
dimir - Нужен всего один таймер, настроенный на частоту шима, и несколько глобальных переменных. Таблица шима тоже только одна нужна.
-
Да, у меня мотор на 20КГц шима перегревается, когда хавает 3,5А на холостых оборотах через инвертор. И почти холодный, когда работает от сети на прямую (1,4А). Инвертор не мой, а чистокровный супердешовый китаец - точно так-же как и у всех сейчас.
-
On 8/22/2022 at 2:33 PM, jcxz said:
Чтобы убрать свист надо повышать частоту ШИМа.
Выше 5КГц - железо мотора начинает дико греться. Не обмотки, не якорь, и даже не провода, а именно пакет железных пластин - на котором катушки намотаны. Для того чтобы обойти потери - ставят внешние индукторы. Частотник в подобном исполнении выдаёт на выхлоп уже не шим, а готовый к употреблению синус, чистый как слеза электрика.
Есно низкочастотные дешёвые игбт с али - для этой цели уже не годятся. Применяются классические мосфеты целыми пачками, на частотах в 200Кгц и выше. Дроссели кстати тоже пачками на одну фазу, потому как качественного дешёвого кольца на 5 киловатт - просто не существует. Ну и цена взлетает в космос.
Использовать скалярное управление при подобных тратах на железо - просто кощунство. Это как атомной станцией управлять через Z80.
-
On 8/21/2022 at 12:58 PM, Сергей Борщ said:
Чтобы не вызывать прерывание таймера на каждый отсчет, а готовить сразу кучу отсчетов в прерывании ПДП.
Там основная частота шима 5КГц, dimir своим кодингом отчётов на секунды нашлёпает, представляешь какая реакция на кнопки будет?
К тому-же у него три таблицы шима, под три фазы - то-есть человек практически не обучаем.
-
On 8/21/2022 at 1:33 AM, Сергей Борщ said:
Можно быстро-быстро методом DDS набить половину массива
Зачем страдать и мучаться, если можно в прерывании выполнить четыре целочисленных умножения не напрягаясь. Для моторов шим выше 5КГц не поднимается - железо не тянет (греется). К тому-же стыковать массивы с разным окончанием фазы - та ещё задачка. Скалярный метод тянет даже мега на своих 16МГц без напряга, прямо в прерываниях.
К тому-же этот метод в одном шаге от векторного управления.
-
On 8/20/2022 at 10:35 PM, dimir said:
Я настраиваю таймер на шим и на DMA.
На выхлопе будет стабильная частота. Для того чтобы получить другую частоту - нужно будет всё выключить, настроить, и запустить дма по новой. Кроме того сетка частот будет сильно ограниченной, ну прям очень сильно, примерно так 10-20-30-40-50-60-70-80-90-100Гц. Всё кратно самой низкой частоте. Переключать двигатель с 90Гц на 100Гц - равносильно холодному пуску с нуля сразу на 100Гц. Потому-что якорь имеет массу.
Как делать правильно - чуть выше, просто прочитай.
Сдвиг фазы и сдвиг номера элемента таблицы - это одно и тоже.
On 8/20/2022 at 9:59 PM, VladislavS said:сгенерировать в компайлтайме
Хороший способ.
-
On 8/20/2022 at 8:29 PM, dimka76 said:
Откуда появился двигатель ?
"Допустим установили частоту 100 гц и время от 0 до 100 установили 30секунд." - Типовой вопрос каждого начинающего, собирающего на коленке инвертор для трёхфазного двигателя.
Кстати сделать таблицу самым простым и быстрым способом - печатать в терминал программой из МК. В 3 минуты уложиться можно.
-
On 8/20/2022 at 5:18 PM, dimir said:
Допустим установили частоту 100 гц и время от 0 до 100 установили 30секунд.
Мучать двигатель накладно, особенно с таким уровнем знаний.
Во первых параметр частоты тут побочный продукт вычислений, потому как двигать нужно фазу. У тебя должна быть таблица готовых синусов на полный период 2П (просто график). По которому нужно шагать с разным шагом. Частота считывания таблицы, ну и выставления новых значений для шима - ПОСТОЯННАЯ!!! Это важно!!, нужен всего один таймер по которому считывается новое значение для шима, он-же бужет шимить хоть 2 фазы, хоть три.
Во вторых - использовать дробные числа. Таблица уже готовая, у неё есть размер (uint16_t shim[2048] ) - значит использовать плавающую точку не имеет смысла, проще использовать дробные числа. Например uint32_t shag (11+21), 11 старших бит - это прямой адрес таблицы. 21 младших битов - это числа меньше единицы, в данном случае дробные. Дык вот прибавляя в каждом прерывании к числу shag константу без знака - на выхлопе получится стабильная частота. А если константу перед сложением умножать на другую константу - то получится ускорение. Ну или делить, тогда будет торможение.
Третий важный пункт - считанное значение из таблицы нужно домножить до реальной ЭДС двигателя на текушей частоте вращения и напряжения на питающем конденсаторе. Зависимость от сети выбирается очень просто 310В считается за единицу (умножать на единицу). Пример 270В - умножаем на 1,14, 360В - делим на 1,16. Здесь тоже дешевле использовать дробные числа, потому как деление выполняется ну очень долго. Множитель от частоты вычисляется немного сложнее, проще всего составить таблицу, и брать значения из неё. Для этого уже после сборки инвектора - нужно подключить двигатель через балластные резисторы (допустим 50 Ом). Двигатель не сможет взять больше напряжения, чем ему позволит ЭДС обмоток, остаток в виде тепла на резисторах. Просто считать мультиметором и составить свою таблицу. Без коррекции напряжения - двигателю будет очень больно, особенно на малых оборотах.
Это и есть DDS в грубом представлении.
Достоинства: Доступен весь диапазон частот (в пределах разумного) например от 5Гц до 100Гц, с шагом в сотые доли герца. При изменении частоты не сбивается фаза, а это очень важно. Двигатель имеет массу, он не может за микросекунду провернуть якорь на 90 градусов, только потому что у тебя фаза сменилась. Он просто плюнет током, отчего все твои транзисторы превратятся в плазму.
Недостатки: Использовать дма не получится, вычисления нужно производить в прерывании. Контроль тока исключительно для экстренного отключения (физическая триггерная защита). Двигатель будет просказывать, то-есть момент на низких оборотах будет маленьким. Чтоб не проскальзывал - нужно векторное управление, а это чуть сложнее скалярного.
Ведёрко для дохлых ИГБТ транзисторов - непременный атрибут каждой разработки инвертора. В твоём случае оно может быть очень большим. И это, поменяй аватарку, тараканы на стенке не лучший задний фон.
Трассировщик для Cortex M ядер
в ARM, 32bit
Опубликовано · Пожаловаться
Не ожидал увидеть в таком виде, походу не то искал. Я-то думал там будет натурально последние 16 команд на асме, а там вообще всё. Прикольно, одобряем.