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