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

Юрий_48

Members
  • Постов

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

  • Посещение

Весь контент Юрий_48

  1. Прошу извинений, по не опытности не там смотрел. Надо было лезть в раздел Middleware. Тему надо закрыть.
  2. STM32F103C8T6, KubeMX V 5.1.0, keil, Windows XP. Пытаюсь работать через USB в качестве виртуального COM порта. В Кубе генерирую проект. Генерируется, но файла с дескрипторами (usbd_desc.c) в нём нет. Вот всё, что предлагает Куб Не знаю на что и подумать: 1. то ли для STM32F103C8T6 это не возможно, правда в инете видел, что так работают. 2. то ли не та версия KubeMX и как то налагается Windows XP, хотя это звучит по дурацки 3. то ли чего то не знаю, что самое вероятное
  3. Вот и хорошо, а то как то неловко себя чувствовал.
  4. Если я правильно понял ваш вопрос, то его, как мне кажется, я обрисовал во втором посту сверху этой страницы. Как жалко, что нет номеров постов. Такого хорошего движка я пока не встречал и нет номеров. Но это так, к слову. В любом случае посмотрите, пожалуйста, этот пост. MasterElectric, внутренний голос подсказывает что вы хотите создать полноценную реализацию. Я был тронут вашим участием ещё тогда, когда вы предложили подробнее описать задачу. И очень бы не хотелось что бы ваши труды пропали даром. Вы уверены, что я смогу воспринять то, что будет реализовано у вас (странно звучит). Ведь я слаб и в Keil -е и в Си. Хотя программировал много, но в других средах и языках, в основном дело имел с промышленными контроллерами. Собственно поэтому я упал на Куб. Теперь то я понимаю, что луче было идти сразу путём изучения регистров и работать с ними. Но пройден такой большой путь и переделывать программу очень бы не хотелось. Честное слово, это разговор слепого с глухим. Ещё один такой пост и уже я скажу пока.
  5. Нет, не поняли - никакой неоднозначности. Пока я добавлял свой предыдущий пост, Вы создали этот. Посмотрите его ещё раз.
  6. Ещё раз, простите. Выше я уже пытался сказать, что каждый видит свою реализацию лучше. И это понятно и ничего в этом плохого нет. Если Вы всё таки въехали в тему, то, может, вам понятно почему при использовании представленного кода. DMA стартует то с 0 то с180 градусов?
  7. Да, извиняюсь, но не по поводу формулировок, а то, что упустил сказать, что запуск АЦП должен быть сдвинут относительно фронта модулятора. Более того эта задержка должна быть регулируемой. Это требование реализовано представленной структурой и осуществляется уровнями компарирования таймера 2, см. формулы внизу рисунка структуры. И это работает и вопросов к этому нет. Все вопросы, которые вы задали, собственно в этих формулах отражены. Попробую дать этим формулам словесное объяснение. Буфер АЦП циклический и размер его (индентификатор Б) берётся такой чтобы в него влезало целое количество периодов - идентификатор У, Б = 4*n*У, где n количество точек на четверть периода сигнала. Вот здесь опять извиняюсь - этой формулы в структуре нет. Параметр У это собственно количество усреднений для синхронной фильтрации. Т. е. полное заполнение буфера означает, что пора провести фильтрацию, дальнейшую обработку полученного сигнала и вывести результат. Это делается по прерыванию и это тоже работает. А модулятор и DMA работают себе при этом непрерывно - вот здорово, лишь бы всё успеть сделать до нового заполнения. Ну не знаю, что ещё разжевать из представленной информации, разве что ещё раз сказать, что для такой структуры, синхронизацию буфера АЦП достаточно сделать один раз при общей инициализации. С этой писаниной весь день развалился.
  8. Этой задаче могу уделять время только вечером пару-тройку часов. А сейчас зашёл только для того, чтобы извинится, поскольку понял, что надо было изначально сказать, что квадратурный сигнал требуется для воздействия на исследуемый объект. Т.е. он выводится на ножки камня. А предварительная обработка реакции объекта (АЦП) ведётся с помощью синхронной фильтрации, Потому то необходима вся эта бадяга с синхронизацией тактирования АЦП относительно квадратурного сигнала и синхронизацией начала записи в буфер ДМА опять же относительно квадратурного сигнала (передний фронт канала А). Что касается самого квадратурного сигнала, то по большому счёту он может быть любой формы лишь бы был периодический и сдвинут на четверть периода. Классический пример квадратурного сигнала это синусно косинусный сигнал. Вообще в своих исследованиях я предполагаю этап работы и с сигналом произвольной формы, но дойдёт ли до этого дело что то сильно сомневаюсь. А сейчас вполне достаточен меандр. Для отладки всей этой синхронизации в качестве модели объекта беру простой потенциометр - движок подключается к входу АЦП, а две остальные ножки к каналу А и Б квадратурного сигнала. Если надо проект, то могу выложить.
  9. Есть такое понятие - квадратурный сигнал. Он состоит как минимум из двух периодических сигналов, сдвинутых друг относительно друга на четверть периода. Так вот модулятор и является генератором квадратурного сигнала. Выход, который на диаграмме, обозначен, как запуск АЦП и запускает постоянно преобразование АЦП. А оно, в свою очередь, по ДМА записывает значения в его буфер. Вот, собственно, и синхронизация. Обработка сигнала ведётся с помощью синхронной фильтрации. Если вам это что то говорит, то сами можете додумать какое нагромаждение букв, стрелок и квадратиков должно быть что бы его осуществить аппаратным образом. Боюсь, что у вас получится что то близкое или ещё более нагромаждённое. До встречи в эфире. MasterElectric, с ходу не смог врубиться, что вы предлагаете. Вечерком попробую осмыслить. А на счёт задания в университете звучит довольно смешно (по хорошему), поскольку обратите внимание на моё имя - ни на какие мысли не наводит число 48? Если предположить, что это задание преподавателя студентам или аспирантам, то я и близко не стоял к преподавательской деятельности.
  10. Хорошо. Диаграмма нарисована для конкретного сигнала. На самом деле для эксперимента необходимо программно менять частоту F опроса АЦП с помощью ПП2 и АП2, задержку Фацп с помощью УК2.1 и УК2.2 и количество точек n на четверть периода с помощью ПП3 Вот правильный сигнал. Ещё приемлемый, но не желательный. Фаза сдвинута на 180 градусов Не приемлемый До сегодняшнего дня при смене параметров таймеров фаза сигнала получалась произвольной, как на последнем графике. Сегодня научился обнулять счётчик DMA. Это три предпоследних строчки кода. Считаю, что ситуация довольно радикально изменилась - в фазу стал попадать со значением 0 или 180 тоже произвольно. Очень редко фронт на одну точку смещается, что не допустимо (см. график внизу). Поигрался последовательностью действий, но безрезультатно. Функции Moi_TIM2_Init() и Moi_TIM3_Init() это переименованные функции инициализации таймеров генерированные Кубом, где числовые значения предделителей, автоперезагрузки и уровней компарирования мной заменены на переменные. Это работает. Пробовал уже много чего, всё не упомнишь. void Init_TIM (void) { RCC->APB1ENR &= ~RCC_APB1ENR_TIM2EN; // Выключить тактирование на TIM2 DMA1_Channel1->CCR &= ~DMA_CCR_EN; // Выключение канала1 DMA1 MX_DMA_Init(); Moi_TIM2_Init(); // Moi_TIM3_Init(); MX_ADC1_Init(); TIM3->EGR |= TIM_EGR_UG; // Обновление таймера 3 TIM2->EGR |= TIM_EGR_UG; // Обновление таймера 2 if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)aADCConvertedValues, ADCCONVERTEDVALUES_BUFFER_SIZE ) != HAL_OK) { // Start Error Error_Handler(); } HAL_TIM_OC_Start_IT(&htim3,TIM_CHANNEL_1); HAL_TIM_OC_Start_IT(&htim3,TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2); DMA1_Channel1->CCR &= ~DMA_CCR_EN; // Выключение канала1 DMA1 DMA1_Channel1->CNDTR = ADCCONVERTEDVALUES_BUFFER_SIZE; // Запись в счётчик DMA значение буфера DMA1_Channel1->CCR |= DMA_CCR_EN; // Включение канала1 DMA1 RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // Включить тактирование на TIM2 }
  11. Спасибо, как то слегка отлегло на душе - что то человеческое звучит в ваших словах. Сейчас покувыркаюсь немного, кажется нашёл зацепку. И, если что, то буду мучить дальше.
  12. И мне не только странно, но и печально.
  13. Что то сразу не въехал. Это ничего не даст. Мне то нужно не обнулить регистры, а, поскольку важны фазовые соотношения, нужно запустить два канала одного таймера одновременно с заданными делителями и компараторами. Да и счётчик DMA что бы стартовал с нуля.
  14. Спасибо. Таких красочных картинок таймеров ещё не видел Ну, что ж, называйте и раздавайте ярлыки как хотите. Но, может, не поленитесь и найдёте те 6 строчек, на которые Вы уже потратили 15 митнут не моего а своего времени. Если они дорого стоят, то не надо. Спасибо. Пробовал работать с битом UG в регистре EGR, но результата не дало. Попробую ваш совет.
  15. Правильно ли я воспринимаю эту фразу, как то, что никто этот путь ещё не проходил? Поверьте, что это сказано без ехидства. Т.е. на этом форуме мне никто обстоятельно не ответит на мои вопросы и надо смириться с мыслью о выделении для себя приличного времени для его изучения. Совершенно верно. Только со всей этой схемотехникой я знаком уже не менее 30 лет. И с таймерами для этого камня более менее разобрался. По названию ХАЛовской функции трудно однозначно воспринять, что же она может, а изучать их свойства по самому коду - это сколько же время надо угрохать. Тем более, если учесть, что по причине своей богатой фантазии я, как правило, для выяснения всех обстоятельств и своих вопросов прохожу значительно больший путь, чем на самом деле нужен, может, и не оправдано, но такой уж я . Понятно, что, если в таком духе будет продолжаться тема, то волей не волей придётся тратить время на изучение второстепенных для меня вопросов, а жаль - время то хотел сократить.
  16. Языком С как и английским владею не нормально. Хотя программировал много, но не языками инструкций. Уже не раз пробежался по разделам таймеров, кое чего попробовал, но положительного результата пока не добился. Надеюсь, что не отпугну знающих людей, если скажу, что цель у меня не изучить детально язык или микропроцессор, а поставить интересующий меня эксперимент. Поэтому для меня было бы бальзамом на сердце, если бы советы были в виде конкретных строчек кода.
  17. STM32F103. Допустим работаем с таймером 2. В какой то момент надо изменить значения предделителя, автоперезагрузки и уровней компарирования в двух первых каналах. При чём так, чтобы при его новом старте он был как "новорождённый". Т.е. счётчики предделителя , основного счётчика и ещё чего там были равны нулю, как при старте камня. Менять то я меняю, но таймер стартует с произвольного состояния счётчиков. Какие действия я вижу для решения этой проблемы. 1. Остановить таймер. 2. Прописать в таймер все необходимые параметры, включая исходные состояния выходов. 3. Обнулить счётчики таймеров. 4. Запустить таймер. 5. Может ещё чего, что упустил. Наиболее актуальные вопросы: 1. Как правильно остановить таймер? Имеется ввиду останов счёта как основного счётчика, так и предделителя. 2. соответственно как потом "оживить" таймер так, чтобы оба канала начали работать одновременно? Работаю с Кубом и недавно, поэтому желательно увидеть примеры халовскими функциями.
×
×
  • Создать...