使用STM32-HAL库控制STM32F407VGT6的PWM主从定时器,实现指定数量脉冲输出

STM32-HAL库12-STM32F407VGT6的PWM主从定时器,发送指定数量脉冲

一、所用材料

STM32F407VGT6自制双伺服电机控制板;
一川A1系列伺服电机驱动器(电0.73KW电机);

二、所学内容

实现PWM发送指定个数脉冲,以实现伺服电机的定位控制。

三、HAL库配置

第一步:RCC配置-选取外部晶振

第二步:SYS配置-选取SW

第三步:时钟树配置

第四步:TIM定时器配置

本文选取TIM1-CH3作为电机1的主TIM的PWM输出口,TIM4作为从TIM;
本文选取TIM2-CH1作为电机2的主TIM的PWM输出口,TIM8作为从TIM;
本文以电机1定位控制为例

  • 以下为TIM1的配置参数:

  • 以下为TIM4的配置参数:

    需要打开TIM4的全局中断
  • 四、MDK配置

    第一步:main.c

    main函数中代码如下:

    int main(void)
    {
      /* USER CODE BEGIN 1 */
    
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_USART1_UART_Init();
      MX_TIM1_Init();
      MX_CAN2_Init();
      MX_CAN1_Init();
      MX_TIM2_Init();
      MX_TIM3_Init();
      MX_TIM4_Init();
      MX_TIM5_Init();
      MX_TIM8_Init();
      /* USER CODE BEGIN 2 */
      HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
      HAL_Delay(10);
    //  CAN_Start_Init();									
    //  CAN1Filter_Config();
    //  CAN2Filter_Config();
      
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
    	if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_0)==0)
    	{
    		HAL_Delay(10);
    		if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_0)==0)
    		{
    			__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_3, 25); //修改占空比比较值,一直保持占空比50%
    			__HAL_TIM_SET_AUTORELOAD(&htim4,20000-1); //设置要输出的PWM脉冲数1000个
    			HAL_TIM_Base_Start_IT(&htim4);             //启动从定时器
    			HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
    			while(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_0)==0);
    		}
    	}
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
      }
    
      /* USER CODE END 3 */
    }
    

    定时器的中断回调如下:

    void  HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
        if(htim == &htim4)
        {
            if(__HAL_TIM_GET_FLAG(&htim4, TIM_FLAG_CC2) != RESET)//判断是否触发中断   
            {
                __HAL_TIM_CLEAR_FLAG(&htim4, TIM_FLAG_CC2); //清除中断标志            
    			HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);   //关闭主定时器
                HAL_TIM_Base_Stop_IT(&htim4);              //关闭从定时器
            }
        }
    }
    

    通过以上代码即可实现单词按键输入后STM32F407发送20000个脉冲

    作者:Tony0925

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用STM32-HAL库控制STM32F407VGT6的PWM主从定时器,实现指定数量脉冲输出

    发表回复