OneNET麒麟座应用开发之七:控制采样电机

气体采样采用主动抽取气体的方式保证充足而平稳的气流,所以我们采用气泵抽取气体来完成。

1、设计概述

客户对这部分要求能够设定电机的速度,但并不需要动态调节。对电机的控制有很多方式,我们采用比较简单的方式。我们采用定时器产生PWM舶来实现这一控制过程。

2、硬件连接

对电机的控制我们使用高级定时器TIM1产生PWM波来控制,对于OneNET麒麟座中TIM1的通道1、2、3以及他们的互补输出均已经引到了端子排J2-5(PA10)、2-6(PA9)、J2-7(PA8)、J5-7(PA7)、J3-2(PB0)、J3-3(PB1),如下图所示:

所采用的空气泵泵是一种比较小型的设备,需要12V-24V电源,具体如下:

 

由于电机是12V-24V的所以我们还需要必要的电路来完成这一功能,控制板如下图所示:

 

这种控制板的原理图如下所示,在后续的设计中我们将设计为一体:

 

接下来我们在STM32CubeMX中作相应的配置,配置如下:

 

3、软件设计

完成硬件的配置和连接后,我们开始编写软件,首先,我们实现必要的初始化,使得PWM波形能够产生。

/* 对TIM1进行初始化配置*/
static void TIM1_PWM_Initialization(void)
{
  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_OC_InitTypeDef sConfigOC;
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 0;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 0;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  if (HAL_TIM_OC_Init(&htim1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sConfigOC.OCMode = TIM_OCMODE_TIMING;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;

  if (HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  if (HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  if (HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 0;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
  HAL_TIM_MspPostInit(&htim1);
}

完成配置后,我们接下来编写一个控制程序,用以调节占空比。具体的实现代码如下:

//配置TIM1为PWM输出
void PWM_Configuration(void)
{
  //计算初始化的频率和占空比
  TimerPeriod = PWMTimePeriod;//计算用于设置ARR寄存器的值使产生信号的频率为17.57 Khz
  PWM1Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);//计算CCR1寄存器的值在通道1和1N产生50%占空比,用于TIM1
  PWM2Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);//计算CCR1寄存器的值在通道1和1N产生50%占空比,用于TIM8
  PWM_InitProcess(TIM1,TimerPeriod,PWM1Pulse);
}

配置完成编译后,基本能都达到效果,在随后的设计中我们将进一步改进。

原文地址:https://www.cnblogs.com/foxclever/p/6900036.html