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