Advertisement
Mihail_V

Untitled

Jul 20th, 2015
2,809
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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мС.
  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 )//
  141.     {
  142.         tick = GetMicroS();
  143.  //       NextPuls=0;
  144.     }
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement