Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-май-21 08:26

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Измерение длительности импульса
СообщениеДобавлено: 2018-май-14 16:06 
Не в сети

Зарегистрирован: 2016-июн-21 21:35
Сообщения: 15
Доброго времени суток. Подскажите или приведите пример как измерить длительность импульса при помощи таймера. Timer 1 ch 2


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-май-14 16:36 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 96
Откуда: ПКК "Миландр"
Пример для 1986ВЕ91Т, но подход аналогичный:
https://github.com/StartMilandr/6.x-DMA ... A_TimerCAP

можно проще, без DMA - настроить канал таймера на захват, дождаться прерывания от захвата и считать регистр CCR.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-май-15 09:03 
Не в сети

Зарегистрирован: 2016-июн-21 21:35
Сообщения: 15
Код:
PORT_InitStructure.PORT_Pin = ( PORT_Pin_4 );
   PORT_InitStructure.PORT_MODE    = PORT_MODE_DIGITAL;
   PORT_InitStructure.PORT_FUNC    = PORT_FUNC_ALTER;
   PORT_Init(MDR_PORTE, &PORT_InitStructure);
   

   TIMER_CntStructInit(&TimerInitStruct);
   TimerInitStruct.TIMER_Period     = 0xFFFF;  //  Max period
   
   RST_CLK_PCLKcmd (RST_CLK_PCLK_TIMER1, ENABLE);
  TIMER_DeInit (MDR_TIMER1);
  TIMER_BRGInit (MDR_TIMER1, TIMER_HCLKdiv1);
  TIMER_CntInit (MDR_TIMER1, &TimerInitStruct);
   
   TimerChanCfg.TIMER_CH_Number = TIMER_CHANNEL2;
   TimerChanCfg.TIMER_CH_Mode = TIMER_CH_MODE_CAPTURE;
   TIMER_ChnInit(MDR_TIMER1, &TimerChanCfg);

не работает. что делаю не так?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-май-15 09:46 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 96
Откуда: ПКК "Миландр"
При наличии рабочего примера, Вам необходимо самостоятельно разобраться в своем коде.

По отрывку не вижу - настроен ли вывод GPIO как вход, где настройка вывода канала TIMER_ChnOutInitTypeDef?
Посмотрите статью по данному примеру - https://startmilandr.ru/doku.php/prog:dma:dma_timercap

_________________
Отдел технической поддержки support@milandr.ru


Последний раз редактировалось Vasiliy 2018-май-15 12:43, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-май-15 10:26 
Не в сети

Зарегистрирован: 2016-июн-21 21:35
Сообщения: 15
не понимаю зачем мне выход (out)? мне нужно померить длительность внешнего сигнала. Мне не нравится пример который https://github.com/StartMilandr, и так путаница + разные названия функций.
Настройка порта PE4 как TMR1_CH2
Код:
   PORT_InitStructure.PORT_Pin = ( PORT_Pin_4 );
   PORT_InitStructure.PORT_MODE    = PORT_MODE_DIGITAL;
   PORT_InitStructure.PORT_OE = PORT_OE_IN;
   PORT_InitStructure.PORT_FUNC    = PORT_FUNC_ALTER;
   PORT_Init(MDR_PORTE, &PORT_InitStructure);

Тут вроде как настройка таймера
Код:
TIMER_CntStructInit(&TimerInitStruct);
   TimerInitStruct.TIMER_Period     = 0xFFFF;
   
   RST_CLK_PCLKcmd (RST_CLK_PCLK_TIMER1, ENABLE);
  TIMER_DeInit (MDR_TIMER1);
  TIMER_BRGInit (MDR_TIMER1, TIMER_HCLKdiv1);
  TIMER_CntInit (MDR_TIMER1, &TimerInitStruct);
   
   TimerChanCfg.TIMER_CH_Number = TIMER_CHANNEL2;
   TimerChanCfg.TIMER_CH_Mode = TIMER_CH_MODE_CAPTURE;
   TIMER_ChnInit(MDR_TIMER1, &TimerChanCfg);
   
   NVIC_EnableIRQ(TIMER1_IRQn);


Весь код
Код:
PORT_InitTypeDef PORT_InitStructure;
   TIMER_CntInitTypeDef    TimerInitStruct;
  TIMER_ChnInitTypeDef    TimerChanCfg;
   
   RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTB | RST_CLK_PCLK_PORTA | RST_CLK_PCLK_PORTC | RST_CLK_PCLK_PORTD | RST_CLK_PCLK_PORTE, ENABLE);
   RST_CLK_PCLKcmd(RST_CLK_PCLK_TIMER1, ENABLE);
   
   
   PORT_InitStructure.PORT_Pin = ( PORT_Pin_10 );
   PORT_InitStructure.PORT_MODE    = PORT_MODE_DIGITAL;
   PORT_InitStructure.PORT_OE     = PORT_OE_OUT;
   PORT_InitStructure.PORT_SPEED    = PORT_SPEED_MAXFAST;
   PORT_InitStructure.PORT_FUNC    = PORT_FUNC_PORT;
   PORT_InitStructure.PORT_PD       = PORT_PD_DRIVER;
   PORT_Init(MDR_PORTB, &PORT_InitStructure);
   
   
   PORT_InitStructure.PORT_Pin = ( PORT_Pin_4 );
   PORT_InitStructure.PORT_MODE    = PORT_MODE_DIGITAL;
   PORT_InitStructure.PORT_OE = PORT_OE_IN;
   PORT_InitStructure.PORT_FUNC    = PORT_FUNC_MAIN;
   PORT_Init(MDR_PORTE, &PORT_InitStructure);
   

   TIMER_CntStructInit(&TimerInitStruct);
   TimerInitStruct.TIMER_Period     = 0xFFFF;  //  Max period
   
   RST_CLK_PCLKcmd (RST_CLK_PCLK_TIMER1, ENABLE);
  TIMER_DeInit (MDR_TIMER1);
  TIMER_BRGInit (MDR_TIMER1, TIMER_HCLKdiv1);
  TIMER_CntInit (MDR_TIMER1, &TimerInitStruct);
   
   TimerChanCfg.TIMER_CH_Number = TIMER_CHANNEL2;
   TimerChanCfg.TIMER_CH_Mode = TIMER_CH_MODE_CAPTURE;
   TIMER_ChnInit(MDR_TIMER1, &TimerChanCfg);
   
   NVIC_EnableIRQ(TIMER1_IRQn);
}

void TIMER1_IRQHandler(void) {
   i++;
}



Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-май-17 01:09 
Не в сети

Зарегистрирован: 2016-окт-14 19:39
Сообщения: 43
Откуда: СПБ
Настройка для 1986ВЕ1Т timer4 ch1 (32-битный) захват по переднему и заднему фронтам. Извиняюсь, что функции и регистры вперемешку, не причесал еще.
Код:
  TIMER_CntInitTypeDef sTIM_CntInit;

  RST_CLK_PCLKcmd(RST_CLK_PCLK_TIMER4, ENABLE);
   
  TIMER_BRGInit(MDR_TIMER4, TIMER_HCLKdiv1); // см. errata

  TIMER_DeInit(MDR_TIMER4);
   
  TIMER_CntStructInit(&sTIM_CntInit);

  sTIM_CntInit.TIMER_Prescaler                = 1 - 1; // см. errata
  sTIM_CntInit.TIMER_Period                   = UINT32_MAX;
  sTIM_CntInit.TIMER_CounterMode              = TIMER_CntMode_ClkFixedDir;
  sTIM_CntInit.TIMER_CounterDirection         = TIMER_CntDir_Up;
  sTIM_CntInit.TIMER_EventSource              = TIMER_EvSrc_None;
  TIMER_CntInit(MDR_TIMER4, &sTIM_CntInit);

  MDR_TIMER4->CNT = 0;

  MDR_TIMER4->CH1_CNTRL = TIMER_CH_MODE_CAPTURE;
  MDR_TIMER4->CH1_CNTRL1 = 0;
  MDR_TIMER4->CH1_CNTRL2 = TIMER_CH_CNTRL2_CCR1_EN |      TIMER_CH_CNTRL2_CHSEL1_NEG_EDGE;

  TIMER_ITConfig(MDR_TIMER4,
      TIMER_STATUS_CCR_CAP_CH1 |
      TIMER_STATUS_CCR_CAP1_CH1
      ,   ENABLE);
  MDR_TIMER4->STATUS = 0;
   
  NVIC_EnableIRQ(TIMER4_IRQn);

  TIMER_Cmd(MDR_TIMER4, ENABLE);


Прерывание
Код:
volatile uint32_t ch1_ccr_value;
volatile uint32_t old_ch1_ccr_value;
volatile uint32_t ch1_ccr1_value;
volatile uint32_t pulse_period;
volatile uint32_t pulse_duration;

void TIMER4_IRQHandler(void)
{
   uint32_t timer_stat_reg;

   timer_stat_reg = MDR_TIMER4->STATUS;
   MDR_TIMER4->STATUS  = 0;

   if((timer_stat_reg & TIMER_STATUS_CCR_CAP_CH1) != 0)
   {
      old_ch1_ccr_value = ch1_ccr_value;
                // захват по переднему фронту
      ch1_ccr_value = MDR_TIMER4->CCR1; // see errata
                // период импульсов
      pulse_period = ch1_ccr_value - old_ch1_ccr_value;
   };

   if((timer_stat_reg & TIMER_STATUS_CCR_CAP1_CH1) != 0)
   {
                // захват по заднему фронту
      ch1_ccr1_value = MDR_TIMER4->CCR11; // see errata
                // длительность импульса
      pulse_duration = (ch1_ccr1_value - ch1_ccr_value) & UINT32_MAX;
   };
   return;
}


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


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

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB