Перейти к содержанию
    

AVI-crak

Участник
  • Постов

    367
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные AVI-crak


  1. On 12/2/2022 at 2:02 PM, yes said:

    размотки нет, записаны команды начиная от текущей (i-той), потом (i-1), (i-2) ... (i-количество пакетов в памяти).

    Ну хорошо, а почему на ютюбе ноль роликов с демонстрацией сего действа. Насколько я понимаю - это не сложно, и даже не требуется реальная программная ошибка, достаточно нажать "стоп". 

  2. On 12/1/2022 at 4:55 PM, jcxz said:

    Непонимающим советую купить платку типа OM13054 и увидеть как это всё работает на практике.

    Даже арбузы перед покупкой проверяют десятками способов. А тут ноль роликов на ютюбе с размоткой потока команд в обратную строну.

    Я реально хочу это увидеть, и не верю что на это способна отладка без полноценной трассировки.

  3. Итак, я успел просмотреть десяток роликов про трассировку с участием реального МК. Рекламных и обучающих роликов ещё больше, но если там нет доски - то ролик пропускается.

    Дык вот, каждый ролик демонстрирует как могло-бы работать, но не работает, потому что у нас нет отладчика за тысячу баксов. А те возможности что демонстрируется - доступны для меня на древней версии embitz, и относительно свежем stlink3.

    Чего я хочу увидеть - отмотку буфера операций ядра назад от точки сбоя. 

  4. On 11/30/2022 at 8:02 PM, jcxz said:

    Советую всё же почитать

    Неее, чтобы меня заинтересовать - нужен мешок плюшек.

    Или видеопрезентация реального захвата экрана компа во время трассировки МК, с простым и практичным закадровым голосом. Можно нарезку сделать, главное чтобы смысл не улетучивался. Вот с этим ETB в главной роли. 

  5. То о чём говорится - требует jtag отладчика с реальными аппаратными линиями трассировки, через swd трассировка в реальном времени невозможна.

    GTAG + 16линий трассы + аппаратный полный usb3.1 + быстрая память на пару гиг ->>> имеет ценник выше 1к зелени. Предназначен для очень жирных фпга и мк. Программное обеспечение тоже имеет не гуманный ценник, и не продаётся в нашей стране. Кроме того, железяка в любой момент может превратиться в кирпич, если заокеанскому партнёру чего-то не понравится. Офлайн железка работать не умеет, и кстати не продаётся у нас.

    Свистоперделки с одной линией трассировки, не способны на трассировку в реальном времени даже на заниженной до 1МГц тактовой ядра мк. Оригинальный stlink3 - тоже не может, я проверял.

    Я не знаю других вариантов, но с удовольствием послушал-бы о них.

  6. 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:

    Мне кажется, Вы не владеете вопросом =(

    Тогда просветите плиз значение поля приоритета для дма. Чего это такое и зачем оно там вообще.

  7. On 11/3/2022 at 12:56 AM, Arlleex said:

    параллельно они не могут быть обслужены

    Могут, в случае занятости системной шины данных на то самое "таки огромное время". Хотя точнее будет не параллельно, а одновременно, в момент освобождения системной шины данных, а там как повезёт.

  8. On 11/2/2022 at 11:50 PM, OPTIMA said:

    Хоть один факт покажите?

    Линейные измерения точным инструментом, чем больше стадий перемаркиров - тем тоньше корпус. А вообще это была хохма, ну кроме цветной революции. ST сдвигает заказы на 2024 год всем подряд, ну и старые висят уже два года. Чем она кормится, мне лично не очень понятно.

  9. On 11/3/2022 at 12:22 AM, Arlleex said:

    Зачем разные?

    Пока в проекте используется всего два дма - проблем особых нету. Но если задействовать три и более - начинаются проблемы. Даже при использовании программной функции копирования могут быть проблемы, потому как ядро имеет приоритет выше дма. Приоритеты для дма работают весьма прикольно, они создают очередь для триггеров обмена, в данном случае от spi. На режим память-память - приоритеты ставить бесполезно. Если в проекте используется несколько периферийных узлов с одним регистром на чтение/запись - не обязательно строить лесенку из приоритетов, достаточно обеспечить разницу в пределах каждого узла. 

    Чего произойдет при преждевременной записи раньше чтения данных от spi - потеря данных, и взведённый флаг ошибки.

  10. On 11/2/2022 at 9:30 PM, Reystlin said:

    Организовал в итоге работу SPI через DMA

    Отрезал нули - получилось красиво и компактно. Но изначальный полный длинный вариант нужно где-то сохранить, и использовать для копирования.

    Первоначально примеры были только на передачу, а сейчас ещё и чтение. Нулевой и пятый поток обращаются на один адрес периферии, в этом случае нужно использовать уровни (разные!!!) приоритета для дма.

    _VAL2FLD(DMA_SxCR_PL, 1)|       /// priority level 0-3

    Управление ногой перенести в прерывание дма на чтение, оно срабатывает самым последним.

    Если хочется чтоб всё было красиво - реализуй все прерывания ошибок: от дма, от spi. В нормальном режиме они даже срабатывать не будут, но явно спасут от зависаний. Есно нужна функция разгребания всех возможных ошибок, отдельная функция!!!!. Отладка подобных функций достаточно прикольное занятие, я использовал для этих целей напильник. Принудительно вносил помехи в линии передачи данных. 

  11. Всё очень просто.

    Чип дип закупается в платане, платна закупается на али, продавец али закупается во Вьетнаме у подвального мастера Лии. Товарищ Лии покупает в китае чипы серии GD по 2 бакса, стачивает название, и заново маркирует как STM. Компания GD скупила огромное количество бракованных кристаллов st, перешивает под свои изделия, и заливает в пластик.

    А сама компания ST ничего не делает уже почти два года, у них там цветная революция на 48 полов.

  12. Извиняюсь, f407 нету, проверить не смог. Но IDE весело собирает код без ошибок. Исправил.

    Spoiler
    void 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);
    };

     

     

  13. 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);
    };

     

     

  14. Желательно использовать макрос _VAL2FLD(field, value) для заполнения полей регистра, он позволяет избежать ошибки переполнения. DMA кроме номера потока (в названии), имеет номер канала - по которому принимает управление на запись/чтение CHSEL[3:0]. Информация о каналах DMA находится Reference manual для вашего мк.

     Регистр DMAx_Streamx->CR имеет 19 обязательных полей для заполнения, буквально 19 строк. Каждый раз печатать одинаковые буквы весьма утомительно, одинаковые буквы для любого дма. Проще один раз напечатать запись в переменную всех обязательных полей, и при copy/paste - удалять ненужное в данный момент. Удалять проще чем печатать заново.

  15. On 10/20/2022 at 10:03 PM, jcxz said:

    При активном кодинге обычное количество нажатий клавиш в день у меня = 20-30 тысяч. Иногда бывает и больше (до 40тыс).

    Набивание текста по шаблону не является интеллектуальной работой!!! У меня при набивании таблиц получалось по 10к строк в день, и запястья потом болели. Больше выжать не смог, слишком много разной информации из разных источников, которые нужно свести в одну строку, и так пока глаза не опухнут. Однако я не считаю эту работу интеллектуальной, потому как её может выполнять даже обезьяна с купленным дипломом.

    На второй день решил автоматизировать это дело, получилось примерно две сотни строк моего кода, и в сотни раз больше - чужого, ошибки вылавливал с неделю. Вот это настоящий кодинг, когда приходится думать над алгоритмом, и множество раз его переписывать. Скачать скетч как в аурдино, или например заполнять готовые структуры графических элементов - это всё не то. Алгоритма не существовало до этого момента, и это самое основное. 

    Вся "обезьянья работа" была выполнена моим алгоритмом за час с небольшим. Без ошибок и в идеальном виде. На работу выделяли три месяца, остаток я потратил на свои проекты. Без угрызений совести и ночных кошмаров. Но в эти 200 строк мне пришлось пялится целую неделю!!! То-есть по вашему критерию, моя скорость кодинга ниже плинтуса.

    stm32cubeide - вообще не использую, не срослось.

     

  16. On 9/25/2022 at 3:37 PM, student23 said:

    Как вы поняли, управляю двигателем через ШИМ.

    А подумать?

    Коллекторный двигатель выдаёт эдс когда вращается, а ток потребляет по формуле ("напряжение питания" минус "эдс мотора") делённое на омическое сопротивление обмоток. Ток измерять можно, но только в момент замкнутого ключа шима - синхронно. Хотя гораздо точнее обороты считываются с эдс, измерением напряжения в момент открытого ключа шима. Там прям линейная зависимость, и многократно дешевле получается.

  17. On 8/23/2022 at 1:24 AM, x893 said:

    Аккумулятор фазы - очень сложно для меня.
    У нас в ПТУ этому не учили

    2001 год, студент сдаёт диплом на модный тогда Z80. Престарелый электорат сонно кивает носом, решительно нихрена не понимая в теме. И тут один из них слышит знакомое слово аккумулятор..

    - Скажите голубчик, аккумулятор у вас кислотный или щелочной?

    dimir - Нужен всего один таймер, настроенный на частоту шима, и несколько глобальных переменных. Таблица шима тоже только одна нужна.

  18. Да, у меня мотор на 20КГц шима перегревается, когда хавает 3,5А на холостых оборотах через инвертор. И почти холодный, когда работает от сети на прямую (1,4А). Инвертор не мой, а чистокровный супердешовый китаец - точно так-же как и у всех сейчас.

  19. On 8/22/2022 at 2:33 PM, jcxz said:

    Чтобы убрать свист надо повышать частоту ШИМа.

    Выше 5КГц - железо мотора начинает дико греться. Не обмотки, не якорь, и даже не провода, а именно пакет железных пластин - на котором катушки намотаны. Для того чтобы обойти потери - ставят внешние индукторы. Частотник в подобном исполнении выдаёт на выхлоп уже не шим, а готовый к употреблению синус, чистый как слеза электрика.

    Есно низкочастотные дешёвые игбт с али - для этой цели уже не годятся. Применяются классические мосфеты целыми пачками, на частотах в 200Кгц и выше. Дроссели кстати тоже пачками на одну фазу, потому как качественного дешёвого кольца на 5 киловатт  - просто не существует. Ну и цена взлетает в космос.

    Использовать скалярное управление при подобных тратах на железо - просто кощунство. Это как атомной станцией управлять через Z80.

  20. On 8/21/2022 at 12:58 PM, Сергей Борщ said:

    Чтобы не вызывать прерывание таймера на каждый отсчет, а готовить сразу кучу отсчетов в прерывании ПДП. 

    Там основная частота шима 5КГц, dimir  своим кодингом отчётов на секунды нашлёпает, представляешь какая реакция на кнопки будет?

    К тому-же у него три таблицы шима, под три фазы - то-есть человек практически не обучаем.

  21. On 8/21/2022 at 1:33 AM, Сергей Борщ said:

    Можно быстро-быстро методом DDS набить половину массива

    Зачем страдать и мучаться, если можно в прерывании выполнить четыре целочисленных умножения не напрягаясь. Для моторов шим выше 5КГц не поднимается - железо не тянет (греется). К тому-же стыковать массивы с разным окончанием фазы - та ещё задачка. Скалярный метод тянет даже мега на своих 16МГц без напряга, прямо в прерываниях.

    К тому-же этот метод в одном шаге от векторного управления.

  22. 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:

    сгенерировать в компайлтайме

    Хороший способ:drinks:.

  23. On 8/20/2022 at 8:29 PM, dimka76 said:

    Откуда появился двигатель ?

    "Допустим установили частоту 100 гц и время от 0 до 100 установили 30секунд." - Типовой вопрос каждого начинающего, собирающего на коленке инвертор для трёхфазного двигателя.

     

    Кстати сделать таблицу самым простым и быстрым способом - печатать в терминал программой из МК. В 3 минуты уложиться можно.

  24. 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 градусов, только потому что у тебя фаза сменилась. Он просто плюнет током, отчего все твои транзисторы превратятся в плазму.

    Недостатки: Использовать дма не получится, вычисления нужно производить в прерывании. Контроль тока исключительно для экстренного отключения (физическая триггерная защита). Двигатель будет просказывать, то-есть момент на низких оборотах будет маленьким. Чтоб не проскальзывал - нужно векторное управление, а это чуть сложнее скалярного.

    Ведёрко для дохлых ИГБТ транзисторов - непременный атрибут каждой разработки инвертора. В твоём случае оно может быть очень большим. И это, поменяй аватарку, тараканы на стенке не лучший задний фон.

×
×
  • Создать...