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

Variant99

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

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

  • Посещение

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

    5

Весь контент Variant99


  1. EGR - регистр принудительной (программной) генерации событий. Вот что говорит манулал по этому поводу: Bit 1 CC1G: Capture/Compare 1 generation This bit is set by software in order to generate an event, it is automatically cleared by hardware. 0: No action 1: A capture/compare event is generated on channel 1: If channel CC1 is configured as output: CC1IF flag is set, Corresponding interrupt or DMA request is sent if enabled. If channel CC1 is configured as input: The current value of the counter is captured in TIMx_CCR1 register. The CC1IF flag is set, the corresponding interrupt or DMA request is sent if enabled. The CC1OF flag is set if the CC1IF flag was already high. Bit 0 UG: Update generation This bit can be set by software, it is automatically cleared by hardware. 0: No action 1: Reinitialize the counter and generates an update of the registers. Note that the prescaler counter is cleared too (anyway the prescaler ratio is not affected). The counter is cleared if the center-aligned mode is selected or if DIR=0 (upcounting), else it takes the auto-reload value (TIMx_ARR) if DIR=1 (downcounting). Бит 1 CC1G: генерация захвата/сравнения Этот бит устанавливается программно для генерации события, он автоматически сбрасывается аппаратно. 0: нет действия 1: Событие захвата/сравнения генерируется на канале 1: Если канал CC1 сконфигурирован как выход: Флаг CC1IF установлен, соответствующее прерывание или запрос DMA отправляется, если включен. Если канал CC1 сконфигурирован как вход: Текущее значение счетчика фиксируется в регистре TIMx_CCR1. Флаг CC1IF установлен, соответствующее прерывание или запрос DMA отправляется, если включен. Флаг CC1OF устанавливается, если флаг CC1IF уже был высоким. Бит 0 UG: Генерация обновления Этот бит может быть установлен программно, он автоматически сбрасывается аппаратно. 0: никаких действий 1: Повторная инициализация счетчика и обновление регистров. Обратите внимание, что счетчик предварительного делителя также очищается (в любом случае коэффициент предварительного делителя не затрагивается). Счетчик очищается, если выбран режим выравнивания по центру или если DIR=0 (прямой счет), в противном случае он принимает значение автоматической перезагрузки (TIMx_ARR), если DIR=1 (нисходящий счет).
  2. О боже, что это? 🥵 альтернативная вселенная? Я никогда не видел такой формы записи кода. А скажите, автор сам это хоть как-то понимает? Я вот чисто по памяти опознаю CR1: 0001 - это TIM3->CR1 = TIM_CR1_CEN
  3. Так не ставьте кондеры по 47 мкФ, чтобы не было больших токов разрядки.
  4. Если бы jcxz хоть раз делал бы частотный привод, он бы знал, "насколько оперативно" надо :))) А коль спрашивает - значит не делал. :)))
  5. А один участвующий поцык тут обещал "~1 такт (ARM)" 🙂 А тут уже и 8, и 30 тактов. Эх, вот так и верь ...
  6. Энкодер как бы намекает на то, что это будет частотный привод для асинхронного трехфазного электромотора. Энкодер позволяет расширить диапазон регулирования скорости вращения.
  7. С импортозамещением на STM32 будет туго. 😄 Это еще хорошо, что ST Microelectronics не сделала так, как Analog Devices или Texas Instruments, и не закрыла доступ к документации и сайту в целом, а ограничилась только закрытием скачивания ПО. Так что тут лучше объяснять просто желанием самостоятельно участвовать в процессе, а не тупо прикручивать скотчем готовые куски. Тем более, что это будет то же самое, только сделанное самим. А это тоже немаловажно для чисто творческого процесса. Потому что если не делать самому, то еще проще - взять на той же Алишке готовый частотник и вообще не париться изобретениями того, что уже вообще было сто раз сделано.
  8. Аккорд - это одновременно взятые три или более ноты. В MIDI нет специальной команды для описания аккорда (нескольких нот), а значит, аккорд образуется передачей последовательно трех-четырех команд NoteOn. Да, возможно, нужно перед этим отправить команду Poly On.
  9. Да всё нормально делает топикстартер. Он просто вначале сумбурно описал хотелки, я тоже мало чего понял вначале, какие там "треугольники" и что конкретно не получается. Но на последней его фотке видно, что он получил. И как оказалось, всё в поряде изначально, просто на осцилле неверно настроил захват сигнала и картинка неверно его информировала. Так что всё норм. Ширина импульса меняется по синусоидальному закону, с тем, чтобы на выходе ШИМ поставить RC-фильтр и получить отфильтрованнное напряжение, изменяющееся по синусоидальному закону. Вот типа такого: Топикстартер использует три канала, это наводит на мысль, что он пытается крутить трехфазный BLDC-моторчик.
  10. А, ну дак время развертки на осцилле у вас короче, чем интервалы изменения ШИМа. Я уж было достал плату и анализатор, показать на деле...
  11. Да без вопросов, конечно можно. Однако, если использовать таблицу только на четверть периода, то не получится - DMA считать назад не умеет, да и проводить вычитание константы тоже нет. Ну и автор сказал, что он хочет вычислять значение в каждом шаге, потому что значения в формуле могут меняться. В принципе, его право, пусть делает как хочет.
  12. Во-первых, можно писать просто TIM1->SR = ~TIM_SR_UIF; там для сброса бита имеет значение только 0, запись 1 на биты не влияет никак, поэтому выполнять &= не нужно. Во-вторых, добавьте после этой строчки еще несколько строчек прог.кода или просто __NOP(); Такое поведение известно с таймерами. А если в обработчике шагаете по шагам, то пока вы шагаете, интервал времени проходит и успевает выставиться новое прерывание. Чтобы этого не происходило, можно в регистре DBGMCU включить бит DBG_TIM1_STOP для остановки таймера во время пошаговой отладки.
  13. правда-правда. Вначале посмотрите, что там написано, потом будете писать очередную глупость. Автор конечно написал мессагу так, что ничего непонятно, какие "треугольники счета" и что именно не получается. Возможно, невыставленный бит предзагрузки OC1PE, возможно, слишком долго идет расчет флоатов, возможно, вообще неверно построил алгоритм. Нет особого смысла высчитывать в каждом приращении угла синусоиды новое значение, можно брать из заранее просчитанной таблицы для периода. Или полупериода. Или даже четверти периода. Функция то симметричная по двум осям. Перезаписывать новым значением регистр CCR1 нужно с частотой шагов приращения угла синуса, то есть, от второго таймера, задающего частоту синусоидального сигнала, получаемого в результате фильтрации ШИМ. Вообще, ШИМ - это ШИМ. Его частота - это частота ШИМ, влияющая на фильтрацию выходного сигнала. А частота синусоидальной огибающей выходного сигнала, получаемого после фильтрации ШИМ - это уже другая частота, она не связана с частотой ШИМ. Вернее, она конечно может быть кратна ей, но это частный, необязательный случай.
  14. Заранее обсчитайте таблицу синуса, заполните массив. А потом подставляйте в CCR1 значения из этого массива, по событию (прерыванию) обновления счета. При этом, должна быть включена буферизация записи CCR. Ввиду того, что расчет синуса занимает много процессорного времени, таблицу желательно иметь заранее сгенерированную.
  15. 50% ЩИМ - есть меандр. Это во-первых. А во-вторых, у таймера есть там такой режим - переключение выхода на противоположное состояние в каждом новом цикле счета - называется Toggle. Как раз получится 50%. Настраивается теми же битами, которыми и PWM режим включается - биты OCxM регистра CCMRx. Второй вариант - ARR и CCRx не трогать, выставив их в фиксированные значения, а частоту изменять регистром PSC, это равнозначно.
  16. ...есть собственные пальчики, которые вбивают циферки в конце имени...
  17. А еще есть экранированный кабель "витая пара". Или просто двужильный кабель с экраном. Такой используется в DMX управлении световыми приборами.
  18. Не знаю, как вы, но я бы начал с изучения документации на микроконтроллер LPC2148.pdf - Yandex.Documents Затем прочел бы документацию на дисплей SSD1327_datasheet.pdf - Yandex.Documents Потом, глядя в реализованный пример для СТМ, попробовал бы переписать его с учетом работы с периферией другого микроконтроллера. Переписать нужно то, что относится к работе с портами ввода-вывода и используемым интерфейсом (SPI, I2C). Всё остальное должно работать без переписывания. PS. Интересно, а кто с этим не согласен, что поставил "минус"? Автор чтоль? Ну а что он хотел то, он же спрашивал, с чего начать. Ну. Начинать надо с начала. Микроконтроллер (не микропроцессор!) довольно древний и непопулярный, поэтому навряд ли кто поможет готовым кодом, это редкость. Дисплей же хоть и не самый распространенный, но на него есть готовый пример, а во-вторых, все дисплеи этого производителя работают одинаково, даже коды команд совпадают. Отличие от мега-популярного SSD1306/1309 разве что в том, что тут есть 16 градаций яркости пикселя и один пиксель представлен 4-мя битами, а не одним. То есть, в байте не 8 пикселей, а только 2. Ну и число строк увеличено в два раза. Чаще всего дисплей подключается по SPI или по I2C. По SPI - легче написать. Интерфейс подключения задается микроперемычками на плате (впаиваемые нуль-резисторы). На плате должно быть подписано положение перемычек. Лучше всего подключить по SPI. Затем написать отправку байта по SPI и дергание ногой для D/C. После этого отправить в дисплей при D/C = 0 байты 0xAB, 0x01, 0xAF и, если всё сделано правильно, то дисплей должен включиться и отобразить произвольный набор пикселей. Далее всё делается четко по мануалу, по таблице команд - выставить нулевые адреса строки и столбца, нулевой номер строки, настроить мапинг, то есть ориентацию, ну и выставить D/C = 1 и начать отправлять байты изображения. Или сделать так, как описано в файле OLED_Driver.c примера. Написание же функций построения линий, фигур, вывод шрифтов - это отдельная и объемная тема, требует знаний и опыта программирования в целом.
  19. Варисторы со временем деградируют. К тому же, у них ограничена максимальная энергия поглощения импульса. Они предназначены для поглощения коротких импульсов. А защитные диоды (TVS) так же имеют ограничение по рассеиваемой мощности, и работают они так же при коротких импульсах. Длительные (дольше сотен миллисекунд) превышения напряжения поглощаться должны резисторами, да еще и с принудительным охлаждением.
  20. А частотометр насколько точно саму частоту измеряет? Это отсыл к тому, чтобы почитать доки к частотометру и узнать его погрешности. Как минимум, ±1 ед.младш.разряда будет, а то и больше, да плюс процент от полной шкалы. --- Чел спрашивает, как ТОЧНО настроить частоту, а ему советуют - вскройте корпус, надфилем спилите или графита насыпьте :)))) Вообще, обычные кварцы - ±20 ppm (долей на миллион) или 0,002%
  21. ...а при выключении питания последует обратный процесс - задержка сброса. Поэтому, видел в некоторых схемах, стоял параллельно резистору диод в обратном направлении, чтобы конд быстро разрядился. Вообще, пока МК проинициализирует свои внутренности, пока то да сё, времени уйдет как раз на стабилизацию напряжения. Можно уровень BOR поставить повыше, если внешние компоненты критичны к нормальному напряжению.
  22. А ничо, что автор сообщал, что он резистор этот даже убирал - и ничего не менялось. Причиной, как мне видится, является отсутствующий (NC) резистор R1 на PDR_ON. Автор упоминает, что проблема есть только при запуске от подачи питания, а при сбросе кнопкой или от отладчика (программный сброс) проблем нет. Так вот, PDR_ON (Power-down reset On/Off) как раз управляет формированием сигнала сброса при пониженном напряжении, то есть в момент нарастания напряж питания. Если сброс не формируется в этот момент, то регистры содержат произвольные данные.
  23. А в схеме нарисован резистор R1, идущий на контакт PDR_ON, но резистор помечен как NC - не установлен. Так? А ведь вывод PDR_ON отвечает как раз за формирование сигнала сброса при подаче питания, и его надо подключать к VDD. Посмотрите схему отладочной платы STM32F429-Disc1 в документе UM1670
  24. ...чисто исторически конденсатор с резистором ставили на PIC-ах, чтобы при выбросах в питании исключить переход в режим программирования, потому как один резистор подтяжки к питанию приводил как раз к этому эффекту.
×
×
  • Создать...