stm32f302实现斩波控制步进电机_【HAL库每天一例】第108例:双轴步进电机同步旋转控制...

本文介绍了如何使用STM32F302微控制器通过HAL库实现步进电机的斩波控制。通过高级控制定时器初始化配置PWM输出,根据按键输入实现步进电机的正反转及速度调节。利用中断回调函数处理定时器比较输出,精确控制电机脉冲,从而实现步进电机的同步旋转控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

int main(void)

{

uint8_t flag=0;

/* 复位所有外设,初始化Flash接口和系统滴答定时器 */

HAL_Init();

/* 配置系统时钟 */

Systemclock_Config();

KEY_GPIO_Init();

/* 高级控制定时器初始化并配置PWM输出功能 */

STEPMOTOR_tiMx_Init();

/* 启动定时器 */

HAL_TIM_Base_Start(&htimx_STEPMOTOR);

/* 停止比较输出并禁止中断 */

HAL_TIM_OC_Stop_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);

HAL_TIM_OC_Stop_IT(&htimx_STEPMOTOR,TIM_CHANNEL_2);

/* 无限循环 */

while (1)

{

if(KEY1_StateRead()==KEY_DOWN)  // 前进

{

if(flag==0)

{

STEPMOTOR_DIR1_FORWARD();    // 正转

STEPMOTOR_DIR2_FORWARD();    // 正转

/* 启动比较输出并使能中断 */

HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);

HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_2);

STEPMOTOR_OUTPUT1_ENABLE();  // 正常运行

STEPMOTOR_OUTPUT2_ENABLE();  // 正常运行

flag=1;

}

if(KEY3_StateRead()==KEY_DOWN) // 增速

{

speed++;

if(speed>=STEPMOTOR_SPEED_CLASS) // 参数范围限制

speed=STEPMOTOR_SPEED_CLASS-1;

else if(speed<0)                 // 参数范围限制

speed=0;

Toggle_Pulse=speed_class[speed]; // 调速

}

else if(KEY4_StateRead()==KEY_DOWN) // 减速

{

speed--;

if(speed>=STEPMOTOR_SPEED_CLASS) // 参数范围限制

speed=STEPMOTOR_SPEED_CLASS-1;

else if(speed<0)                 // 参数范围限制

speed=0;

Toggle_Pulse=speed_class[speed]; // 调速

}

}

else if(KEY2_StateRead()==KEY_DOWN)  // 后退

{

if(flag==0)

{

STEPMOTOR_DIR1_REversal();  // 反转

STEPMOTOR_DIR2_REVERSAL();  // 反转

/* 启动比较输出并使能中断 */

HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);

HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_2);

STEPMOTOR_OUTPUT1_ENABLE();  // 正常运行

STEPMOTOR_OUTPUT2_ENABLE();  // 正常运行

flag=1;

}

if(KEY3_StateRead()==KEY_DOWN)  // 增速

{

speed++;

if(speed>=STEPMOTOR_SPEED_CLASS) // 参数范围限制

speed=STEPMOTOR_SPEED_CLASS-1;

else if(speed<0)                 // 参数范围限制

speed=0;

Toggle_Pulse=speed_class[speed]; // 调速

}

else if(KEY4_StateRead()==KEY_DOWN)  // 减速

{

speed--;

if(speed>=STEPMOTOR_SPEED_CLASS) // 参数范围限制

speed=STEPMOTOR_SPEED_CLASS-1;

else if(speed<0)                 // 参数范围限制

speed=0;

Toggle_Pulse=speed_class[speed]; // 调速

}

}

else

{

flag=0;

speed=0;

pulse_count[0]=0;            // 重新计数

pulse_count[1]=0;            // 重新计数

Toggle_Pulse=speed_class[0];

/* 停止比较输出并禁止中断 */

HAL_TIM_OC_Stop_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);

HAL_TIM_OC_Stop_IT(&htimx_STEPMOTOR,TIM_CHANNEL_2);

STEPMOTOR_OUTPUT1_DISABLE();  // 停机

STEPMOTOR_OUTPUT2_DISABLE();  // 停机

}

}

}

/**

* 函数功能: 定时器比较输出中断回调函数

* 输入参数: htim:定时器句柄指针

* 返 回 值: 无

* 说    明: 无

*/

void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)

{

__IO uint16_t count;

count=__HAL_TIM_GET_COUNTER(&htimx_STEPMOTOR);

if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)

{

__HAL_TIM_SET_COMPARE(&htimx_STEPMOTOR,TIM_CHANNEL_1,count+Toggle_Pulse);

pulse_count[0]++;

}

if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)

{

__HAL_TIM_SET_COMPARE(&htimx_STEPMOTOR,TIM_CHANNEL_2,count+Toggle_Pulse);

pulse_count[1]++;

}

}

/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值