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

一、所用材料

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

二、所学内容

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

三、HAL库配置

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

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

第二步:SYS配置-选取SW

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

第三步:时钟树配置

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

第四步:TIM定时器配置

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

  • 以下为TIM1的配置参数:
    STM32-HAL库12-STM32F407VGT6的PWM主从定时器,发送指定数量脉冲-LMLPHP
    STM32-HAL库12-STM32F407VGT6的PWM主从定时器,发送指定数量脉冲-LMLPHP
  • 以下为TIM4的配置参数:
    STM32-HAL库12-STM32F407VGT6的PWM主从定时器,发送指定数量脉冲-LMLPHP
    需要打开TIM4的全局中断
    STM32-HAL库12-STM32F407VGT6的PWM主从定时器,发送指定数量脉冲-LMLPHP

四、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个脉冲

05-02 09:08