STM32F1xx: АЦП и ложные срабатывания TIM15 CC1

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
РадиоЛоматель
Мудрый кот
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)
Контактная информация:

STM32F1xx: АЦП и ложные срабатывания TIM15 CC1

Сообщение РадиоЛоматель »

Доброе время суток!
Столкнулся с такой проблемой: Имеется отладочная плата STM32-DISCOVERY с установленным STM32F100RB. Задача состоит в постоянном чтении АЦП и одновременном измерении периода/фазы сигнала с помощью модуля захвата сравнения таймера. Реализовать их в отдельности не составило большого труда. Но проблемы начались после соеденения.
Значит так: На вход TIM15 CC1 подается прямоугольник с частотой 50Гц, имеется прерывание по захвату на фронте, в нем считываю значение, вычитаю предыдущее, получаю так период, принимаю нужное решение. Все работает до тех пор, пока на вход АЦП IN14 не подаю "выпрямленную" синусоиду. (На один период приходится два горба от нуля до 2,2 вольта. Опорное напряжение - 3 вольта. Выбросов и осцилляций сигнал не имеет). Измеренный модулем захвата период тут же уменьшается в два раза. Стоит отсоединить входной сигнал - все возвращается в норму. Сигналы своей формы и тем более частоты не меняют в зависимости от состояния подключений.
Если програмно выключить модуль АЦП, но подавать на вход сигнал - так же все работает нормально. Другой таймер, другие выводы я уже попробовал. Вывод захвата притянут к 3,3 вольта резистором на 1кОм, замыкается на землю через транзистор. На АЦП сигнал приходит с ОУ. Оба сигнала синфазны. Фронт приходится на возрастающее пересечение нуля синусоидой.
Уж не знаю что и поделать. Может кто сталкивался с таким?
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Реклама
Аватара пользователя
DrGandalf
Встал на лапы
Сообщения: 110
Зарегистрирован: Пн дек 03, 2012 19:31:53
Откуда: Санкт-Петербург

Re: STM32F1xx: АЦП и ложные срабатывания TIM15 CC1

Сообщение DrGandalf »

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

Или вы утверждаете, что выпрямленная синусоида должна иметь тот же период, что и ее исходный сигнал?
Реклама
Аватара пользователя
РадиоЛоматель
Мудрый кот
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)
Контактная информация:

Re: STM32F1xx: АЦП и ложные срабатывания TIM15 CC1

Сообщение РадиоЛоматель »

Ладно, я хотел избежать рисования картинок, но прийдется это делать.
Изображение

Тут красная линия - входной сигнал 50 Гц.
Зеленая пунктирная линия - Сигнал после "выпрямителя". Подается на вход АЦП.
Синяя точечная линия - сигнал после компаратора, который подается на вход модуля захвата.
Из модуля захвата по прерыванию берем текущее значение таймера, вычитаем из него предыдущее значение (конечно же, с учетом переполнения таймера) и получаем период в попугаях. (В системных тактах в моем случае, так настроен источник тактирования для таймера).
Проблема заключается в том, что при выключенном АЦП и подключенном сигнале или отсоединенном входном сигнале и включенном АЦП получаем правильное значение периода. При включенном АЦП и подключенном сигнале - многие события захвата происходят раньше в два раза, чем получаем истинное событие.
Захват на возрастающий фронт настроен. Это точно.
Вложения
1.gif
(5.63 КБ) 1113 скачиваний
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Аватара пользователя
РадиоЛоматель
Мудрый кот
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)
Контактная информация:

Re: STM32F1xx: АЦП и ложные срабатывания TIM15 CC1

Сообщение РадиоЛоматель »

Все. Проблема решена.
Последовательно входу АЦП необходимо добавить резистор на 50кОм. Странно это все.
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
_AHTOXA_
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт янв 21, 2011 14:16:36
Откуда: Уфа
Контактная информация:

Re: STM32F1xx: АЦП и ложные срабатывания TIM15 CC1

Сообщение _AHTOXA_ »

А вы в обработчике прерывания проверяете источник?
Ну, типа

Код: Выделить всё

    if (TIM15->SR & TIM_SR_CC1IF)
    {
        TIM15->SR = ~TIM_SR_CC1IF;
        ...
    }
?
Реклама
Аватара пользователя
РадиоЛоматель
Мудрый кот
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)
Контактная информация:

Re: STM32F1xx: АЦП и ложные срабатывания TIM15 CC1

Сообщение РадиоЛоматель »

_AHTOXA_ писал(а):А вы в обработчике прерывания проверяете источник?
Конечно же я проверяю источник. И флажок сбрасываю. И проверяю переполнение. Программа сейчас сведена до абсурдно простой. Куски инициализации взяты из примеров, тактирование модулей и портов включено, одно прерывание и запущенное АЦП по сравнению таймера.
После установки резистора напряжение на входе АЦП стало "не доставать " до земли на целый вольт. Вход точно переведен программно в состояние Analog_IN.
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Реклама
Galizin
Мучитель микросхем
Сообщения: 478
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: STM32F1xx: АЦП и ложные срабатывания TIM15 CC1

Сообщение Galizin »

Можно предположить отсутвие соединения аналоговой и цифровой земель.
Аватара пользователя
РадиоЛоматель
Мудрый кот
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)
Контактная информация:

Re: STM32F1xx: АЦП и ложные срабатывания TIM15 CC1

Сообщение РадиоЛоматель »

Galizin писал(а):Можно предположить отсутвие соединения аналоговой и цифровой земель.
Спасибо человеку, коорый не полез в мою программу копаться. Проблема с землей тоже имела место быть, но после устранения странный эффект не исчез.
Но вторая проблема оказалась в возбуждении операционного усилителя. При чем он сразу начинал работать нормально, если к его выходу подключить осциллограф. А контролировать состояние выходного сигнала на процессоре в это время мне было нечем. Осциллограф то одноканальный. Дело решилось небольшим конденсатором (200 пф) на выходе ОУ.
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Ответить

Вернуться в «ARM»