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

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

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

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

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

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


 
Опции темы
Непрочитано 07.02.2016, 16:17  
Alex_golubev
Прописка
 
Регистрация: 07.02.2016
Сообщений: 139
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
Alex_golubev на пути к лучшему
По умолчанию Метод прямого отсчета времени

Привет!
Пишу диплом на тему ультразвуковой время пролетный расходомер. Суть данного метода в измерение времени пробега ультразвуковой волны по потоку и против. И исходя из этого получение скорости потока жидкости. Вроде как в теории разобрался и все кажется простым но нужно реализовать данный прибор в железе. Для этого выбрал stm32f429i-disco. Передатчик собрал на комплементарной паре поставил оу на приемник все работает. Но встала проблема измерения времени пробега между передатчиком и приемником. Решил запускать программно счетчик tim9 в момент передачи сигнала и по приему сигнала записывать число то которого досчитал счетчик в массив.
В вобщем логика программы:
1. Формирую сигнал на передатчики и обнуляю счетчик.
2. Формирую нулевое время в течение которого игнорирую все принимаемые сигналы.
3.После ставлю флаг приемки
4. принимаю по внешнему прерыванию
Основная проблема разное время выхода на вектор прерывания хорошо видно на видио.
Вот видио прерывания https://yadi.sk/i/VW01ResxoPxzx.
Вот не знаю что делать может поменять метод?
Вот код:
Код:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
  counter_time ++;
  switch (counter_time)
  {
  case 1: //HAL_NVIC_DisableIRQ(EXTI2_IRQn); 
    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET);
            TIM9-›CNT = 0x0000; 
              HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); 
              break;
  case 2:  /*EXTI-›PR |= EXTI_PR_PR1; HAL_NVIC_EnableIRQ(EXTI2_IRQn);*/ HAL_ADCEx_InjectedStop(&hadc3); flag_1 = 1; break; 
  case 3: /*EXTI-›PR |= EXTI_PR_PR1;*/  HAL_ADCEx_InjectedStart(&hadc3); break; 
  case 4:counter_time =0; break; 
  }
  
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
  if(flag_1){
    counter_measurement++;
    if(counter_measurement ‹= 100){
    measurement_time += TIM9-›CNT; 
    }
  else {
  counter_measurement=0;
 
  *(double*) ( array_measurement_time + 8*i) = measurement_time/a;
  i++;
  measurement_time=0; 
  }
  flag_1=0;
  flag_2=1;  
  }
  
  if(i ›= 15000) {
    i=0;   
  }
  
  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_14, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_14, GPIO_PIN_RESET);
  EXTI-›PR |= EXTI_PR_PR1;
}

void MX_TIM1_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 178;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 23;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  HAL_TIM_Base_Init(&htim1);

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);

}

void MX_TIM9_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;

  htim9.Instance = TIM9;
  htim9.Init.Prescaler = 0;
  htim9.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim9.Init.Period = 0xFFFF;
  htim9.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_Base_Init(&htim9);

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim9, &sClockSourceConfig);

}


void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __GPIOE_CLK_ENABLE();
  __GPIOC_CLK_ENABLE();
  __GPIOF_CLK_ENABLE();
  __GPIOH_CLK_ENABLE();
  __GPIOA_CLK_ENABLE();
  __GPIOB_CLK_ENABLE();
  __GPIOG_CLK_ENABLE();
  __GPIOD_CLK_ENABLE();

  /*Configure GPIO pin : PE2 */
  GPIO_InitStruct.Pin = GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /*Configure GPIO pin : PE3 */
  GPIO_InitStruct.Pin = GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /*Configure GPIO pins : PE4 PE5 */
  GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /*Configure GPIO pins : NCS_MEMS_SPI_Pin CSX_Pin OTG_FS_PSO_Pin */
  GPIO_InitStruct.Pin = NCS_MEMS_SPI_Pin|CSX_Pin|OTG_FS_PSO_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : B1_Pin */
  GPIO_InitStruct.Pin = B1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pins : MEMS_INT1_Pin TP_INT1_Pin */
  GPIO_InitStruct.Pin = MEMS_INT1_Pin|TP_INT1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : ACP_RST_Pin */
  GPIO_InitStruct.Pin = ACP_RST_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(ACP_RST_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : OTG_FS_OC_Pin */
  GPIO_InitStruct.Pin = OTG_FS_OC_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(OTG_FS_OC_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : BOOT1_Pin */
  GPIO_InitStruct.Pin = BOOT1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(BOOT1_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : TE_Pin */
  GPIO_InitStruct.Pin = TE_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(TE_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pins : RDX_Pin WRX_DCX_Pin */
  GPIO_InitStruct.Pin = RDX_Pin|WRX_DCX_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /*Configure GPIO pins : LD3_Pin LD4_Pin */
  GPIO_InitStruct.Pin = LD3_Pin|LD4_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  /*Configure GPIO pin : PB7 */
  GPIO_InitStruct.Pin = GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0);
  HAL_NVIC_EnableIRQ(EXTI0_IRQn);

  HAL_NVIC_SetPriority(EXTI2_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI2_IRQn);

}
Реклама:
Alex_golubev вне форума  
Непрочитано 07.02.2016, 16:41  
Alex9797
Почётный гражданин KAZUS.RU
 
Аватар для Alex9797
 
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,565
Сказал спасибо: 5,041
Сказали Спасибо 10,615 раз(а) в 3,604 сообщении(ях)
Alex9797 на пути к лучшему
По умолчанию Re: Метод прямого отчета времени

Останавливать счет таймера надо аппаратно. На протяжении нулевого времени блокировать эту схему отдельной ножкой процессора, чтобы избежать преждевременного срабатывания. А когда нулевое время истечет, снимаете блокировку, и ожидаете срабатывания. При этом можно генерировать прерывание. А можно и по опросу, торопиться особо ведь некуда, таймер остановлен.
Очевидно, что эта внешняя схема останова таймера должна содержать в своем составе триггер.
Теперь Ваш ход. время пошло.
Alex9797 вне форума  
Непрочитано 07.02.2016, 17:16  
Alex_golubev
Прописка
 
Регистрация: 07.02.2016
Сообщений: 139
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
Alex_golubev на пути к лучшему
По умолчанию Re: Метод прямого отчета времени

Так вот в этом и проблема аппаратно его остановить.
Вот у stm32 у таймера tim9 есть входной захват. Я вот все думаю может его как нибудь задействовать.
Вот если настроить ножку pf6 на входной захват и измерение длительности сигнала. Допустим любую свободную ножку настраиваем на передатчик и в момент когда устанавливаем лог. единицу (на свободной ножки) запускается передатчик и начинается отчет. После ждем прихода сигнала с приемника таймер tim9 останавливается и вызывает прерывание после считываем число до которого досчитал. И да забыл формируем авто зеро еще одной ногой. Это получается ножка pf6 плюс любая свободная (пусть будет pf5) будут соединены параллельно. Чета как-то плохо. А можно в режиме захвата ножку pf6 использовать и как передатчик и сразу запускать таймер tim9?
Alex_golubev вне форума  
Непрочитано 07.02.2016, 17:46  
индюк
Заблокирован
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,715
Сказал спасибо: 189
Сказали Спасибо 3,199 раз(а) в 2,074 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: Метод прямого отчета времени

аа, ну опять эти веб-программисты. опять проц на частоте 250 мгц работает как Z80, опять вместо 10 строчек 3 листа кода.....
индюк вне форума  
Непрочитано 07.02.2016, 18:10  
Alex_golubev
Прописка
 
Регистрация: 07.02.2016
Сообщений: 139
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
Alex_golubev на пути к лучшему
По умолчанию Re: Метод прямого отчета времени

Я не веб программист. stm32f429 настроен на частоту 168 МГц, может у тебя z80 и работает на 250 но это только у тебя. И где ты увидал 3 листа кода?
Alex_golubev вне форума  
Непрочитано 07.02.2016, 18:29  
индюк
Заблокирован
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,715
Сказал спасибо: 189
Сказали Спасибо 3,199 раз(а) в 2,074 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: Метод прямого отчета времени

смеяться после слова лопата
кстати к чему такой мощный проц??? эту задачу ваще на логике сделать можно) (отчасти шучу конечно)

Последний раз редактировалось индюк; 07.02.2016 в 18:32.
индюк вне форума  
Непрочитано 07.02.2016, 18:34  
Alex9797
Почётный гражданин KAZUS.RU
 
Аватар для Alex9797
 
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,565
Сказал спасибо: 5,041
Сказали Спасибо 10,615 раз(а) в 3,604 сообщении(ях)
Alex9797 на пути к лучшему
По умолчанию Re: Метод прямого отчета времени

Alex_golubev, а хамить тут не надо. Повода для этого никто тебе не давал.
Alex9797 вне форума  
Непрочитано 07.02.2016, 18:41  
Alex_golubev
Прописка
 
Регистрация: 07.02.2016
Сообщений: 139
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
Alex_golubev на пути к лучшему
По умолчанию Re: Метод прямого отчета времени

Да не шибко та он и мощный. На нем будет еще реализована система вывода на tft панель usb и еще куча вкусностей точнее уже реализована. А вот с таймером у меня случился застой не знаю как правильно сгенерировать сигнал стоп. На логике уже делал но физика процесса оказалась куда сложнее. В среде возникают помимо полезного сигнала еще и ложные такие как отраженный и сигнал идущий по корпусу. Вот и получается, что в режиме автогенератора синхронизируеться на помеху. Нужно везде делать автозеро.
Alex_golubev вне форума  
Непрочитано 07.02.2016, 18:44  
Alex9797
Почётный гражданин KAZUS.RU
 
Аватар для Alex9797
 
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,565
Сказал спасибо: 5,041
Сказали Спасибо 10,615 раз(а) в 3,604 сообщении(ях)
Alex9797 на пути к лучшему
По умолчанию Re: Метод прямого отчета времени

Сообщение от Alex_golubev Посмотреть сообщение
не знаю как правильно сгенерировать сигнал стоп. На логике уже делал но физика процесса оказалась куда сложнее.
Схему на логике в студию. И в чем сложности физики процесса - туда же.
Alex9797 вне форума  
Непрочитано 07.02.2016, 18:45  
Alex_golubev
Прописка
 
Регистрация: 07.02.2016
Сообщений: 139
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
Alex_golubev на пути к лучшему
По умолчанию Re: Метод прямого отчета времени

Извиняюсь если обидел. Вот решил сделать на внешнем прерывании а оно работает с ошибкой. Ошибка маленькая примерно 1 мкс но для меня это критично. Вот решил у знающих людей спросить как быть.
Alex_golubev вне форума  
Сказали "Спасибо" Alex_golubev
mikesmith (13.02.2016)
 

Закладки
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой лучший симулятор для релейных схем? Scadauser Proteus, KiCAD и другие ECAD 36 31.01.2013 23:06


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot