Skocz do zawartości

mati1221

Użytkownicy
  • Zawartość

    1
  • Rejestracja

  • Ostatnio

Reputacja

1 Neutralna

O mati1221

  • Ranga
    1/10
  1. Witam wszystkich na forum. Od kilku dni posiłkując się starym i nowym kursem STM32F1 staram się przeportować z biblioteki StdPeriph na HAL program obsługujący czujnik HC-SR04, wykorzystujący przerwania i timery ( http://www.avislab.com/blog/stm32-exti/ ). Niestety program zawsze zwraca wartość pomiaru 0. Na 99% problem powoduje nieprawidłowa implementacja timera 3 lub błędnie napisane przerwanie służące do pomiaru długości sygnału Echo. Czy jest ktoś w stanie określić w którym miejscu jest błąd? Mój kod HAL: void sonar_init() { //Timer3 Echo __HAL_RCC_TIM3_CLK_ENABLE(); tim3.Instance = TIM3; tim3.Init.Prescaler = 64 - 1; tim3.Init.CounterMode = TIM_COUNTERMODE_UP; tim3.Init.ClockDivision = 0; tim3.Init.RepetitionCounter = 0; tim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; HAL_TIM_Base_Init(&tim3); HAL_TIM_Base_Start_IT(&tim3); __HAL_RCC_GPIOC_CLK_ENABLE(); //Trigger Pin8 GPIO_InitTypeDef gpio; gpio.Pin = GPIO_PIN_8; gpio.Mode = GPIO_MODE_OUTPUT_PP; gpio.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &gpio); //Echo Pin9 GPIO_InitTypeDef GPIO_InitStruct; gpio.Pin = GPIO_PIN_9; gpio.Mode = GPIO_MODE_AF_PP; gpio.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); } void EXTI9_5_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9); } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == GPIO_PIN_9){ if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_9) != 0) { // Rising __HAL_TIM_SET_COUNTER(&tim3, 0); } if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_9) == 0) { // Falling SonarValue = __HAL_TIM_GET_COUNTER(&tim3); } } } void sonar_start() { //10us TRIG int i; HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_SET); //TRIG ON for(i=0;i<0x6400;i++); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET); //TRIG OFF } unsigned int sonar_get() { unsigned long Sonar; // 354 Sound speed (mm/sec), 64000 - F_CPU, Result = mm Sonar = (354/2) * (unsigned long)SonarValue / (64000 / 64); return (unsigned int)Sonar; }
×
×
  • Utwórz nowe...