Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

STM32 измеренние длительности импульса

Непрочитано 21.08.2012, 10:16  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: STM32 измеренние длительности импульса

Можно уровень воды в баке бесконтактным способом измерять.
Реклама:
Easyrider83 вне форума  
Непрочитано 21.08.2012, 11:05  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: STM32 измеренние длительности импульса

Сообщение от Easyrider83 Посмотреть сообщение
Можно уровень воды в баке бесконтактным способом измерять.
Пальцем быстрее...
Глянул краткое описание. У него на выходе готовый импульс, пропорциональный времени от старта передачи до момента приема.
http://www.dealextreme.com/p/hc-sr04...-module-133696
Учить ТС-а применению захвата по таймеру не входит в мои жизненные планы.
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
Непрочитано 21.08.2012, 11:53  
nonamedov
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
nonamedov на пути к лучшему
По умолчанию Re: STM32 измеренние длительности импульса

Сообщение от ut1wpr Посмотреть сообщение
Потрясен. Вы достигли совершенства и стали ясновидцами!
Таки да!
Сообщение от Easyrider83 Посмотреть сообщение
Зачем только - не понятно. У меня пока лежат без дела.
Вы же, кажется, хотели создать тему о применении данных датчиков. Они и у меня валяются без дела, не пойму, что же полезное из них можно сделать. Роботы так каковые не интересуют, почти все виденные мною в сети слишком примитивны, бесполезны и требуют внушительных затрат на приводы и механику.
nonamedov вне форума  
Непрочитано 21.08.2012, 11:57  
anton_1000
Прописка
 
Регистрация: 31.08.2008
Сообщений: 117
Сказал спасибо: 4
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
anton_1000 на пути к лучшему
По умолчанию Re: STM32 измеренние длительности импульса

Да "тема по" HC-SR04 Ultrasonic Sensor Distance Measuring Module. Хочу сделать на его основе бесконтактный датчик уровня воды в ёмкости. Просто датчик "известный", а темы по его применению нет.
anton_1000 вне форума  
Непрочитано 25.08.2012, 23:49  
anton_1000
Прописка
 
Регистрация: 31.08.2008
Сообщений: 117
Сказал спасибо: 4
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
anton_1000 на пути к лучшему
По умолчанию Re: STM32 измеренние длительности импульса

Пишу программу, однако упёрся в механизм измерения длительности приходящего импульса. Использую таймер 3 модуль захвата. Имею две процедуры настройки таймера на прерывания по возрастанию и убыванию уровня. Ниже код:

void TIM3_Configuration_Rising(void)
{
/* TIM3 configuration: Input Capture mode ---------------------
The external signal is connected to TIM3 CH2 pin (PA.07)
The Rising edge is used as active edge,
The TIM3 CCR2 is used to compute the frequency value
------------------------------------------------------------ */

TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;

TIM_ICInit(TIM3, &TIM_ICInitStructure);

/* TIM enable counter */
TIM_Cmd(TIM3, ENABLE);

/* Enable the CC2 Interrupt Request */
TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
}

void TIM3_Configuration_Falling(void)
{
/* TIM3 configuration: Input Capture mode ---------------------
The external signal is connected to TIM3 CH2 pin (PA.07)
The Rising edge is used as active edge,
The TIM3 CCR2 is used to compute the frequency value
------------------------------------------------------------ */

TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;

TIM_ICInit(TIM3, &TIM_ICInitStructure);

/* TIM enable counter */
TIM_Cmd(TIM3, ENABLE);

/* Enable the CC2 Interrupt Request */
TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
}


Процедура обработки прерывания
void TIM3_IRQHandler(void)
{

if(TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET)
{
/* Clear TIM3 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
if(CaptureNumber == 0)
{
/* Get the Input Capture value */
IC3ReadValue1 = TIM_GetCapture2(TIM3);
CaptureNumber = 1;

TIM3_Configuration_Falling();

}
else if(CaptureNumber == 1)
{
/* Get the Input Capture value */
IC3ReadValue2 = TIM_GetCapture2(TIM3);

/* Capture computation */
if (IC3ReadValue2 › IC3ReadValue1)
{
Capture = (IC3ReadValue2 - IC3ReadValue1);
}
else
{
Capture = ((0xFFFF - IC3ReadValue1) + IC3ReadValue2);
}
/* Frequency computation */
TIM3Freq = (uint32_t) SystemCoreClock / Capture;
CaptureNumber = 0;


TIM3_Configuration_Rising();

}
}
}

Т. е. первый раз вход в прерывание по возростанию уровня.
В прерывании настраиваю таймер на прерывание по спаду уровня.
Вычисляю разницу, т. е. длительность импульса
Восстанавливаю на прерывание по возростанию уровня.
Помогите сделать правильно, а то уж очень коряво получается.

Последний раз редактировалось anton_1000; 25.08.2012 в 23:52.
anton_1000 вне форума  
Непрочитано 26.08.2012, 00:32  
Alex9797
Почётный гражданин KAZUS.RUN
 
Аватар для Alex9797
 
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,548
Сказал спасибо: 5,035
Сказали Спасибо 10,606 раз(а) в 3,594 сообщении(ях)
Alex9797 на пути к лучшему
По умолчанию Re: STM32 измеренние длительности импульса

Сообщение от Easyrider83 Посмотреть сообщение
Мы их там тоннами скупали. Зачем только - не понятно. У меня пока лежат без дела.
А я покупал парковочные системы для блондинок. В комплект входит четыре ультразвуковых датчика. Их использовал в качестве датчиков расстояния. Высокой точности от них не добьешься, да мне и не требовалось. Надо было оснастить кранбалки в цеху, чтобы они не ударились друг о друга. Расстояние полметра-метр эти датчики спокойно простреливают.

Кстати, уровень воды в баке ультразвуковыми датчиками мерять - неблагодарное занятие. У воды есть нехорошее свойство - при колебаниях температуры покрывать капельками росы поверхность датчика. Это его сильно сбивает с толку, а часто и вообще парализует. Пробовали делать продувку сухим воздухом. Но даже слабый поток воздуха приводит к большим погрешностям измерения расстояния. Да и воздуха сухого не напасешься. Пробовали подогревать датчик, выше температуры росы. Результат положительный, но затраты не стоили того. Кончилось тем, что отказались от него, и поставили датчик давления.
Alex9797 вне форума  
Непрочитано 26.08.2012, 01:51  
Impartial
Прописка
 
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
Impartial на пути к лучшему
По умолчанию Re: STM32 измеренние длительности импульса

Сообщение от anton_1000 Посмотреть сообщение
Помогите сделать правильно, а то уж очень коряво получается.
Используйте gated mode. И лучше для измерения длительности подходит 2й таймер.
Impartial вне форума  
Непрочитано 26.08.2012, 08:30  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: STM32 измеренние длительности импульса

Сообщение от anton_1000 Посмотреть сообщение
Пишу программу, однако упёрся в механизм измерения длительности приходящего импульса. Использую таймер 3 модуль захвата. Имею две процедуры настройки таймера на прерывания по возрастанию и убыванию уровня.

Помогите сделать правильно, а то уж очень коряво получается.
А что такое "правильно? Кто эти правила устанавливал? Если программа, написанная "неправильно" делает все точно так же, как и написанная "правильно", то в чем же разница? Да, и уточните, что значит "коряво". Термин непонятный. "Не работает" или "некрасиво написано" или "буквы скачут"

Можно попробовать так:
Код:
void TIM3_IRQHandler(void)
{ 
  static Phase = 0;
  if(TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET) 
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
    if( !Phase )
    {
      IC3ReadValue1 = TIM_GetCapture2(TIM3); // Make it volatile
      Phase = 1;
      TIM3_Configuration_Falling();
    }
    else if( Phase )
    {
      IC3ReadValue2 = TIM_GetCapture2(TIM3); // The same 
      TIM3_Configuration_Rising();
      DataReadyFlag = 1;
      Phase = 0;
    }
  }
}
// В теле программы
  if( DataReadyFlag )
    {
       // Все ваши вычисления здесь
       DataReadyFlag = 0;
    }
По тексту. Не делайте вычислений в теле обработчика прерываний. В нужной фазе (захват по спаду) поднимайте флаг готовности замеров, а в теле программы по установленному флагу делайте вычисления и сбрасывайте флаг. Надо стремится всегда и во всем обработчики прерываний делать максимально короткими.
Избегайте из обработчиков вызывать внешние функции, пусть даже очень короткие. Неизвестно, сколько дополнительно стека уйдет на ненужное сохранение контента. Да и потери времени на вызовы и возвраты тоже могут быть лишними.
Во избежание неприятностей рекомендуют переменные, модифицируемые в прерываниях, определять с квалификатором volatile. Кто его знает, на каком уровне оптимизации работает ваш компилятор.
ЗЫ Обрамлять коды лучше тегами CODE, чем Italic. Выделять фрагменты лучше тегами Bold, т.к. подчеркивание в тексте путает с ссылкой.
__________________
С уважением,
Vic / ut1wpr

Последний раз редактировалось ut1wpr; 26.08.2012 в 08:35.
ut1wpr вне форума  
Сказали "Спасибо" ut1wpr
Alex9797 (26.08.2012)
Непрочитано 26.08.2012, 10:09  
anton_1000
Прописка
 
Регистрация: 31.08.2008
Сообщений: 117
Сказал спасибо: 4
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
anton_1000 на пути к лучшему
По умолчанию Re: STM32 измеренние длительности импульса

Можно по подробнее про gated mode. А "коряво" это значит есть такое чувство, что можно написать код более оптимальнее и использовать все возможности "железа". Наверняка создатели СТМ32 продумали механизм измерения длительности импульса. Вот нашёл такое:
Код:
void init_timer(void)
{
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  TIM_TimeBaseInitTypeDef timer_base;
  TIM_TimeBaseStructInit(&timer_base);
  timer_base.TIM_Prescaler = 24000 - 1;
  TIM_TimeBaseInit(TIM3, &timer_base);

  TIM_ICInitTypeDef timer_ic;
  timer_ic.TIM_Channel = TIM_Channel_1;
  timer_ic.TIM_ICPolarity = TIM_ICPolarity_Rising;
  timer_ic.TIM_ICSelection = TIM_ICSelection_DirectTI;
  timer_ic.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  timer_ic.TIM_ICFilter = 0;

  /* Эта функция настроит канал 1 для захвата периода,
     а канал 2 - для захвата заполнения. */
  TIM_PWMIConfig(TIM3, &timer_ic);
  /* Выбираем источник для триггера: вход 1 (PA6) */
  TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);
  /* По событию от триггера счётчик будет сбрасываться. */
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
  /* Включаем события от триггера */
  TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);

  TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
  TIM_Cmd(TIM3, ENABLE);
  NVIC_EnableIRQ(TIM3_IRQn);
}

void TIM3_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
    NVIC_DisableIRQ(TIM3_IRQn);

    /* А вот и параметры ШИМ, захваченные с каналов 1 и 2 */
    period_capture = TIM_GetCapture1(TIM3);
    duty_cycle_capture = TIM_GetCapture2(TIM3);

    NVIC_EnableIRQ(TIM3_IRQn);

    if (!capture_is_first)
      capture_is_ready = 1;

    capture_is_first = 0;

    if (TIM_GetFlagStatus(TIM3, TIM_FLAG_CC1OF) != RESET)
    {
      TIM_ClearFlag(TIM3, TIM_FLAG_CC1OF);
      // ...
    }
  }
}
anton_1000 вне форума  
Непрочитано 26.08.2012, 13:45  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: STM32 измеренние длительности импульса

Сообщение от anton_1000 Посмотреть сообщение
Можно по подробнее про gated mode. А "коряво" это значит есть такое чувство, что можно написать код более оптимальнее и использовать все возможности "железа". Наверняка создатели СТМ32 продумали механизм измерения длительности импульса. Вот нашёл такое:
Код:
[skip]
Так в чем вопрос? Там же все написано.
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ограничитель длительности импульса Pajatel Микроконтроллеры, АЦП, память и т.д 161 05.04.2012 00:35
ШИМ управление от длительности или количества zus_ev TTL и CMOS логика 14 12.02.2011 22:09
Реализация селектора импульсов по длительности. IZEVS TTL и CMOS логика 6 06.02.2010 22:44
Измерение длительности импульса fawkes Микроконтроллеры, АЦП, память и т.д 16 09.11.2008 16:41
[Решено] способы определения длительности импульса waterfox Измерительное оборудование 1 14.06.2005 23:57


Часовой пояс GMT +4, время: 07:48.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.