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

Сергей Борщ

Модератор
  • Постов

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

  • Посещение

  • Победитель дней

    31

Сообщения, опубликованные Сергей Борщ


  1. Акселерометров разных у китайцев на али навалом. Встречал где-то в интернете описание, как человек на платке с ADXL335 с али и простой аналоговой схеме делал приспособу для балансировки то ли двигателей, то ли валов.

  2. 13 минут назад, TOG сказал:

    Пытаюсь подключить это все к компу через кабель USB2.0 - Type-C

    Может кабель слишком умный и ожидает резисторы 5.1 кОм на землю на контактах A5 и B5, а в вашем разъеме их забыли допаять?

  3. 1 час назад, bvn123 сказал:

    или продолжает работать от внутреннего генератора, если фьюзы, как Вы писали, воспринялись некорректно.

    Он закорачивал кварц пинцетом, контроллер при этом перестает прошиваться. Значит работает от кварца.

  4. 59 минут назад, Aleksey_M сказал:

    Смотрю как есть, в отладке, раздел memory

    Не знаю, как в Кейле, но в эклипсе можно на одно и то же смотреть по-разному:

    image.thumb.png.24e322f067a522e124560fd9a24d6363.png

    59 минут назад, Aleksey_M сказал:

    пресекались с вами еще на телесистемах, ну и в пустыне ) 

    А до того на ru.embedded... Девчонки тогда были сильно моложе, а компьютеры - больше  :drinks:

  5. 4 минуты назад, x893 сказал:

    чем не подходит ?

    Но можно же обойтись без этого. Код будет короче, быстрее, элегантнее.

    2 минуты назад, dimir сказал:

    А вот вы покажите как вы будете управлять частотой.?

    Может пора уже хоть немного почитать про прямой цифровой синтез? Вам уже и ссылку на статью Леонида Ивановича привели, где все разжевано проще некуда.

    15 минут назад, Сергей Борщ сказал:
    uint32_t Phase_step;            // Этой переменной определяем часоту.
    
  6. 15 минут назад, dimka76 сказал:

    Для каких остальных ?

    Если мы все еще о прямом цифровом синтезе, то мы имеем одну переменную аккумулятора фазы, из которой получаем индекс для фазы А. Индекс фазы B мы получаем путем прибавления к полученному индексу фазы A значения index_B, для фазы C- прибавлением index_C. При этом уже через 120 градусов индекс для фазы C выйдет за границы массива, а еще через 120 - и индекс для фазы B. Поэтому я дописываю следом еще один период и не беспокоюсь о выходе за границу массива. Весь цифровой синтез сводится к четырем сложениям и одному сдвигу:

    size_t const PERIOD = 256;      // должен быть степенью двойки
    uint8_t Envelope[PERIOD * 2];   // огибающая двух периодов синуса, но можно и более хитрую форму
    uint32_t Phase_acc;             // аккумулятор фазы
    
    uint32_t Phase_step;            // Этой переменной определяем часоту.
    
    
    void update()
    {
        Phase_acc += Phase_step;
        
        size_t Index = Phase_acc >> 24;
        Phase_A_out = Envelope[Index + 0 * PERIOD / 3] * Amplitude;
        Phase_B_out = Envelope[Index + 1 * PERIOD / 3] * Amplitude;
        Phase_C_out = Envelope[Index + 2 * PERIOD / 3] * Amplitude;
    }
    22 минуты назад, _pv сказал:

    на четверть периода,

    Можно и на 1/8 периода, но какой в этом смысл? Скорости много не бывает, а памяти у STM32 навалом.

  7. 11 минут назад, dimka76 сказал:

    Допустим на 180 отсчетов

    таблицу надо делать на два периода, чтобы не думать о выходе за ее пределы при добавлении смещения для остальных фаз.

    13 минут назад, dimka76 сказал:

    Для инверсных каналов в STM32 у таймеров есть комплементарные выходы

    а если таких выходов не хватает и драйвер с встроенным мертвым временем - можно же вроде бы брать значения из той же таблицы со сдвигом 90 градусов?

  8. 5 часов назад, dimir сказал:

    Настраивать эти флаги в майне?

    Для начала прочитать их описание в документации на контроллер.

    5 часов назад, dimir сказал:

    Я хочу вас огорчить.Или озадачить вернее сказать.DMA если шим подавать модуляции  будет.

    Перечитал несколько раз. Так ничего и не понял.

    5 часов назад, dimir сказал:

    И тогда взможно 3 фазы для эл.двигателя

    Как же у студента из одного массива ШИМом формировались три синусоиды и от них трехфазный синхронный двигатель крутился и скорость регулировалась? Как у меня ATмега88 (без ПДП - его там нет) с кварцем 16 МГц формирует 31 кГц ШИМом 6 синусоид 400 Гц из одного массива с огибающей синуса для управления 3 двухфазными двигателями ДиД, оцифровывает 2 сельсина, считает ПИДы следящих систем и успевает еще общаться с управляющим компьютером? Как такая же ATmega88 формирует тем же ШИМом из того же массива огибающей два трехфазных напряжения частотой 400 Гц с плавным нарастанием частоты и амплитуды от 0 до заданных значений и потом с плавным снижением частоты и амплитуды до нуля?

    5 часов назад, dimir сказал:

    Вы преподаватель?

    Нет. Но приходится обучать принятых на работу студентов.

  9. 5 часов назад, dimir сказал:
    void DMA1_Channel1_IRQHandler (void)
    {
     if(DMA1->ISR & DMA_ISR_TCIF1)
     {
    	 DMA1->IFCR|= DMA_IFCR_CTCIF1;
    
     }
     if(DMA1->ISR& DMA_ISR_TEIF1)
      {
    	 DMA1->IFCR|= DMA_IFCR_CTEIF1;
    
      }
    }

    Вот сразу тут: 

    1) Зачем дважды читать ISR? достаточно прочитать его один раз во временную переменную и потом проверять биты флагов в этой переменной.

    2) делать "или" с содержимым IFCR не имеет смысла - оттуда всегда читаются нули. Поэтому нужно в него только писать (DMA1->IFCR = DMA_IFCR_CTCIF1;) На логику работы не повлияет, но какие-то такты сэкономите.

    Настройки ПДП в коде не нашел - может вы там разрешили еще какое-то прерывание, флаг которого не обрабатываете и поэтому программа после выхода из обработчика попадает в него снова.

    11 часов назад, dimir сказал:

    .У меня другой вопрос как это половина массива отправить а вторую потом?

    У ПДП есть два флага - HTIF выставляется, когда передана половина от запрошенного количества данных и TCIF - когда переданы все данные. Когда передана половина данных - на их место можно писать новые для следующего цикла. Когда переданы все - можно писать на место второй половины, пока ПДП передает первую (если его запустить в циклическом режиме - он после передачи второй половины автоматически снова начнет передавать первую).

    Утром попробую найти код, которым студенту объяснял прямой цифровой синтез для запуска трехфазного синхронного двигателя.

    Добавлено: нашел переписку со студентом, кода там нет. Будет время - накидаю заново, но не обещаю, что прямо завтра.

  10. 14 минут назад, dimir сказал:

    Метод DDS ?И в прерывании по DMA.

    Да, прямой цифровой синтез в прерывании ПДП.

    15 минут назад, dimir сказал:

    Некоторая периферия перестаёт просто работать.

    Какая именно периферия? Показывайте код, разберемся вместе. У меня все работает, так что дело тут явно не в периферии.

  11. Только что, dimir сказал:

    Мне кажется что DMA в  этом плане не очень подходит

    В каком плане?

    2 минуты назад, dimir сказал:

    Каким образом это произвести?

    12 часов назад, Сергей Борщ сказал:

    Можно быстро-быстро методом DDS набить половину массива, натравить на массив ПДП в циклическом режиме и пока ПДП скармливает эту половину таймеру - быстро-быстро набить вторую половину массива. Потом повторять набивание первой/второй половин в прерываниях HTIF/TCIF.

     

  12. 9 часов назад, AVI-crak сказал:

    Зачем страдать и мучаться, если можно в прерывании выполнить четыре целочисленных умножения не напрягаясь.

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

    9 часов назад, AVI-crak сказал:

    К тому-же стыковать массивы с разным окончанием фазы - та ещё задачка

    При использовании прямого цифрового синтеза (DDS) этого не требуется.

    10 часов назад, x893 сказал:

    Можно быстро-быстро посмотреть пример

    Можно, но лучше сначала думать своей головой.

  13. 34 минуты назад, dimir сказал:

    А если не использовать DMA

    Можно быстро-быстро методом DDS набить половину массива, натравить на массив ПДП в циклическом режиме и пока ПДП скармливает эту половину таймеру - быстро-быстро набить вторую половину массива. Потом повторять набивание первой/второй половин в прерываниях HTIF/TCIF. Я так FFSK/GMSK передавал в эфир на очень неспешном F100 и оставалась куча времени на другие задачи.

  14. 2 часа назад, tonyk_av сказал:

    Во-первых, осознай _зачем_ так делается.

    Поделитесь тайной: _зачем_ в случайные моменты времени при выполнении очередного шага в отладке сворачивать все открытые в этом окне структуры? Зачем их сворачивать при перезапуске отладки?  Кто-то лучше меня знает, куда мне смотреть, а куда не стОит?

    • Like 1
  15. 11 минут назад, astral_ сказал:

    Я замкнул контакты кварца и при попытке прошить была ошибка. 

    Воооот. Значит таки ваш контроллер работает от кварца, но пока непонятно, чем занимается. Тогда читайте, что я написал про WDTON.

  16. 1 час назад, astral_ сказал:

    программатор ISP

    А программа какая им управляет?

    1 час назад, astral_ сказал:

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

    Я все-таки недопонял - вы прошили CKSEL для кварца и после этого, с физически отключенным кварцем он у вас все равно прошивается? Значит CRSEL не прошились или прошились неправильно - у вас идет тактирование от внутреннего RC. Или вы не пробовали с отключенным кварцем? Так попробуйте - отпаяйте его или просто замкните его ноги пинцетом. Чудес же не бывает. Прочитайте CKSEL - в них действительно то, что вы хотели записать?

    1 час назад, astral_ сказал:

    МК ничего не выдает

    Значит программа где-то зацикливается. Может не успевает что-то сделать и его сбрасывает сторожевая собака (watchdog timer). Может вы вместе с CKSEL прописали WDTON и не сбрасываете собаку  - тогда через 16 мс она сработает и все начнется с начала. Телепатировать можно до бесконечности.

    1 час назад, astral_ сказал:

    также не работает и в протеусе

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

  17. 23 минуты назад, NefoRalt сказал:

    И я не понимаю, то ли таймер косо запускается, то ли запуск АЦП криво закодил

    Махайте ногами через модули сравнения (compare) обоих таймеров и смотрите осциллографом/лог. анализатором.

  18. 10 часов назад, astral_ сказал:

    программатор прошивает, но схема также не работает, в чем может быть причина?

    Например, вы забыли повесить на кварц конденсаторы. Или ваш программатор воспринимает галочку как ноль, а ее отсутствие - как 1 (PonyProg этим страдал, чуть ли каждую неделю лет пятнадцать назад тут кто-нибудь плакался) и вы вместо 1110 записали 0001, что соответствует внутреннему RC-генератору на 1 МГц. К тому же CKSEL=0 рекомендован для керамического резонатора, для кварца производитель рекомендует CKSEL = 1. А вообще "схема не работает" слишком неконкретно. Рассказывайте подробнее - что вы хотите получить, что наблюдаете, что за программу вы заливаете, какой программатор используете и т.п.

    Программатор прошивает только один раз? Если бы вы правильно запрограммировали CKSEL на кварц и кварц не работал бы - после сброса последовательный программатор больше не смог бы подключиться к процессору. Или вы используете высоковольтный параллельный программатор? Пока будем по-умолчанию предполагать последовательный программатор, значит либо вы неправильно прошиваете CKSEL и контроллер у вас продолжает работать от внутреннего RC, либо кварц работает и дело в вашей программе.

  19. Использовал GD32F100, защиту выставляю своим загрузчиком по команде в зашифрованном образе прошивки (программа одна и та же, что для STM, что для GD32, единственное - пришлось вставить __DSB() между записью ключей в OPTKEYR и проверкой OPTWRE). После выставления защиты у меня отправка подтверждения и бесконечный цикл со сбросом по сторожевой собаке. Наблюдал проблему, что при подключенном отладчике (SWD, ST-link + OpenOCD) после выставления защиты и сброса по собаке программа не выполняется, куда его уносит непонятно (защита-то включена). И вывести его из этого состояния можно было только передергиванием питания - после передергивания питания программа работала штатно, отладчиком можно подключиться и снять защиту. Если отладчик не подключать - тоже все работает штатно (устанавливается защита, собака сбрасывает, программа начинает работать с начала). Потратил часа два, пока догадался отключить отладчик, глубже копать не стал - изделие старое, доработок не планируется.

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