-
Постов
10 908 -
Зарегистрирован
-
Посещение
-
Победитель дней
31
Сообщения, опубликованные Сергей Борщ
-
-
13 минут назад, TOG сказал:
Пытаюсь подключить это все к компу через кабель USB2.0 - Type-C
Может кабель слишком умный и ожидает резисторы 5.1 кОм на землю на контактах A5 и B5, а в вашем разъеме их забыли допаять?
-
1 час назад, bvn123 сказал:
или продолжает работать от внутреннего генератора, если фьюзы, как Вы писали, воспринялись некорректно.
Он закорачивал кварц пинцетом, контроллер при этом перестает прошиваться. Значит работает от кварца.
-
59 минут назад, Aleksey_M сказал:
Смотрю как есть, в отладке, раздел memory
Не знаю, как в Кейле, но в эклипсе можно на одно и то же смотреть по-разному:
59 минут назад, Aleksey_M сказал:пресекались с вами еще на телесистемах, ну и в пустыне )
А до того на ru.embedded... Девчонки тогда были сильно моложе, а компьютеры - больше
-
Только что, dimka76 сказал:
Все "автоматически" замаскируется.
Логично.
1 минуту назад, dimir сказал:Дайте ссылку
-
2 минуты назад, x893 сказал:
256 на 3 не делится, а 360 делится
зато 2^32 делится с достаточной точностью. Можно складывать с аккумулятором фазы и результат сдвигать для получения индекса.
-
4 минуты назад, x893 сказал:
чем не подходит ?
Но можно же обойтись без этого. Код будет короче, быстрее, элегантнее.
2 минуты назад, dimir сказал:А вот вы покажите как вы будете управлять частотой.?
Может пора уже хоть немного почитать про прямой цифровой синтез? Вам уже и ссылку на статью Леонида Ивановича привели, где все разжевано проще некуда.
15 минут назад, Сергей Борщ сказал:uint32_t Phase_step; // Этой переменной определяем часоту.
-
1 минуту назад, dimka76 сказал:
На индекс накладывать маску, вот так
Да, но это лишние вычислительные ресурсы, которые можно сэкономить.
-
1 час назад, Aleksey_M сказал:
F105
Может вы смотрите память в виде 4-байтных чисел? Смотрите побайтно, будет правильный порядок.
-
1
-
-
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 навалом.
-
11 минут назад, dimka76 сказал:
Допустим на 180 отсчетов
таблицу надо делать на два периода, чтобы не думать о выходе за ее пределы при добавлении смещения для остальных фаз.
13 минут назад, dimka76 сказал:Для инверсных каналов в STM32 у таймеров есть комплементарные выходы
а если таких выходов не хватает и драйвер с встроенным мертвым временем - можно же вроде бы брать значения из той же таблицы со сдвигом 90 градусов?
-
7 минут назад, Aleksey_M сказал:
Big endian.
Увы, только тасовать поля вручную. Или какой-то C++ шаблон-обертку, которая будет реверсировать порядок байтов при чтении/записи в память.
-
5 часов назад, dimir сказал:
Настраивать эти флаги в майне?
Для начала прочитать их описание в документации на контроллер.
5 часов назад, dimir сказал:Я хочу вас огорчить.Или озадачить вернее сказать.DMA если шим подавать модуляции будет.
Перечитал несколько раз. Так ничего и не понял.
5 часов назад, dimir сказал:И тогда взможно 3 фазы для эл.двигателя
Как же у студента из одного массива ШИМом формировались три синусоиды и от них трехфазный синхронный двигатель крутился и скорость регулировалась? Как у меня ATмега88 (без ПДП - его там нет) с кварцем 16 МГц формирует 31 кГц ШИМом 6 синусоид 400 Гц из одного массива с огибающей синуса для управления 3 двухфазными двигателями ДиД, оцифровывает 2 сельсина, считает ПИДы следящих систем и успевает еще общаться с управляющим компьютером? Как такая же ATmega88 формирует тем же ШИМом из того же массива огибающей два трехфазных напряжения частотой 400 Гц с плавным нарастанием частоты и амплитуды от 0 до заданных значений и потом с плавным снижением частоты и амплитуды до нуля?
5 часов назад, dimir сказал:Вы преподаватель?
Нет. Но приходится обучать принятых на работу студентов.
-
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 - когда переданы все данные. Когда передана половина данных - на их место можно писать новые для следующего цикла. Когда переданы все - можно писать на место второй половины, пока ПДП передает первую (если его запустить в циклическом режиме - он после передачи второй половины автоматически снова начнет передавать первую).
Утром попробую найти код, которым студенту объяснял прямой цифровой синтез для запуска трехфазного синхронного двигателя.
Добавлено: нашел переписку со студентом, кода там нет. Будет время - накидаю заново, но не обещаю, что прямо завтра.
-
14 минут назад, dimir сказал:
Метод DDS ?И в прерывании по DMA.
Да, прямой цифровой синтез в прерывании ПДП.
15 минут назад, dimir сказал:Некоторая периферия перестаёт просто работать.
Какая именно периферия? Показывайте код, разберемся вместе. У меня все работает, так что дело тут явно не в периферии.
-
Только что, dimir сказал:
Мне кажется что DMA в этом плане не очень подходит
В каком плане?
2 минуты назад, dimir сказал:Каким образом это произвести?
12 часов назад, Сергей Борщ сказал:Можно быстро-быстро методом DDS набить половину массива, натравить на массив ПДП в циклическом режиме и пока ПДП скармливает эту половину таймеру - быстро-быстро набить вторую половину массива. Потом повторять набивание первой/второй половин в прерываниях HTIF/TCIF.
-
9 часов назад, AVI-crak сказал:
Зачем страдать и мучаться, если можно в прерывании выполнить четыре целочисленных умножения не напрягаясь.
Чтобы не вызывать прерывание таймера на каждый отсчет, а готовить сразу кучу отсчетов в прерывании ПДП.
9 часов назад, AVI-crak сказал:К тому-же стыковать массивы с разным окончанием фазы - та ещё задачка
При использовании прямого цифрового синтеза (DDS) этого не требуется.
10 часов назад, x893 сказал:Можно быстро-быстро посмотреть пример
Можно, но лучше сначала думать своей головой.
-
34 минуты назад, dimir сказал:
А если не использовать DMA
Можно быстро-быстро методом DDS набить половину массива, натравить на массив ПДП в циклическом режиме и пока ПДП скармливает эту половину таймеру - быстро-быстро набить вторую половину массива. Потом повторять набивание первой/второй половин в прерываниях HTIF/TCIF. Я так FFSK/GMSK передавал в эфир на очень неспешном F100 и оставалась куча времени на другие задачи.
-
2 часа назад, tonyk_av сказал:
Во-первых, осознай _зачем_ так делается.
Поделитесь тайной: _зачем_ в случайные моменты времени при выполнении очередного шага в отладке сворачивать все открытые в этом окне структуры? Зачем их сворачивать при перезапуске отладки? Кто-то лучше меня знает, куда мне смотреть, а куда не стОит?
-
1
-
-
Тогда что-то в программе. Протеус позволяет выполнять программу по ассемблерным командам? Скорее всего - да, вот и пройдите начиная от вектора сброса.
-
11 минут назад, astral_ сказал:
Я замкнул контакты кварца и при попытке прошить была ошибка.
Воооот. Значит таки ваш контроллер работает от кварца, но пока непонятно, чем занимается. Тогда читайте, что я написал про WDTON.
-
1 час назад, astral_ сказал:
программатор ISP
А программа какая им управляет?
1 час назад, astral_ сказал:если выставить фьюзы для внешнего кварца, а кварц не подключить к МК, то при попытке его прошить будет ошибка, у меня же программа нормально записывается
Я все-таки недопонял - вы прошили CKSEL для кварца и после этого, с физически отключенным кварцем он у вас все равно прошивается? Значит CRSEL не прошились или прошились неправильно - у вас идет тактирование от внутреннего RC. Или вы не пробовали с отключенным кварцем? Так попробуйте - отпаяйте его или просто замкните его ноги пинцетом. Чудес же не бывает. Прочитайте CKSEL - в них действительно то, что вы хотели записать?
1 час назад, astral_ сказал:МК ничего не выдает
Значит программа где-то зацикливается. Может не успевает что-то сделать и его сбрасывает сторожевая собака (watchdog timer). Может вы вместе с CKSEL прописали WDTON и не сбрасываете собаку - тогда через 16 мс она сработает и все начнется с начала. Телепатировать можно до бесконечности.
1 час назад, astral_ сказал:также не работает и в протеусе
С протеусом не работал, но этого не понимаю - как программа может не работать? Контроллер не работает только в трех случаях - когда нет питания, когда снаружи прижата нога сброса и когда на него не подается тактирование. В симуляторе ни одно из этих условий не выполняется, он в любом случае должен исполнять какие-то ассемблерные команды.
-
23 минуты назад, NefoRalt сказал:
И я не понимаю, то ли таймер косо запускается, то ли запуск АЦП криво закодил
Махайте ногами через модули сравнения (compare) обоих таймеров и смотрите осциллографом/лог. анализатором.
-
10 часов назад, astral_ сказал:
программатор прошивает, но схема также не работает, в чем может быть причина?
Например, вы забыли повесить на кварц конденсаторы. Или ваш программатор воспринимает галочку как ноль, а ее отсутствие - как 1 (PonyProg этим страдал, чуть ли каждую неделю лет пятнадцать назад тут кто-нибудь плакался) и вы вместо 1110 записали 0001, что соответствует внутреннему RC-генератору на 1 МГц. К тому же CKSEL=0 рекомендован для керамического резонатора, для кварца производитель рекомендует CKSEL = 1. А вообще "схема не работает" слишком неконкретно. Рассказывайте подробнее - что вы хотите получить, что наблюдаете, что за программу вы заливаете, какой программатор используете и т.п.
Программатор прошивает только один раз? Если бы вы правильно запрограммировали CKSEL на кварц и кварц не работал бы - после сброса последовательный программатор больше не смог бы подключиться к процессору. Или вы используете высоковольтный параллельный программатор? Пока будем по-умолчанию предполагать последовательный программатор, значит либо вы неправильно прошиваете CKSEL и контроллер у вас продолжает работать от внутреннего RC, либо кварц работает и дело в вашей программе.
-
Использовал GD32F100, защиту выставляю своим загрузчиком по команде в зашифрованном образе прошивки (программа одна и та же, что для STM, что для GD32, единственное - пришлось вставить __DSB() между записью ключей в OPTKEYR и проверкой OPTWRE). После выставления защиты у меня отправка подтверждения и бесконечный цикл со сбросом по сторожевой собаке. Наблюдал проблему, что при подключенном отладчике (SWD, ST-link + OpenOCD) после выставления защиты и сброса по собаке программа не выполняется, куда его уносит непонятно (защита-то включена). И вывести его из этого состояния можно было только передергиванием питания - после передергивания питания программа работала штатно, отладчиком можно подключиться и снять защиту. Если отладчик не подключать - тоже все работает штатно (устанавливается защита, собака сбрасывает, программа начинает работать с начала). Потратил часа два, пока догадался отключить отладчик, глубже копать не стал - изделие старое, доработок не планируется.
Датчик удара, схема
в Метрология, датчики, измерительная техника
Опубликовано · Пожаловаться
Акселерометров разных у китайцев на али навалом. Встречал где-то в интернете описание, как человек на платке с ADXL335 с али и простой аналоговой схеме делал приспособу для балансировки то ли двигателей, то ли валов.