SHOW:
|
|
- or go back to the newest paste.
| 1 | #include "stm32f4xx.h" | |
| 2 | #include "stm32f4xx_hal.h" | |
| 3 | #include <stdint.h> | |
| 4 | #include "step_utils.h" | |
| 5 | #include <stdio.h> | |
| 6 | #include <string.h> | |
| 7 | ||
| 8 | /* Попытка подключить сенсор SRF04 - Ultra-Sonic Ranger. !!! код сырой :-) работает глюкавенько !!! */ | |
| 9 | #define ERROR_ECHO 36000 // mkS ! If nothing is detected then the SRF04 will lower its echo line anyway after about 36mS | |
| 10 | volatile uint32_t tick = 0; | |
| 11 | volatile uint32_t us = 0; // 1mS =1000 mkS | |
| 12 | volatile float distance=0.0;// Transform pulse time to distance | |
| 13 | - | volatile uint32_t NextPuls=0;// после прихода эха необходимо подождать 10мС. |
| 13 | + | //volatile uint32_t NextPuls=0; после прихода эха необходимо подождать 10мС. |
| 14 | // структуры инициализации портов и их пинов | |
| 15 | GPIO_InitTypeDef GPIOE_Init; | |
| 16 | GPIO_InitTypeDef GPIOD_Init; | |
| 17 | // структуры инициализации портов и их пинов | |
| 18 | GPIO_InitTypeDef GPIOG_Init; | |
| 19 | TIM_HandleTypeDef htim7;// счетчик мкС | |
| 20 | TIM_HandleTypeDef htim9; | |
| 21 | TIM_OC_InitTypeDef sConfigOC; // структура для настройки каналов таймера | |
| 22 | ||
| 23 | ||
| 24 | void TimersInit() | |
| 25 | {
| |
| 26 | // GP Timer init | |
| 27 | __TIM9_CLK_ENABLE(); | |
| 28 | __GPIOE_CLK_ENABLE(); | |
| 29 | ||
| 30 | // PE5 - TIM9_CH1 Подключаем разъем РЕ5 к ножке Trig | |
| 31 | // PE6 - TIM9_CH2 | |
| 32 | GPIOE_Init.Pin = GPIO_PIN_5 | GPIO_PIN_6; | |
| 33 | GPIOE_Init.Mode = GPIO_MODE_AF_PP; // альтернативная функция | |
| 34 | GPIOE_Init.Alternate = GPIO_AF3_TIM9; // название альтернативной функции | |
| 35 | GPIOE_Init.Pull = GPIO_NOPULL; | |
| 36 | GPIOE_Init.Speed = GPIO_SPEED_LOW; | |
| 37 | ||
| 38 | HAL_GPIO_Init(GPIOE, &GPIOE_Init); | |
| 39 | ||
| 40 | htim9.Instance = TIM9; | |
| 41 | // сервоприводы работают на частоте 50 Гц | |
| 42 | htim9.Init.Prescaler = 168 - 1; // 168 MHz / 168 = 1 MHz | |
| 43 | htim9.Init.Period = 60000 - 1; // 60 ms Интервалы между импульсами 60мс (Отсчет идет от RISING импульса) | |
| 44 | htim9.Init.CounterMode = TIM_COUNTERMODE_UP; | |
| 45 | ||
| 46 | HAL_TIM_PWM_Init(&htim9); | |
| 47 | ||
| 48 | sConfigOC.OCMode = TIM_OCMODE_PWM1; | |
| 49 | sConfigOC.Pulse = 10; // микросекунд | |
| 50 | sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; | |
| 51 | HAL_TIM_PWM_ConfigChannel(&htim9, &sConfigOC, TIM_CHANNEL_1); | |
| 52 | ||
| 53 | sConfigOC.OCMode = TIM_OCMODE_PWM2; | |
| 54 | sConfigOC.Pulse = 10; // микросекунд | |
| 55 | sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; | |
| 56 | HAL_TIM_PWM_ConfigChannel(&htim9, &sConfigOC, TIM_CHANNEL_2); | |
| 57 | ||
| 58 | /* счетчик мкС */ | |
| 59 | ||
| 60 | // BASIC Timer init | |
| 61 | __TIM7_CLK_ENABLE(); | |
| 62 | htim7.Instance = TIM7; | |
| 63 | htim7.Init.CounterMode = TIM_COUNTERMODE_UP; // считает от 0 вверх | |
| 64 | htim7.Init.Prescaler =84-1; // Предделитель предделитель 8400-1 | |
| 65 | htim7.Init.Period = 1000-1; // Период 1mS = 1000mkS | |
| 66 | HAL_TIM_Base_Init(&htim7); // Инициализируем инициализация базового таймера | |
| 67 | ||
| 68 | HAL_NVIC_EnableIRQ(TIM7_IRQn); // Разрешаем прерывание таймера | |
| 69 | ||
| 70 | /**/ | |
| 71 | ||
| 72 | } | |
| 73 | void UltrasonicInit() // пытаюсь подключить Ультразвуковой датчик измерения расстояния HC-SR04 | |
| 74 | {
| |
| 75 | // Включаем питание и тактирование на портах D | |
| 76 | __GPIOD_CLK_ENABLE(); | |
| 77 | ||
| 78 | ||
| 79 | // (Echo) in Ultrasonic настраиваем на вход РD5 овет в диапазоне от 150мкс до 25мс , если ничего не обнаружил 38мс | |
| 80 | GPIOD_Init.Pin = GPIO_PIN_5; | |
| 81 | GPIOD_Init.Mode = GPIO_MODE_IT_RISING_FALLING; // входной режим GPIO_MODE_IT_RISING_FALLING | |
| 82 | GPIOD_Init.Pull = GPIO_PULLDOWN; //режим когда на пине по умолчанию 0 подаеться, прижимаем к земле | |
| 83 | GPIOD_Init.Speed = GPIO_SPEED_LOW; | |
| 84 | ||
| 85 | HAL_GPIO_Init(GPIOD, &GPIOD_Init);// инизиализируем порт, передаем структуру | |
| 86 | } | |
| 87 | ||
| 88 | ||
| 89 | void LedInit() | |
| 90 | {
| |
| 91 | // структуры инициализации портов и их пинов | |
| 92 | GPIO_InitTypeDef GPIOG_Init; | |
| 93 | ||
| 94 | __GPIOG_CLK_ENABLE(); | |
| 95 | ||
| 96 | // светодиоды настраиваем на выход | |
| 97 | GPIOG_Init.Pin = GPIO_PIN_14 | GPIO_PIN_13; // 13 - зеленый, 14 - красный | |
| 98 | GPIOG_Init.Mode = GPIO_MODE_OUTPUT_PP; | |
| 99 | GPIOG_Init.Pull = GPIO_NOPULL; | |
| 100 | GPIOG_Init.Speed = GPIO_SPEED_LOW; | |
| 101 | ||
| 102 | HAL_GPIO_Init(GPIOG, &GPIOG_Init); // инизиализируем порт, передаем структуру | |
| 103 | } | |
| 104 | // GetMicroS() Добавляет микросекунды , которые берет с счетчика TIM7->CNT; | |
| 105 | uint32_t GetMicroS() | |
| 106 | {
| |
| 107 | return us+TIM7->CNT; | |
| 108 | } | |
| 109 | ||
| 110 | int main(void) | |
| 111 | {
| |
| 112 | TimersInit(); | |
| 113 | SystemInit(); | |
| 114 | HAL_Init(); | |
| 115 | STEP_Init(); | |
| 116 | LedInit(); | |
| 117 | UltrasonicInit(); | |
| 118 | GetMicroS(); | |
| 119 | ||
| 120 | // Говорим нашему контроллеру прерываний (NVIC), что мы хотим обрабатывать прерывание EXTI0_IRQn | |
| 121 | HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); | |
| 122 | HAL_TIM_Base_Start_IT(&htim7); // запускаем таймер в режиме прерываний _IT -указывает что идет обращение к прерыванию | |
| 123 | HAL_TIM_PWM_Start(&htim9, TIM_CHANNEL_1); // запускаем генерацию ШИМ сигнала на 1-м канале | |
| 124 | HAL_TIM_PWM_Start(&htim9, TIM_CHANNEL_2); // ... на 2-м канале | |
| 125 | ||
| 126 | while (1) | |
| 127 | {
| |
| 128 | HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13); | |
| 129 | char buf[50]; | |
| 130 | sprintf(buf, "distance %.1lf mks",distance); | |
| 131 | STEP_Println(buf); | |
| 132 | HAL_Delay(1000); | |
| 133 | } | |
| 134 | } | |
| 135 | ||
| 136 | ||
| 137 | // название обработчика прерывания аналогично прерыванию (EXTI0_IRQn) только вместо "n" - "Handler" Echo ---> РD5 | |
| 138 | void EXTI9_5_IRQHandler(void) | |
| 139 | {
| |
| 140 | - | if ( tick==0 && NextPuls <= GetMicroS())// |
| 140 | + | if ( tick==0 )// |
| 141 | {
| |
| 142 | tick = GetMicroS(); | |
| 143 | // NextPuls=0; | |
| 144 | } | |
| 145 | - | else if (NextPuls <= GetMicroS()) |
| 145 | + | else |
| 146 | {
| |
| 147 | distance= (GetMicroS() - tick)/58.0; // (HAL_GetTick() - tick)uS/58 = X cm// Transform pulse time to distance | |
| 148 | if ((GetMicroS() - tick)>=ERROR_ECHO) | |
| 149 | {
| |
| 150 | distance=0000.0; //If nothing is detected | |
| 151 | } | |
| 152 | NextPuls=GetMicroS()+10000; | |
| 153 | tick =0; | |
| 154 | } | |
| 155 | // Очищаем флаги прерывания. Говорим, что мы его обработали. | |
| 156 | HAL_NVIC_ClearPendingIRQ(EXTI9_5_IRQn); | |
| 157 | // нужно для работы нашей библиотеки HAL | |
| 158 | HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5); | |
| 159 | } | |
| 160 | // Обработчик прерывания таймера считает 1мС = 1000 мкС , задается в htim7.Init.Period = 1000-1; // мкс | |
| 161 | void TIM7_IRQHandler() | |
| 162 | {
| |
| 163 | us +=1000; | |
| 164 | ||
| 165 | HAL_TIM_IRQHandler(&htim7); // нужно для работы библиотеки HAL | |
| 166 | } | |
| 167 | ||
| 168 | // Обработчик прерывания от системного таймера | |
| 169 | void SysTick_Handler() | |
| 170 | {
| |
| 171 | HAL_IncTick(); | |
| 172 | HAL_SYSTICK_IRQHandler(); | |
| 173 | } |