15.10.2013, 23:08
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 117
Сказал спасибо: 4
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Измерение длительности импульса STM32
Хочу определить длительность импульса. Использую пример standart peripherial librery - PWM Input. Каким образом настроить таймер или в каком месте присваивать TMRxCNT = 0, чтобы по переднему фронту импульса счётчик времени начинал считать с НУЛЯ?
Код:
|
/* НАСТРОЙКА ТАЙМЕРА*/
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_PWMIConfig(TIM3, &TIM_ICInitStructure);
/* Select the TIM3 Input Trigger: TI2FP2 */
TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);
/* Select the slave Mode: Reset Mode */
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
/*Enable the Master/Slave Mode */
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
/* TIM enable counter */
TIM_Cmd(TIM3, ENABLE);
/* Enable the CC2 Interrupt Request */
TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
/*ОБРАБОТЧИК ПРЕРЫВАНИЯ*/
void TIM3_IRQHandler(void)
{
/* Clear TIM3 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
/* Get the Input Capture value */
IC2Value = TIM_GetCapture2(TIM3);
if (IC2Value != 0)
{
/* Duty cycle computation */
/* DutyCycle = (TIM_GetCapture1(TIM3) * 100) / IC2Value; */
DutyCycle = TIM_GetCapture1(TIM3) - IC2Value;
/* Frequency computation */
Frequency = SystemCoreClock / IC2Value;
}
else
{
DutyCycle = 0;
Frequency = 0;
}
} |
Плата STM32VLДискавери.
Насколько я понимаю длительность импульса в нсек:
DutyCycle * 4.2 нсек (тактовая частота 24 МГц)?
|
|
|
|
16.10.2013, 13:01
|
|
Частый гость
Регистрация: 25.03.2010
Адрес: Voronezh
Сообщений: 35
Сказал спасибо: 0
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: Измерение длительности импульса STM32
Попробуйте использовать вот этот режим:
101: Gated Mode - The counter clock is enabled when the trigger input (TRGI) is high. The counter stops (but is not reset) as soon as the trigger becomes low. Both start and stop of the counter are controlled.
Недостаток подхода - если придет второй импульс - то посчитается суммарная длительность.
Можно также использовать 110: Trigger Mode - этот только стартует таймер. Потом спад импульса нужно будет ловить как то отдельно.
Все эти биты в TIMx slave mode control register (TIMx_SMCR)
|
|
|
|
16.10.2013, 13:10
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Измерение длительности импульса STM32
Ну да, только после TRGI low вызывать DMA и отправлять данные в RAM.
|
|
|
|
16.10.2013, 13:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Измерение длительности импульса STM32
Сообщение от anton_1000
|
DutyCycle = (TIM_GetCapture1(TIM3) * 100) / IC2Value;
|
Это что такое?? 256 должно быть
|
|
|
|
16.10.2013, 14:27
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: Измерение длительности импульса STM32
Сообщение от niXto
|
Это что такое??
|
В процентах, наверное.
Не... 257,5 !
|
|
|
|
16.10.2013, 14:36
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: Измерение длительности импульса STM32
Сообщение от anton_1000
|
Хочу определить длительность импульса. Использую пример standart peripherial librery - PWM Input. Каким образом настроить таймер или в каком месте присваивать TMRxCNT = 0, чтобы по переднему фронту импульса счётчик времени начинал считать с НУЛЯ?
|
Менять полярность по входу, сбрасывать TMRxCNT нет смысла.
Посмотрите в даташите, там всё расписано. Ещё есть AN4013 "STM32F1xx, STM32F2xx, STM32F4xx, STM32L1xx, STM32F30/31/37/38x timer overview".
Цитата:
|
Насколько я понимаю длительность импульса в нсек:
DutyCycle * 4.2 нсек (тактовая частота 24 МГц)?
|
Нет, 41,6666666 нСек.
|
|
|
|
16.10.2013, 14:37
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,568
Сказал спасибо: 5,042
Сказали Спасибо 10,611 раз(а) в 3,604 сообщении(ях)
|
Re: Измерение длительности импульса STM32
Сообщение от niXto
|
Это что такое?? 256 должно быть
|
Может это и есть 256 в десятичной, а записано 100 в 16-ой
|
|
|
|
16.10.2013, 14:44
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: Измерение длительности импульса STM32
Ромашка? Дайте ссыль на новую формулу вычисления процентов!
|
|
|
|
16.10.2013, 15:23
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 117
Сказал спасибо: 4
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Измерение длительности импульса STM32
Сообщение от niXto
|
Это что такое?? 256 должно быть
|
Это значение в процентах от периода, насколько, я понимаю
|
|
|
|
16.10.2013, 16:19
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 117
Сказал спасибо: 4
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Измерение длительности импульса STM32
Сообщение от niXto
|
Это что такое?? 256 должно быть
|
Это значение в процентах от периода, насколько, я понимаю
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:49.
|
|