Skocz do zawartości

[STM32f103] HC-SR04 HAL


mati1221

Pomocna odpowiedź

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;
}

 

Edytowano przez mati1221
  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.