Включить буферизацию регистров и сразу после запуска от внешнего события запихивать модулем ПДП в регистры настройки для второго импульса. Как толькотаймер отработает первый импульс, то значения обновятся и полетит второй импульс.
Что с этой схемой не так? По-моему полностью независимое от ядра поведение. Ну, кроме однократной настройки, конечно. Слишком много разбираться и читать придётся? Ну тут уж извините, судьба такая, жизнь - боль, чему быть, того не миновать, б-г терпел и нам велел и прочие мотивирующие цитаты великих людей.
DmitryR, нафиг эти навороченные дорогущие МК, если есть одноплатники дешевые? И там - нормальный линукс, а не убогий lwip поверх убогой же ртоси. Кстати, lwip можно и без ртоси запускать, если что. Но все равно я считаю, что ethernet на МК - это маразм. Я вот сделал себе нашлепку на orange pi zero2, чтобы туда SPI/I2C/UART и еще кое-чего подключать (все с защитой от ESD, а то "из коробки" там даже USB не защищены!). Заодно там и DC-DC сделал, понижающий с 12В до 5В, чтобы питать эту штуку (а то 5В тащить на улицу - наверняка просядет на длинных проводах, а с 12В все ОК: пусть хоть до 7В просаживается, DC-DC этого хватит). Еще хочу другую нашлепку сделать: с микроконтроллером, чтобы можно было дополнить функционал одноплатника тем, чего он делать уж точно не умеет (АЦП/ЦАП, таймеры, CAN и т.д., и т.п.).
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Одна только проблема с этим: как только отрабатывают все 3 тайминга (50, 50 и 500 мксек), выставляем низкий уровень и при следующем EXTI у нас первые 50 мк сек опять должны быть HIGH, но они будут LOW, и из-за этого все уровни поменяются местами и так будет происходить циклично
Ничего подобного. Вы плохо понимаете работу режима PWM. В этом режиме если значение счётчика меньше содержимого регистра сравнения CR - на выходе одно значение (0 или 1), если больше CR - другое. Так что - как только новый период PWM запустится, на выходе будет тот же уровень, который был в начале прошлого периода. А для состояния остановленного таймера есть регистр, задающий пассивное состояние выхода: запишете туда 0 и будет на выходе 0, пока ожидается следующий сигнал запуска (такой регистр есть в XMC, насчёт STM32 - не уверен).
Последний раз редактировалось jcxz Ср окт 12, 2022 18:01:26, всего редактировалось 1 раз.
разве связка TIM DMA в режиме burst не решает эту задачу? вроде должно получится, и никаких прерываний. Собственно, я думал, что Eddy_Em это в начале и предлагал. а по SPI - я по неопытности опасаюсь там джиттер начала пачки будет. хотя если от TIM и тактировать ... и да мертвый хвост ((16-12)х50) остается. а еще надо, чтоб SPI умел константу автоотправлять.
Последний раз редактировалось a797945 Ср окт 12, 2022 18:27:49, всего редактировалось 4 раз(а).
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Ну и еще раз напомню о DMA. А также, видимо, мимо пролетело: было же предложение SPI или I2C использовать, чтобы данную последовательность импульсов воспроизвести.
DMA здесь - как мёртвому припарка, потому как за 100мкс можно успеть записать все необходимые теневые регистры даже если МК работает на 1МГц тактовой. Касательно SPI: разве SPI STM32 умеет работать с 12-битными словами? И как запускать процесс предлагаете? Каковы будут задержки от момента запуска до первого фронта и от момента последнего спада до возможности нового запуска? SPI - имхо, бесперспективная затея, по крайней мере на STM32. А I2C - вам следует сперва изучить что это такое, прежде чем нести чушь.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
А I2C - вам следует сперва изучить что это такое, прежде чем нести чушь.
Да, там же требуется от слейва ACK. Еще и старт-стоп... Не взлетит.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Касательно SPI: разве SPI STM32 умеет работать с 12-битными словами? И как запускать процесс предлагаете? Каковы будут задержки от момента запуска до первого фронта и от момента последнего спада до возможности нового запуска?
SPI 12 бит умеет. Задержки конечно будут. На сколько допустимы ошибки по времени DmitryR не озвучил. Самое быстрое, полностью аппаратное решение - два таймера и объединённые выходные пины "открытый сток" + резистор + буфер по вкусу. Если нет требований по малому времени нарастания, то можно обойтись и без буфера. Резистор можно заменить пулл-апами.
Почти сделал на двух таймерах (правда, на F1, но какая разница), но столкнулся с проблемой: в режиме PWM2 до достижения CCR уровень низкий, а надо наоборот. Если же перевести в режим PWM1, то в неактивном состоянии уровень высокий, что тоже не подходит. Как сделать так, чтобы в состоянии "покоя" выход был низкий, при старте таймера как бы работал в режиме PWM2 (то есть высокий уровень ДО достижения CCR), а после сброса CEN снова выход переходил в низкий уровень?
Последний раз редактировалось azhel12 Чт окт 13, 2022 10:34:00, всего редактировалось 1 раз.
Для таймеров TIM2 — TIM5 существует возможность подавать на вход фильтра первого входного канала комбинированный по XOR сигнал от входов TIMx_CH1, TIMx_CH2, TIMx_CH3. Эта фишка используется при подключении интерфейсов датчиков Холла (подробности в RM0008, глава 14.3.18, стр.327).
Для выбора этой опции нужно установить в 1 бит TI1S.
Насколько я понял на данный момент, можно на 2 канала таймера завести 2 сигнала и получить 3й сигнал, соответствующий логической таблице для элемента XOR
Если это так, то по сути это:
Цитата:
Самое быстрое, полностью аппаратное решение - два таймера и объединённые выходные пины "открытый сток" + резистор + буфер по вкусу.
Я бы вообще поставил OPM на 600 мкс. На 50 мкс CM1 поменяет состояние ноги. Где-нибудь на 60 мкс войти в прерывание по CM2, отключить выход от таймера, перепрограммировать CM1 на 100 мкс и подключить выход обратно. Мне думается, на одном таймере всё получится.
Я бы вообще поставил OPM на 600 мкс. На 50 мкс CM1 поменяет состояние ноги. Где-нибудь на 60 мкс войти в прерывание по CM2, отключить выход от таймера, перепрограммировать CM1 на 100 мкс и подключить выход обратно. Мне думается, на одном таймере всё получится.
На двух получилось вообще без обработчика (с выключенным таймером только разобраться надо), но это, конечно, чисто академический интерес, наверно, оно того и не стоит.
DmitryR, входящие импульсы идут постоянно или возможны большие паузы? и минимальная пауза между ними сколько?
Добавлено after 9 hours 15 minutes 55 seconds: заглянул в RM0385. здесь богаче чем в RM0008 два таймера, старт синхронно, выходы как бы "монтажным ИЛИ", 1 таймер в режиме по "22.3.20 Retriggerable one pulse mode (OPM)" - первые 50мкс, 2 таймер в режиме по "22.3.19 One-pulse mode" - задержка 100 импульс 500 мкс. можно второй таймер от первого с соответствующе корректировкой задержки. вроде должно взлететь если есть возможность прикрутить "22.3.17 Clearing the OCxREF signal on an external event" можно вырезать "дырку" таймером 2 в импульсе таймера 1 (1 таймер 600мкс, 2 таймер з.50 и.50 мкс) - не понадобится "монтажное ИЛИ".
можно еще попробовать SPI тактируя от TIM , TIM чтоб все в нужное время было, SPI содержание этого "все"
На время откладывал решение этого вопроса. Но чтобы решение этого тут присутствовало, напишу. Сейчас перечитывать не стану, возможно это решение или схожее было кем-то предложено в ходе обсуждения.
Суть: Таймер запускается по внешнему сигналу. Запускается как ШИМ с разрешенным перезапуском. Чтобы сформировать первые 50 мксек необходимо поставить у таймера CCR = 1 и ARR = 5000. В таком случае первый положительный импульс будет запускаться с 0, в противном случае он уже сразу запустится с высокого уровня, что недопустимо. Далее по окончанию первого цикла ШИМ вызывается коллбек HAL_TIM_PeriodElapsedCallback, в котором CCR меняется на 5000 и увеличивается ARR. Таким образом будет сформирован второй импульс 50 мксек. В это время пропускаем первый вход в коллбек HAL_TIM_PWM_PulseFinishedCallback и при втоором входе в него останавливаем таймер. Теперь останется через некоторое необходимое время опять запустить таймер и вернуть настройки CCR и ARR к первоначальным 1 и 5000.
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { /* USER CODE BEGIN Callback 0 */
/* USER CODE END Callback 0 */ if (htim->Instance == TIM1) { HAL_IncTick(); } /* USER CODE BEGIN Callback 1 */ else if (htim->Instance == TIM2) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_7);
TIM2->CCR2 = 4999; TIM2->ARR = 9999; } else { __NOP(); } /* USER CODE END Callback 1 */ }
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения