123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- #include "stm32f0xx_hal.h"
- #include "pwm_in.h"
- #include <stdio.h>
- #define LED_ON HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
- #define LED_OFF HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
- #define PWM_IN_TIM_FREQ 1000000
- #define PWM_FILTER_THR 16
- static TIM_HandleTypeDef TimHandle;
- static TIM_IC_InitTypeDef sConfig;
- static TIM_SlaveConfigTypeDef sSlaveConfig;
- static uint16_t prescaler;
- __IO uint32_t cap_value_1 = 0; // Captured Value
- __IO uint32_t duty = 0; // Duty Cycle Value
- __IO uint32_t freq = 0; // Frequency Value
- uint8_t btn_pressed = 0;
- //
- void tim_pwm_in_init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
-
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_TIM3_CLK_ENABLE();
-
- GPIO_InitStruct.Pin = GPIO_PIN_6;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
-
- HAL_NVIC_SetPriority(TIM3_IRQn, 0, 1);
- HAL_NVIC_EnableIRQ(TIM3_IRQn);
-
- prescaler = HAL_RCC_GetHCLKFreq()/PWM_IN_TIM_FREQ - 1;
-
- TimHandle.Instance = TIM3;
- TimHandle.Init.Period = 0xFFFF;
- TimHandle.Init.Prescaler = prescaler;
- TimHandle.Init.ClockDivision = 0;
- TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
- TimHandle.Init.RepetitionCounter = 0;
- TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
- HAL_TIM_IC_Init(&TimHandle);
- sConfig.ICPrescaler = TIM_ICPSC_DIV1;
- sConfig.ICFilter = 0;
-
- sConfig.ICPolarity = TIM_ICPOLARITY_RISING; ;
- sConfig.ICSelection = TIM_ICSELECTION_DIRECTTI;
- HAL_TIM_IC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1);
-
- sConfig.ICPolarity = TIM_ICPOLARITY_FALLING;
- sConfig.ICSelection = TIM_ICSELECTION_INDIRECTTI;
- HAL_TIM_IC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2);
-
- sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
- sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;
- sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_NONINVERTED;
- sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;
- sSlaveConfig.TriggerFilter = 0;
-
- HAL_TIM_SlaveConfigSynchro(&TimHandle, &sSlaveConfig);
-
- HAL_TIM_IC_Start_IT(&TimHandle, TIM_CHANNEL_1);
- HAL_TIM_IC_Start_IT(&TimHandle, TIM_CHANNEL_2);
- }
- //
- void tim_print_out_pwm(void)
- {
- printf("Captured Value %u\r\n", cap_value_1);
- printf("Duty Cycle Value %u\r\n", duty);
- printf("Frequency Value %u\r\n\n", freq);
- }
- //
- void TIM3_IRQHandler(void)
- {
- HAL_TIM_IRQHandler(&TimHandle);
- }
- //
- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
- {
- static uint8_t bt_pressed_flag = 0;
- static uint8_t filter_cnt = 0;
-
- if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
- {
- cap_value_1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
- if (cap_value_1 != 0)
- {
- // частота ШИМ в герцах (для контроля)
- freq = PWM_IN_TIM_FREQ/cap_value_1;
-
- duty = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
-
- if (duty > 1660) {
- filter_cnt++;
- LED_ON;
- }
- else {
- bt_pressed_flag = 0;
- filter_cnt = 0;
- LED_OFF;
- }
-
- // Выполняется условие фильтра и было ожатие кнопки
- if ((filter_cnt == PWM_FILTER_THR) && (bt_pressed_flag == 0)){
- bt_pressed_flag = 1;
- btn_pressed = true;
- }
- }
- else
- {
- duty = 0;
- freq = 0;
- }
- }
- }
- bool get_button(void)
- {
- return btn_pressed;
- }
- //
- void set_button(bool state)
- {
- btn_pressed = state;
- }
|