void STM32FrequencyChannel::ISR () { pinState = !pinState; auto capture = __HAL_TIM_GET_COMPARE (timer.handle, channel); if (!pinState) { if (CycleCompleted != nullptr) { EventArgs args; CycleCompleted (this, args); } if (stopRequested) { Enable (false); stopRequested = false; } } __HAL_TIM_SET_COMPARE (timer.handle, channel, capture + reloadValue); }
int main(void) { HAL_Init(); Nucleo_BSP_Init(); MX_TIM1_Init(); MX_TIM3_Init(); HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL); HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_1); HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_2); cnt1 = __HAL_TIM_GET_COUNTER(&htim3); tick = HAL_GetTick(); while (1) { if (HAL_GetTick() - tick > 1000L) { cnt2 = __HAL_TIM_GET_COUNTER(&htim3); if (__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3)) { if (cnt2 < cnt1) /* Check for counter underflow */ diff = cnt1 - cnt2; else diff = (65535 - cnt2) + cnt1; } else { if (cnt2 > cnt1) /* Check for counter overflow */ diff = cnt2 - cnt1; else diff = (65535 - cnt1) + cnt2; } sprintf(msg, "Difference: %d\r\n", diff); HAL_UART_Transmit(&huart2, (uint8_t*) msg, strlen(msg), HAL_MAX_DELAY); speed = ((diff / PULSES_PER_REVOLUTION) / 60); /* If the first three bits of SMCR register are set to 0x3 * then the timer is set in X4 mode (TIM_ENCODERMODE_TI12) * and we need to divide the pulses counter by two, because * they include the pulses for both the channels */ if ((TIM3->SMCR & 0x3) == 0x3) speed /= 2; sprintf(msg, "Speed: %d RPM\r\n", speed); HAL_UART_Transmit(&huart2, (uint8_t*) msg, strlen(msg), HAL_MAX_DELAY); dir = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3); sprintf(msg, "Direction: %d\r\n", dir); HAL_UART_Transmit(&huart2, (uint8_t*) msg, strlen(msg), HAL_MAX_DELAY); tick = HAL_GetTick(); cnt1 = __HAL_TIM_GET_COUNTER(&htim3); } if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET) { /* Invert rotation by swapping CH1 and CH2 CCR value */ tim1_ch1_pulse = __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_1); tim1_ch2_pulse = __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_2); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, tim1_ch2_pulse); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, tim1_ch1_pulse); } } }
// 输出比较 回调函数 void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) { uint16_t delay_new = 0; // TIM4 if (htim->Instance == TIM4) { // 1 // 排烟风机 通道 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { // 排烟风机 delay_on, 打开输出 // 输出:On HAL_GPIO_WritePin(PORT_SCR, SCR0_smoke, GPIO_PIN_RESET); HAL_TIM_OC_Stop_IT( &htim4, TIM_CHANNEL_1); // 启动波峰 if (is_lower_blow) { is_lower_blow = false; delay_new = __HAL_TIM_GET_COMPARE(&htim4, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, delay_new + 10000 - 1); HAL_TIM_OC_Start_IT( &htim4, TIM_CHANNEL_1); } //设置停止时间 delay_new = __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, delay_new + uS_DELAY_OFF); // 启动定时器 HAL_TIM_OC_Start_IT( &htim1, TIM_CHANNEL_1); } // 2 // 循环风机通道 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) { // 循环风机 delay_on, 打开输出 // 输出:On HAL_GPIO_WritePin(PORT_SCR, SCR1_exchange, GPIO_PIN_RESET); HAL_TIM_OC_Stop_IT( &htim4, TIM_CHANNEL_2); // 启动波峰 if (is_lower_exchange) { is_lower_exchange = false; delay_new = __HAL_TIM_GET_COMPARE(&htim4, TIM_CHANNEL_2); __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, delay_new + 10000 - 1); HAL_TIM_OC_Start_IT( &htim4, TIM_CHANNEL_2); } //设置停止时间 uint16_t delay_new = __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_2); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, delay_new + uS_DELAY_OFF); // 启动定时器 HAL_TIM_OC_Start_IT( &htim1, TIM_CHANNEL_2); } // 3 // 送料电机 通道 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3) { HAL_GPIO_WritePin(PORT_SCR, SCR2_feed, GPIO_PIN_RESET); HAL_TIM_OC_Stop_IT( &htim4, TIM_CHANNEL_3); // 启动波峰 if (is_lower_feed) { is_lower_feed = false; uint16_t delay_new = __HAL_TIM_GET_COMPARE(&htim4, TIM_CHANNEL_3); __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, delay_new + 10000 - 1); HAL_TIM_OC_Start_IT( &htim4, TIM_CHANNEL_3); } //设置停止时间 uint16_t delay_new = __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_3); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, delay_new + uS_DELAY_OFF); } } // TIM1 // 延时1ms关闭触发 if (htim->Instance == TIM1) { // 1 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { HAL_GPIO_WritePin(PORT_SCR, SCR0_smoke, GPIO_PIN_SET); HAL_TIM_OC_Stop_IT( &htim1, TIM_CHANNEL_1); } // 2 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) { // 输出 循环:Off HAL_GPIO_WritePin(PORT_SCR, SCR1_exchange, GPIO_PIN_SET); HAL_TIM_OC_Stop_IT( &htim1, TIM_CHANNEL_2); } // 3 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3) { // 输出 送料: Off HAL_GPIO_WritePin(PORT_SCR, SCR2_feed, GPIO_PIN_SET); HAL_TIM_OC_Stop_IT( &htim1, TIM_CHANNEL_3); } } // TIM1 // }