步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用步进电机来控制变的非常的简单。
利用STM32定时器的输出比较翻转模式产生脉冲驱动步进电机运转
首先定时定时器驱动引脚
/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f1xx_hal.h"
/* 类型定义 ------------------------------------------------------------------*/
typedef struct {
__IO uint32_t Speed; // 转速
__IO uint32_t Step; // 步数
}Motor_TypeDef;
extern Motor_TypeDef Motor[8]; // 8个电机
/* 宏定义 --------------------------------------------------------------------*/
#define STEPMOTOR_GROUP1_TIMx TIM1
#define STEPMOTOR_GROUP1_TIM_CLK_ENABLE() __HAL_RCC_TIM1_CLK_ENABLE()
#define STEPMOTOR_GROUP1_TIM_CLK_DISABLE() __HAL_RCC_TIM1_CLK_DISABLE()
#define STEPMOTOR_GROUP1_TIMx_IRQn TIM1_CC_IRQn
#define STEPMOTOR_GROUP1_TIMx_IRQHandler TIM1_CC_IRQHandler
#define STEPMOTOR_GROUP1_TIM_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() // 输出控制脉冲给电机驱动器
/* 步进电机电机 */
/* 1 */
#define STEPMOTOR_TIM_CHL_1 TIM_CHANNEL_1
#define STEPMOTOR_TIM_PUL_PORT_1 GPIOA // 对应驱动器的PUL-(驱动器使用共阳接法)
#define STEPMOTOR_TIM_PUL_PIN_1 GPIO_PIN_8 // 而PLU+直接接开发板的5V(或者3.3V)
/* 2 */
#define STEPMOTOR_TIM_CHL_2 TIM_CHANNEL_2
#define STEPMOTOR_TIM_PUL_PORT_2 GPIOA // 对应驱动器的PUL-(驱动器使用共阳接法)
#define STEPMOTOR_TIM_PUL_PIN_2 GPIO_PIN_9 // 而PLU+直接接开发板的5V(或者3.3V)
/* 3 */
#define STEPMOTOR_TIM_CHL_3 TIM_CHANNEL_3
#define STEPMOTOR_TIM_PUL_PORT_3 GPIOA // 对应驱动器的PUL-(驱动器使用共阳接法)
#define STEPMOTOR_TIM_PUL_PIN_3 GPIO_PIN_10 // 而PLU+直接接开发板的5V(或者3.3V)
/*-------------------------------------------------------------*/
#define STEPMOTOR_GROUP2_TIMx TIM8
#define STEPMOTOR_GROUP2_TIM_CLK_ENABLE() __HAL_RCC_TIM8_CLK_ENABLE()
#define STEPMOTOR_GROUP2_TIM_CLK_DISABLE() __HAL_RCC_TIM8_CLK_DISABLE()
#define STEPMOTOR_GROUP2_TIMx_IRQn TIM8_CC_IRQn
#define STEPMOTOR_GROUP2_TIMx_IRQHandler TIM8_CC_IRQHandler
#define STEPMOTOR_GROUP2_TIM_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() // 输出控制脉冲给电机驱动器
/* 4 */
#define STEPMOTOR_TIM_CHL_4 TIM_CHANNEL_1
#define STEPMOTOR_TIM_PUL_PORT_4 GPIOC // 对应驱动器的PUL-(驱动器使用共阳接法)
#define STEPMOTOR_TIM_PUL_PIN_4 GPIO_PIN_6 // 而PLU+直接接开发板的5V(或者3.3V)
/* 5 */
#define STEPMOTOR_TIM_CHL_5 TIM_CHANNEL_2
#define STEPMOTOR_TIM_PUL_PORT_5 GPIOC // 对应驱动器的PUL-(驱动器使用共阳接法)
#define STEPMOTOR_TIM_PUL_PIN_5 GPIO_PIN_7 // 而PLU+直接接开发板的5V(或者3.3V)
/* 6 */
#define STEPMOTOR_TIM_CHL_6 TIM_CHANNEL_3
#define STEPMOTOR_TIM_PUL_PORT_6 GPIOC // 对应驱动器的PUL-(驱动器使用共阳接法)
#define STEPMOTOR_TIM_PUL_PIN_6 GPIO_PIN_8 // 而PLU+直接接开发板的5V(或者3.3V)
/*-------------------------------------------------------------*/
#define STEPMOTOR_GROUP3_TIMx TIM3
#define STEPMOTOR_GROUP3_TIM_CLK_ENABLE() __HAL_RCC_TIM3_CLK_ENABLE()
#define STEPMOTOR_GROUP3_TIM_CLK_DISABLE() __HAL_RCC_TIM3_CLK_DISABLE()
#define STEPMOTOR_GROUP3_TIMx_IRQn TIM3_IRQn
#define STEPMOTOR_GROUP3_TIMx_IRQHandler TIM3_IRQHandler
#define STEPMOTOR_GROUP3_TIM_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() // 输出控制脉冲给电机驱动器
/* 7 */
#define STEPMOTOR_TIM_CHL_7 TIM_CHANNEL_3
#define STEPMOTOR_TIM_PUL_PORT_7 GPIOB // 对应驱动器的PUL-(驱动器使用共阳接法)
#define STEPMOTOR_TIM_PUL_PIN_7 GPIO_PIN_0 // 而PLU+直接接开发板的5V(或者3.3V)
/* 8 */
#define STEPMOTOR_TIM_CHL_8 TIM_CHANNEL_4
#define STEPMOTOR_TIM_PUL_PORT_8 GPIOB // 对应驱动器的PUL-(驱动器使用共阳接法)
#define STEPMOTOR_TIM_PUL_PIN_8 GPIO_PIN_1 // 而PLU+直接接开发板的5V(或者3.3V)
// 定义定时器预分频,定时器实际时钟频率为:72MHz/(STEPMOTOR_TIMx_PRESCALER+1)
#define STEPMOTOR_TIM_PRESCALER 7 // 步进电机驱动器细分设置为: 16 细分
// 定义定时器周期,输出比较模式周期设置为0xFFFF
#define STEPMOTOR_TIM_PERIOD 0xFFFF
// 定义高级定时器重复计数寄存器值
#define STEPMOTOR_TIM_REPETITIONCOUNTER 0
/* 扩展变量 ------------------------------------------------------------------*/
extern TIM_HandleTypeDef htimx_STEPMOTOR_Group1;
extern TIM_HandleTypeDef htimx_STEPMOTOR_Group2;
extern TIM_HandleTypeDef htimx_STEPMOTOR_Group3;
/* 函数声明 ------------------------------------------------------------------*/
void STEPMOTOR_TIMx_Init(void);
然后做驱动引脚和定时器初始化
#include "StepMotor/bsp_STEPMOTOR.h"
/* 私有变量 ------------------------------------------------------------------*/
TIM_HandleTypeDef htimx_STEPMOTOR_Group1;
TIM_HandleTypeDef htimx_STEPMOTOR_Group2;
TIM_HandleTypeDef htimx_STEPMOTOR_Group3;
__IO uint16_t Toggle_Pulse = 500; // 比较输出周期,值越小输出频率越快
Motor_TypeDef Motor[8] ; // 8个电机
/* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
/* 函数体 --------------------------------------------------------------------*/
/**
* 函数功能: 驱动器相关GPIO初始化配置
* 输入参数: 无
* 返 回 值: 无
* 说 明: 无
*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* 引脚端口时钟使能 */
STEPMOTOR_GROUP1_TIM_GPIO_CLK_ENABLE();
STEPMOTOR_GROUP2_TIM_GPIO_CLK_ENABLE();
STEPMOTOR_GROUP3_TIM_GPIO_CLK_ENABLE();
/*---- Group1 SM GPIO Init ----------*/
/* 驱动器脉冲控制引脚IO初始化 */
GPIO_InitStruct.Pin = STEPMOTOR_TIM_PUL_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(STEPMOTOR_TIM_PUL_PORT_1, &GPIO_InitStruct);
/* 驱动器脉冲控制引脚IO初始化 */
GPIO_InitStruct.Pin = STEPMOTOR_TIM_PUL_PIN_2;
HAL_GPIO_Init(STEPMOTOR_TIM_PUL_PORT_2, &GPIO_InitStruct);
/* 驱动器脉冲控制引脚IO初始化 */
GPIO_InitStruct.Pin = STEPMOTOR_TIM_PUL_PIN_3;
HAL_GPIO_Init(STEPMOTOR_TIM_PUL_PORT_3, &GPIO_InitStruct);
/*---- Group2 SM GPIO Init ----------*/
/* 驱动器脉冲控制引脚IO初始化 */
GPIO_InitStruct.Pin = STEPMOTOR_TIM_PUL_PIN_4;
HAL_GPIO_Init(STEPMOTOR_TIM_PUL_PORT_4, &GPIO_InitStruct);
/* 驱动器脉冲控制引脚IO初始化 */
GPIO_InitStruct.Pin = STEPMOTOR_TIM_PUL_PIN_5;
HAL_GPIO_Init(STEPMOTOR_TIM_PUL_PORT_5, &GPIO_InitStruct);
/* 驱动器脉冲控制引脚IO初始化 */
GPIO_InitStruct.Pin = STEPMOTOR_TIM_PUL_PIN_6;
HAL_GPIO_Init(STEPMOTOR_TIM_PUL_PORT_6, &GPIO_InitStruct);
/*---- Group3 SM GPIO Init ----------*/
/* 驱动器脉冲控制引脚IO初始化 */
GPIO_InitStruct.Pin = STEPMOTOR_TIM_PUL_PIN_7;
HAL_GPIO_Init(STEPMOTOR_TIM_PUL_PORT_7, &GPIO_InitStruct);
/* 驱动器脉冲控制引脚IO初始化 */
GPIO_InitStruct.Pin = STEPMOTOR_TIM_PUL_PIN_8;
HAL_GPIO_Init(STEPMOTOR_TIM_PUL_PORT_8, &GPIO_InitStruct);
}
/**
* 函数功能: 驱动器定时器初始化
* 输入参数: 无
* 返 回 值: 无
* 说 明: 无
*/
void STEPMOTOR_TIMx_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig; // 定时器时钟
TIM_OC_InitTypeDef sConfigOC; // 定时器通道比较输出
/* 基本定时器外设时钟使能 */
STEPMOTOR_GROUP1_TIM_CLK_ENABLE();
STEPMOTOR_GROUP2_TIM_CLK_ENABLE();
STEPMOTOR_GROUP3_TIM_CLK_ENABLE();
/* 定时器基本环境配置 */
htimx_STEPMOTOR_Group1.Instance = STEPMOTOR_GROUP1_TIMx; // 定时器编号
htimx_STEPMOTOR_Group1.Init.Prescaler = STEPMOTOR_TIM_PRESCALER; // 定时器预分频器
htimx_STEPMOTOR_Group1.Init.CounterMode = TIM_COUNTERMODE_UP; // 计数方向:向上计数
htimx_STEPMOTOR_Group1.Init.Period = STEPMOTOR_TIM_PERIOD; // 定时器周期
htimx_STEPMOTOR_Group1.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1; // 时钟分频
htimx_STEPMOTOR_Group1.Init.RepetitionCounter = STEPMOTOR_TIM_REPETITIONCOUNTER; // 重复计数器
HAL_TIM_Base_Init(&htimx_STEPMOTOR_Group1);
htimx_STEPMOTOR_Group2 = htimx_STEPMOTOR_Group1;
htimx_STEPMOTOR_Group2.Instance = STEPMOTOR_GROUP2_TIMx; // 定时器编号
HAL_TIM_Base_Init(&htimx_STEPMOTOR_Group2);
htimx_STEPMOTOR_Group3 = htimx_STEPMOTOR_Group1;
htimx_STEPMOTOR_Group3.Instance = STEPMOTOR_GROUP3_TIMx; // 定时器编号
HAL_TIM_Base_Init(&htimx_STEPMOTOR_Group3);
/* 定时器时钟源配置 */
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; // 使用内部时钟源
HAL_TIM_ConfigClockSource(&htimx_STEPMOTOR_Group1, &sClockSourceConfig);
HAL_TIM_ConfigClockSource(&htimx_STEPMOTOR_Group2, &sClockSourceConfig);
HAL_TIM_ConfigClockSource(&htimx_STEPMOTOR_Group3, &sClockSourceConfig);
/* 定时器比较输出配置 */
sConfigOC.OCMode = TIM_OCMODE_TOGGLE; // 比较输出模式:反转输出
sConfigOC.Pulse = Toggle_Pulse; // 脉冲数
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 输出极性
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW; // 互补通道输出极性
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; // 快速模式
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; // 空闲电平
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; // 互补通道空闲电平
/* 定时器三通道比较输出 */
HAL_TIM_OC_ConfigChannel(&htimx_STEPMOTOR_Group1, &sConfigOC, STEPMOTOR_TIM_CHL_1);
HAL_TIM_OC_ConfigChannel(&htimx_STEPMOTOR_Group1, &sConfigOC, STEPMOTOR_TIM_CHL_2);
HAL_TIM_OC_ConfigChannel(&htimx_STEPMOTOR_Group1, &sConfigOC, STEPMOTOR_TIM_CHL_3);
HAL_TIM_OC_ConfigChannel(&htimx_STEPMOTOR_Group2, &sConfigOC, STEPMOTOR_TIM_CHL_4);
HAL_TIM_OC_ConfigChannel(&htimx_STEPMOTOR_Group2, &sConfigOC, STEPMOTOR_TIM_CHL_5);
HAL_TIM_OC_ConfigChannel(&htimx_STEPMOTOR_Group2, &sConfigOC, STEPMOTOR_TIM_CHL_6);
HAL_TIM_OC_ConfigChannel(&htimx_STEPMOTOR_Group3, &sConfigOC, STEPMOTOR_TIM_CHL_7);
HAL_TIM_OC_ConfigChannel(&htimx_STEPMOTOR_Group3, &sConfigOC, STEPMOTOR_TIM_CHL_8);
/* 配置定时器中断优先级并使能 */
HAL_NVIC_SetPriority(STEPMOTOR_GROUP1_TIMx_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(STEPMOTOR_GROUP1_TIMx_IRQn);
HAL_NVIC_SetPriority(STEPMOTOR_GROUP2_TIMx_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(STEPMOTOR_GROUP2_TIMx_IRQn);
HAL_NVIC_SetPriority(STEPMOTOR_GROUP3_TIMx_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(STEPMOTOR_GROUP3_TIMx_IRQn);
}
定时和初始化运行参数
/* 私有变量 ------------------------------------------------------------------*/
__IO uint32_t Step_Cnt[8] = {0};
/**
* 函数功能: 初始化参数.
* 输入参数: 无
* 返 回 值: 无
* 说 明: 无
*/
void Init_Param()
{
Motor[0].Speed = 500; // 速度
Motor[0].Step = 6400*5; // 转动5圈
Motor[1].Speed = 800;
Motor[1].Step = 6400*5;
Motor[2].Speed = 1100;
Motor[2].Step = 6400*5;
Motor[3].Speed = 1400;
Motor[3].Step = 6400*5;
Motor[4].Speed = 1700;
Motor[4].Step = 6400*5;
Motor[5].Speed = 2000;
Motor[5].Step = 6400*5;
Motor[6].Speed = 2300;
Motor[6].Step = 6400*5;
Motor[7].Speed = 2600;
Motor[7].Step = 6400*5;
Step_Cnt[0]=Step_Cnt[1]=Step_Cnt[2]=Step_Cnt[3]=0;// 步数记录
Step_Cnt[4]=Step_Cnt[5]=Step_Cnt[6]=Step_Cnt[7]=0;
}
在定时器中断程序中编辑控制代码
/**
* 函数功能: 定时器比较输出中断回调函数
* 输入参数: htim:定时器句柄指针
* 返 回 值: 无
* 说 明: 无
*/
__IO uint8_t i_Cnt[8] = {0}; // 步数计数
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
__IO uint16_t count = 0;
__IO uint8_t ActiveChl = htim->Channel;
/*----第一组电机------------------------------*/
if( htim == &htimx_STEPMOTOR_Group1)
{
switch(ActiveChl)
{
/* 定时器通道1 比较中断*/
case HAL_TIM_ACTIVE_CHANNEL_1:
/* 确定比较翻转时间 */
count=__HAL_TIM_GET_COUNTER(htim);
__HAL_TIM_SET_COMPARE(htim,STEPMOTOR_TIM_CHL_1,count+Motor[0].Speed);
/* 记录脉冲个数 */
i_Cnt[0] ++;
if(i_Cnt[0] == 2)
{
i_Cnt[0] = 0;
Step_Cnt[0] ++;
/* 到达目标脉冲数 停止输出 */
if(Step_Cnt[0] == Motor[0].Step )
{
__HAL_TIM_DISABLE_IT(htim,TIM_IT_CC1);
TIM_CCxChannelCmd(htim->Instance, STEPMOTOR_TIM_CHL_1, TIM_CCx_DISABLE);
}
}
break;
case HAL_TIM_ACTIVE_CHANNEL_2:
count=__HAL_TIM_GET_COUNTER(htim);
__HAL_TIM_SET_COMPARE(htim,STEPMOTOR_TIM_CHL_2,count+Motor[1].Speed);
i_Cnt[1] ++;
if(i_Cnt[1] == 2)
{
i_Cnt[1] = 0;
Step_Cnt[1] ++;
if(Step_Cnt[1] == Motor[1].Step )
{
__HAL_TIM_DISABLE_IT(htim,TIM_IT_CC2);
TIM_CCxChannelCmd(htim->Instance, STEPMOTOR_TIM_CHL_2, TIM_CCx_DISABLE);
}
}
break;
case HAL_TIM_ACTIVE_CHANNEL_3:
count=__HAL_TIM_GET_COUNTER(htim);
__HAL_TIM_SET_COMPARE(htim,STEPMOTOR_TIM_CHL_3,count+Motor[2].Speed);
i_Cnt[2] ++;
if(i_Cnt[2] == 2)
{
i_Cnt[2] = 0;
Step_Cnt[2] ++;
if(Step_Cnt[2] == Motor[2].Step )
{
__HAL_TIM_DISABLE_IT(htim,TIM_IT_CC3);
TIM_CCxChannelCmd(htim->Instance, STEPMOTOR_TIM_CHL_3, TIM_CCx_DISABLE);
}
}
break;
}
}
/*----------------------------------------------*/
if( htim == &htimx_STEPMOTOR_Group2)
{
switch(ActiveChl)
{
case HAL_TIM_ACTIVE_CHANNEL_1:
count=__HAL_TIM_GET_COUNTER(htim);
__HAL_TIM_SET_COMPARE(htim,STEPMOTOR_TIM_CHL_4,count+Motor[3].Speed);
i_Cnt[3] ++;
if(i_Cnt[3] == 2)
{
i_Cnt[3] = 0;
Step_Cnt[3] ++;
if(Step_Cnt[3] == Motor[3].Step)
{
__HAL_TIM_DISABLE_IT(htim,TIM_IT_CC1);
TIM_CCxChannelCmd(htim->Instance, STEPMOTOR_TIM_CHL_4, TIM_CCx_DISABLE);
}
}
break;
case HAL_TIM_ACTIVE_CHANNEL_2:
count=__HAL_TIM_GET_COUNTER(htim);
__HAL_TIM_SET_COMPARE(htim,STEPMOTOR_TIM_CHL_5,count+Motor[4].Speed);
i_Cnt[4] ++;
if(i_Cnt[4] == 2)
{
i_Cnt[4] = 0;
Step_Cnt[4] ++;
if(Step_Cnt[4] == Motor[4].Step)
{
__HAL_TIM_DISABLE_IT(htim,TIM_IT_CC2);
TIM_CCxChannelCmd(htim->Instance, STEPMOTOR_TIM_CHL_5, TIM_CCx_DISABLE);
}
}
break;
case HAL_TIM_ACTIVE_CHANNEL_3:
count=__HAL_TIM_GET_COUNTER(htim);
__HAL_TIM_SET_COMPARE(htim,STEPMOTOR_TIM_CHL_6,count+Motor[5].Speed);
i_Cnt[5] ++;
if(i_Cnt[5] == 2)
{
i_Cnt[5] = 0;
Step_Cnt[5] ++;
if(Step_Cnt[5] == Motor[5].Step)
{
__HAL_TIM_DISABLE_IT(htim,TIM_IT_CC3);
TIM_CCxChannelCmd(htim->Instance, STEPMOTOR_TIM_CHL_6, TIM_CCx_DISABLE);
}
}
break;
}
}
/*---------------------------------------------------*/
if( htim == &htimx_STEPMOTOR_Group3)
{
switch(ActiveChl)
{
case HAL_TIM_ACTIVE_CHANNEL_3:
count=__HAL_TIM_GET_COUNTER(htim);
__HAL_TIM_SET_COMPARE(htim,STEPMOTOR_TIM_CHL_7,count+Motor[6].Speed);
i_Cnt[6] ++;
if(i_Cnt[6] == 2)
{
i_Cnt[6] = 0;
Step_Cnt[6] ++;
if(Step_Cnt[6] == Motor[0].Step)
{
__HAL_TIM_DISABLE_IT(htim,TIM_IT_CC3);
TIM_CCxChannelCmd(htim->Instance, STEPMOTOR_TIM_CHL_7, TIM_CCx_DISABLE);
}
}
break;
case HAL_TIM_ACTIVE_CHANNEL_4:
count=__HAL_TIM_GET_COUNTER(htim);
__HAL_TIM_SET_COMPARE(htim,STEPMOTOR_TIM_CHL_8,count+Motor[7].Speed);
i_Cnt[7] ++;
if(i_Cnt[7] == 2)
{
i_Cnt[7] = 0;
Step_Cnt[7] ++;
if(Step_Cnt[7] == Motor[7].Step)
{
__HAL_TIM_DISABLE_IT(htim,TIM_IT_CC4);
TIM_CCxChannelCmd(htim->Instance, STEPMOTOR_TIM_CHL_8, TIM_CCx_DISABLE);
}
}
break;
}
}
}
在主程序中调用就可以实现电机运转控制了
Init_Param();
HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR_Group1,STEPMOTOR_TIM_CHL_1);
HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR_Group1,STEPMOTOR_TIM_CHL_2);
HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR_Group1,STEPMOTOR_TIM_CHL_3);
HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR_Group2,STEPMOTOR_TIM_CHL_4);
HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR_Group2,STEPMOTOR_TIM_CHL_5);
HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR_Group2,STEPMOTOR_TIM_CHL_6);
HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR_Group3,STEPMOTOR_TIM_CHL_7);
HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR_Group3,STEPMOTOR_TIM_CHL_8);
|
|