Jump to content
artos5

Тактирование одного таймера от другого таймера stm32f100

Recommended Posts

Добрый день уважаемые ! 

Необходимо решить одну задачу , максимально аппаратно :

Нужно одним таймером формировать меандр , частота которого меняется в регистре предделителя . А вторым таймером на большей частоте в 8 - 16 раз нужно измерять сигнал и оцифровывать при помощи АЦП через DMA . Формирование меандра и точки измерения сигнала должны быть синхронизированы . Как это решить?

Сейчас сделал программно так:

в прерывании по переполнению таймера я инкрементирую переменную и когда она достигнет 8 - 16 , инвертирую бит для формирования меандра . Этим же таймером в связке с dma выполняется оцифровка сигнала на входе АЦП . Входов АЦП 3 , что дополнительно усложняет задачу..

Все было бы хорошо , но не устраивает великоватый джиттер меандра.

диапазон частот формируемого меандра 500-22000Гц (чем выше тем лучше).

Количество точек оцифровки тоже чем выше тем лучше .

пример кода могу позже показать , когда свет появится ..

Share this post


Link to post
Share on other sites

вместо прерывания лучше использовать регистр сравнения таймера и подключить его на выход в режиме переключения 

Share this post


Link to post
Share on other sites
On 15.07.2019 at 20:42, DYeliyev said:

вместо прерывания лучше

А можете пример дать?

Мне вообще надо генерировать меандр и через равные промежутки оцифровывать 1 канал АЦП (он очень важен) , но есть проблема... Используется ещё 2 канала АЦП . Они менее преоритетны , но они сильно мешают чёткому измерению в равные промежутки и сильно замедляют скорость работы одного важного канала. 

Меандр может формироваться до 20кгц , а измерять аналоговый сигнал нужно через равные интервалы времени и с максимально возможной частотой . Чем больше тем лучше . Например 16 семплов за период ШИМ .

То есть этот 1 канал должен оцифровывать с частотой 320кГц .

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

Share this post


Link to post
Share on other sites

Вебинар STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

Компания Компэл приглашает вас 25 сентября принять участие в вебинаре, который посвящен новому семейству микроконтроллеров STM32G0. Вебинар рассчитан на технических специалистов и тех, кто хорошо знаком с семейством STM32. На вебинаре будут освоены современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0 и проведено их подробное сравнение.

Подробнее

так у вас шим или меандр с изменяемой частотой ?  это как-бы немного разные вещи. 

Share this post


Link to post
Share on other sites

При помощи аппаратного модуля ШИМ формируется меандр. Прямоугольные импульсы одинаковой скважностью и длительностью.

Share this post


Link to post
Share on other sites
                     

Литиевые батарейки Fanso в беспроводных датчиках пожарно-охранной сигнализации

Выбор подходящего элемента питания, способного обеспечивать требуемый уровень напряжения и выдавать необходимый ток на протяжении всего периода эксплуатации беспроводной пожарно-охранной системы является одной из первостепенных задач. Наиболее подходящим для этих целей элементом являются литий-тионилхлоридные элементы питания, а одним из наиболее конкурентоспособных производителей – компания Fanso, предлагающая своим клиентам продукты как универсальные, так и разработанные специально для решения конкретных задач.

Подробнее...

 

Ребята , кто подскажет, можно так сделать? Нормально работать будет?  :

есть один важный вход АЦП и есть два не сильно важных входа.

Идея , инициализировать его (важный)  , настроив его работу через DMA. Потом через секунду или две, остановить и настроить преобразование двух других каналов , выполнить измерение и копирование данных . После снова остановить преобразование тех двух каналов и настроить новое преобразование с первого канала . И так по кругу.

Идея просто раз в 2 секунды измерять низко приоритетные входы АЦП. А две секунды измерять высокоприоритетный вход.

Share this post


Link to post
Share on other sites

Если устроит, то есть регулярные каналы и можно настроить групповое преобразование. В группе может быть до 16 каналов. Можно сделать 14 преобразований важного канала и 2 преобразования вспомогательных каналов. При этом можно задать любой порядок следования каналов например: 1,1,2,1,1,3,1,1... Не надо будет перенастраивать, ДМА будет складывать так как зададите. Число каналов и последовательность задается в регистрах ADC_SQR1,2,3.

Share this post


Link to post
Share on other sites

Во , это вроде подходит, а может и нет... Можете пример инициализации скинуть?

Мне нужно за период меандра как можно больше сэмплов выполнять. 

Короче говоря нужно в дальнейшем выполнять над данными ЦОС. 

Нужно минимальное искажение меандра и минимальная нестабильность точек оцифровки .

Share this post


Link to post
Share on other sites

Делал типа такого

  ADC_InitStr.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStr.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStr.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStr.ADC_NbrOfChannel = 4;
  ADC_InitStr.ADC_ScanConvMode = ENABLE;
  ADC_InitStr.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_Init( ADC1, &ADC_InitStr );
	
  ADC_RegularChannelConfig( ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 );
  ADC_RegularChannelConfig( ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 );
  ADC_RegularChannelConfig( ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5 );
  ADC_RegularChannelConfig( ADC1, ADC_Channel_TempSensor, 4, ADC_SampleTime_239Cycles5 );
  ADC_TempSensorVrefintCmd( ENABLE );
	
  ADC_DMACmd( ADC1 , ENABLE );
  ADC_Cmd( ADC1, ENABLE );

ADC_InitStr.ADC_NbrOfChannel = 4; - это число каналов в группе ставите 16

ADC_RegularChannelConfig( ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 ); - число 1 - канал 0 будет запущен первым и т. д.

Лучше порядок преобразований и число задать через регистры ADC_SQR1, ADC_SQR2 и ADC_SQR3.

ADC_SQR1 = 0х00F00000; - типа такого.

 

Share this post


Link to post
Share on other sites

Спасибо за пример ! Через 2-3 дня попробую как с командировки приеду .

Ещё вопросик :

Если я выберу 1.5 цикл преобразования , какая будет реальная частота работы АЦП при максимальной тактовой?

В МК ещё при этом запущено пару таймеров и ЦАП два канала через DMA.

Share this post


Link to post
Share on other sites

112233.jpg.492f73fe54bb329d1df8ea8c09273da2.jpg

Максимальная частота АЦП 12 МГц. Около 850 000 преобразований в секунду. Другая периферия на время преобразования не влияет. В ДМА лучше для АЦП поставить высший приоритет.

Share this post


Link to post
Share on other sites
1 minute ago, MasterElectric said:

Бери камнь под задачу, а не говно мамонта 12 летней давности

Я знаю что этот камень не подходит. Но поставлена задача под имеющееся железо сделать прошивку .

Я бы взял МК stm32f205/207. Но этого сделать не могу :)

Share this post


Link to post
Share on other sites
Posted (edited)

@artos5 разгони немного АЦП до 14 и по идее сможешь все 3 вычитывать до 22000 * 16 семплов.Судя что при 12 он способен дать 1 Мсемпл

@artos5  Настрой таймер на 16 кратный счет это будет период, 1 канал формирует меандр на половине периода, 2 канал пинает ДМА для АЦП, ДМА настрой на выборку нужного количества каналов * на 2, кольцевой режим, на 1/2 можно обрабатывать первую половину данных. Ну и третий канал будет сдвигать значение компарэ для второго канала.

Edited by MasterElectric

Share this post


Link to post
Share on other sites
42 minutes ago, MasterElectric said:

 

16 выборок на период может быть и избыточно . Достаточно 22кГц * 4..5 выборок . Но пусть возьмём с запасом .

16 всего выборок . 14 выборок из важного входа АЦП , а две оставшиеся выборки из вспомогательных входов .

Вспомогательные входы поместить в начало и конец , чтобы лучше анализировать потом синусоидальный сигнал.

Share this post


Link to post
Share on other sites

Для ЦОС  нужно выборку делать строго периодически, даже если брать 8 выборок на период то можно вычитывать все 3 канала. т.е. за раз вычитывать 3 канала и все.

Share this post


Link to post
Share on other sites
6 minutes ago, MasterElectric said:

за раз вычитывать 3 канала и все.

Понял. Хорошо, тогда вопрос :

сколько можно сделать выборок из 3 каналов при времени преобразования 1.5 такта ? 1.5*3+12.5? Или (1.5+12.5)*3 Тактов?

Share this post


Link to post
Share on other sites
Posted (edited)

Лучше уменьшить время преобразования, и есть табличка зависимости скорости преобразования и входного сопротивления АЦП, оно меняется. Там бы хоть 1 раз получилось. Зачем несколько раз измерять подряд, потом еще усреднять вручную надо.

Edited by MasterElectric

Share this post


Link to post
Share on other sites

Я смотрел этот параметр . При 1.5 сопротивление 400 Ом по моему . На вход АЦП сигнал идёт из операционника mcp6022. Нужно посмотреть , позволяет ли он работать на такую нагрузку ..

Посмотрел при 7.5 такта , сопротивление 5 с копейками килоом .

И если расчеты верны то получится 3 канала опрашивать на частоте 200кгц . 10 выборок на период при 20кгц меандра. Теперь вопрос :

достаточно будет один таймер настроить на формирование меандра 20кгц , а второй в 10 раз выше для пинания дма? Когда запущу счётчик обоих обнулить , чтобы считали одинаково . Или это лишнее? Нужно определять сдвиг синусоиды от меандра .

Share this post


Link to post
Share on other sites
1 hour ago, MasterElectric said:

Для ЦОС  нужно выборку делать строго периодически

Скажите , с вами можно будет по вотсап пообщаться или по Скайпу?

Share this post


Link to post
Share on other sites
2 hours ago, artos5 said:

достаточно будет один таймер настроить на формирование меандра 20кгц , а второй в 10 раз выше для пинания дма?

Зачем два таймера. АЦП сам запускает ДМА по окончанию каждого преобразования. У АЦП есть режим запуска по триггеру. Таймер будет запускать все 10 преобразований по вашему меандру. Только посмотрите какие таймеры и по какому событию могут запускать АЦП.

Share this post


Link to post
Share on other sites

Так получается что нужно настроить чтобы срабатывало по событию переполнения таймера , который формирует меандр в регулярных каналах настроить группы трёх входов АЦП . Таким образом :

123 123 123 123 123 и по прерыванию таймера будет выполняться 15 измерений?

Share this post


Link to post
Share on other sites

Да. Обработку я делаю по прерываниям от ДМА - половина буфера и полный. Пока обрабатываю первую половину, заполняется вторая.

Share this post


Link to post
Share on other sites
9 hours ago, MasterElectric said:

 Настрой таймер на 16 кратный счет это будет период, 1 канал формирует меандр на половине периода, 2 канал пинает ДМА для АЦП, ДМА настрой на выборку нужного количества каналов * на 2, кольцевой режим, на 1/2 можно обрабатывать первую половину данных. Ну и третий канал будет сдвигать значение компарэ для второго канала.

Толку общаться нет т.к. в ЦОС я ничего не смыслю, но про выборки я где-то читал ну это и так логически понятно, пропускать чтение нельзя.

Share this post


Link to post
Share on other sites
26.07.2019 в 14:54, snn_krs сказал:

Да. Обработку я делаю по прерываниям от ДМА - половина буфера и полный. Пока обрабатываю первую половину, заполняется вторая.

Всем привет! 

Что-то меня запутали вы .

Судя по скрину приведенному ниже - это не так .

АЦП конвертирует после события , настроенному в регистрах , в нашем случае настроенном от события таймера. Мне надо (ещё раз объясню) вычислять угол сдвига фазы имея опорную фазу , в данном случае опираясь от генерируемого меандра . Поэтому, необходимо через равные промежутки периода меандра и равные точки начала конвертирования АЦП выполнять измерения . 

По скрину видно что АЦП выполняет одно преобразование после события от таймера , потом следующее после следующего , и т.д. То есть таймера нужно два применять , один таймер должен в 12 раз быстрее тикать от первого , и пинать АЦП . Как это все засинхронизировать чтобы не вылезла ошибка потом ?

Можно своими словами описать алгоритм действий и т.д.

Screenshot_2019-07-27-23-16-00-940_cn.wps.moffice_eng.png

26.07.2019 в 20:32, MasterElectric сказал:

Настрой таймер на 16 кратный счет это будет период, 1 канал формирует меандр на половине периода, 2 канал пинает ДМА для АЦП, ДМА настрой на выборку нужного количества каналов * на 2, кольцевой режим, на 1/2 можно обрабатывать первую

Что-то не догоню... Настроить чтобы делало 16 тиков и сбрасывался счётчик в ноль? То есть прескейлер 16 поставить ? Можно поподробнее расписать?

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...