реклама на сайте
подробности

 
 
> Ультразвуковой датчик и STM32f4-Discovery, не получается настроить one pulse mode
peroid
сообщение Jun 14 2015, 20:04
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 6-05-15
Пользователь №: 86 555



Всем доброго времени суток.

Пытаюсь прикрутить к STM32f4-Discovery ультразвуковой дальномер US-015.
Как я понял, нужно подать на ножку датчика импульс длиной 10 микросекунд, а потом посчитать ширину эха.
Думаю, что решение через задержку в главном цикле не совсем правильно, поэтому пытаюсь прикрутить все это аппаратно.
Как вариант решения, решил использовать режим одновибратора ТIM_SelectOnePulseMode(TIM9, TIM_OPMode_Single), но не могу понять как перезапустить импульс заново.
Перезапускать его хочу его из TIM1_BRK_TIM9_IRQHandler, после того, как произойдет считывание ширины эха.

Помогите пожалуйста подкостылить код, дабы запускать импульс по мере необходимости smile3046.gif
P.S. Длительность импульса задаю из главного цикла командой TIM_SetCompare1(TIM9, length);

Вот настройки GPIO и TIM9:

CODE

#include "UltraSonic_timer_ini.h"

int capture=0;

void UltraSonic_init(void)
{
GPIO_InitTypeDef UltraSonic_GPIO_init;
TIM_TimeBaseInitTypeDef UltraSonic_TIM_BASE_Settings;
TIM_OCInitTypeDef UltraSonic_TIM_OC_Settings;
TIM_ICInitTypeDef UltraSonic_TIM_IC_Settings;

//TAKTIRUEM
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE);


UltraSonic_GPIO_init.GPIO_Mode=GPIO_Mode_AF;
UltraSonic_GPIO_init.GPIO_OType=GPIO_OType_PP;
UltraSonic_GPIO_init.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6;
UltraSonic_GPIO_init.GPIO_PuPd=GPIO_PuPd_DOWN;
UltraSonic_GPIO_init.GPIO_Speed=GPIO_Low_Speed;

GPIO_Init(GPIOE, &UltraSonic_GPIO_init);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource5, GPIO_AF_TIM9);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_TIM9);



UltraSonic_TIM_BASE_Settings.TIM_ClockDivision = TIM_CKD_DIV1;
UltraSonic_TIM_BASE_Settings.TIM_CounterMode = TIM_CounterMode_Up;
UltraSonic_TIM_BASE_Settings.TIM_Period = 1000;
UltraSonic_TIM_BASE_Settings.TIM_Prescaler = 167;
UltraSonic_TIM_BASE_Settings.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM9, &UltraSonic_TIM_BASE_Settings);

UltraSonic_TIM_OC_Settings.TIM_OCIdleState = TIM_OCIdleState_Reset;
UltraSonic_TIM_OC_Settings.TIM_OCMode = TIM_OCMode_PWM1;
UltraSonic_TIM_OC_Settings.TIM_OCPolarity = TIM_OCPolarity_High;
UltraSonic_TIM_OC_Settings.TIM_OutputState = TIM_OutputState_Enable;
UltraSonic_TIM_OC_Settings.TIM_Pulse = 10;

TIM_OC1Init(TIM9, &UltraSonic_TIM_OC_Settings);

UltraSonic_TIM_IC_Settings.TIM_Channel = TIM_Channel_2; //Ispolzuem 2y kanal TIMER 9
UltraSonic_TIM_IC_Settings.TIM_ICFilter = 2; //Ne filtruem nichego
UltraSonic_TIM_IC_Settings.TIM_ICPolarity = TIM_ICPolarity_Rising; //Schitaem po narastauschemu frontu
UltraSonic_TIM_IC_Settings.TIM_ICPrescaler = TIM_ICPSC_DIV1; //Schitaem kajdiy impuls
UltraSonic_TIM_IC_Settings.TIM_ICSelection = TIM_ICSelection_DirectTI; //Napryamuiu so vhoda!!!

TIM_ICInit(TIM9, &UltraSonic_TIM_IC_Settings);


TIM_ITConfig(TIM9, TIM_IT_CC2, ENABLE);

TIM_Cmd(TIM9, ENABLE);

TIM_SelectOnePulseMode(TIM9, TIM_OPMode_Single);


NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn);
}

void TIM1_BRK_TIM9_IRQHandler(void)
{
if (TIM_GetITStatus(TIM9, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM9, TIM_IT_CC2);

capture = TIM_GetCapture2(TIM9);

TIM_ClearFlag(TIM9,TIM_FLAG_Update);
}
}


Спасибо.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 21:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01369 секунд с 7
ELECTRONIX ©2004-2016