Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stm32f4xx.h"
- #include "stm32f4xx_hal.h"
- #include <stdint.h>
- #include "step_utils.h"
- #include <stdio.h>
- #include <string.h>
- /* Попытка подключить сенсор SRF04 - Ultra-Sonic Ranger. !!! код сырой :-) работает глюкавенько !!! */
- #define ERROR_ECHO 36000 // mkS ! If nothing is detected then the SRF04 will lower its echo line anyway after about 36mS
- volatile uint32_t tick = 0;
- volatile uint32_t us = 0; // 1mS =1000 mkS
- volatile float distance=0.0;// Transform pulse time to distance
- //volatile uint32_t NextPuls=0; после прихода эха необходимо подождать 10мС.
- // структуры инициализации портов и их пинов
- GPIO_InitTypeDef GPIOE_Init;
- GPIO_InitTypeDef GPIOD_Init;
- // структуры инициализации портов и их пинов
- GPIO_InitTypeDef GPIOG_Init;
- TIM_HandleTypeDef htim7;// счетчик мкС
- TIM_HandleTypeDef htim9;
- TIM_OC_InitTypeDef sConfigOC; // структура для настройки каналов таймера
- void TimersInit()
- {
- // GP Timer init
- __TIM9_CLK_ENABLE();
- __GPIOE_CLK_ENABLE();
- // PE5 - TIM9_CH1 Подключаем разъем РЕ5 к ножке Trig
- // PE6 - TIM9_CH2
- GPIOE_Init.Pin = GPIO_PIN_5 | GPIO_PIN_6;
- GPIOE_Init.Mode = GPIO_MODE_AF_PP; // альтернативная функция
- GPIOE_Init.Alternate = GPIO_AF3_TIM9; // название альтернативной функции
- GPIOE_Init.Pull = GPIO_NOPULL;
- GPIOE_Init.Speed = GPIO_SPEED_LOW;
- HAL_GPIO_Init(GPIOE, &GPIOE_Init);
- htim9.Instance = TIM9;
- // сервоприводы работают на частоте 50 Гц
- htim9.Init.Prescaler = 168 - 1; // 168 MHz / 168 = 1 MHz
- htim9.Init.Period = 60000 - 1; // 60 ms Интервалы между импульсами 60мс (Отсчет идет от RISING импульса)
- htim9.Init.CounterMode = TIM_COUNTERMODE_UP;
- HAL_TIM_PWM_Init(&htim9);
- sConfigOC.OCMode = TIM_OCMODE_PWM1;
- sConfigOC.Pulse = 10; // микросекунд
- sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
- HAL_TIM_PWM_ConfigChannel(&htim9, &sConfigOC, TIM_CHANNEL_1);
- sConfigOC.OCMode = TIM_OCMODE_PWM2;
- sConfigOC.Pulse = 10; // микросекунд
- sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
- HAL_TIM_PWM_ConfigChannel(&htim9, &sConfigOC, TIM_CHANNEL_2);
- /* счетчик мкС */
- // BASIC Timer init
- __TIM7_CLK_ENABLE();
- htim7.Instance = TIM7;
- htim7.Init.CounterMode = TIM_COUNTERMODE_UP; // считает от 0 вверх
- htim7.Init.Prescaler =84-1; // Предделитель предделитель 8400-1
- htim7.Init.Period = 1000-1; // Период 1mS = 1000mkS
- HAL_TIM_Base_Init(&htim7); // Инициализируем инициализация базового таймера
- HAL_NVIC_EnableIRQ(TIM7_IRQn); // Разрешаем прерывание таймера
- /**/
- }
- void UltrasonicInit() // пытаюсь подключить Ультразвуковой датчик измерения расстояния HC-SR04
- {
- // Включаем питание и тактирование на портах D
- __GPIOD_CLK_ENABLE();
- // (Echo) in Ultrasonic настраиваем на вход РD5 овет в диапазоне от 150мкс до 25мс , если ничего не обнаружил 38мс
- GPIOD_Init.Pin = GPIO_PIN_5;
- GPIOD_Init.Mode = GPIO_MODE_IT_RISING_FALLING; // входной режим GPIO_MODE_IT_RISING_FALLING
- GPIOD_Init.Pull = GPIO_PULLDOWN; //режим когда на пине по умолчанию 0 подаеться, прижимаем к земле
- GPIOD_Init.Speed = GPIO_SPEED_LOW;
- HAL_GPIO_Init(GPIOD, &GPIOD_Init);// инизиализируем порт, передаем структуру
- }
- void LedInit()
- {
- // структуры инициализации портов и их пинов
- GPIO_InitTypeDef GPIOG_Init;
- __GPIOG_CLK_ENABLE();
- // светодиоды настраиваем на выход
- GPIOG_Init.Pin = GPIO_PIN_14 | GPIO_PIN_13; // 13 - зеленый, 14 - красный
- GPIOG_Init.Mode = GPIO_MODE_OUTPUT_PP;
- GPIOG_Init.Pull = GPIO_NOPULL;
- GPIOG_Init.Speed = GPIO_SPEED_LOW;
- HAL_GPIO_Init(GPIOG, &GPIOG_Init); // инизиализируем порт, передаем структуру
- }
- // GetMicroS() Добавляет микросекунды , которые берет с счетчика TIM7->CNT;
- uint32_t GetMicroS()
- {
- return us+TIM7->CNT;
- }
- int main(void)
- {
- TimersInit();
- SystemInit();
- HAL_Init();
- STEP_Init();
- LedInit();
- UltrasonicInit();
- GetMicroS();
- // Говорим нашему контроллеру прерываний (NVIC), что мы хотим обрабатывать прерывание EXTI0_IRQn
- HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
- HAL_TIM_Base_Start_IT(&htim7); // запускаем таймер в режиме прерываний _IT -указывает что идет обращение к прерыванию
- HAL_TIM_PWM_Start(&htim9, TIM_CHANNEL_1); // запускаем генерацию ШИМ сигнала на 1-м канале
- HAL_TIM_PWM_Start(&htim9, TIM_CHANNEL_2); // ... на 2-м канале
- while (1)
- {
- HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13);
- char buf[50];
- sprintf(buf, "distance %.1lf mks",distance);
- STEP_Println(buf);
- HAL_Delay(1000);
- }
- }
- // название обработчика прерывания аналогично прерыванию (EXTI0_IRQn) только вместо "n" - "Handler" Echo ---> РD5
- void EXTI9_5_IRQHandler(void)
- {
- if ( tick==0 )//
- {
- tick = GetMicroS();
- // NextPuls=0;
- }
- else
- {
- distance= (GetMicroS() - tick)/58.0; // (HAL_GetTick() - tick)uS/58 = X cm// Transform pulse time to distance
- if ((GetMicroS() - tick)>=ERROR_ECHO)
- {
- distance=0000.0; //If nothing is detected
- }
- NextPuls=GetMicroS()+10000;
- tick =0;
- }
- // Очищаем флаги прерывания. Говорим, что мы его обработали.
- HAL_NVIC_ClearPendingIRQ(EXTI9_5_IRQn);
- // нужно для работы нашей библиотеки HAL
- HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
- }
- // Обработчик прерывания таймера считает 1мС = 1000 мкС , задается в htim7.Init.Period = 1000-1; // мкс
- void TIM7_IRQHandler()
- {
- us +=1000;
- HAL_TIM_IRQHandler(&htim7); // нужно для работы библиотеки HAL
- }
- // Обработчик прерывания от системного таймера
- void SysTick_Handler()
- {
- HAL_IncTick();
- HAL_SYSTICK_IRQHandler();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement