打印
[STM32F1]

【HAL库每天一例】第106例:基于232或485的57&42步进电机旋转...

[复制链接]
819|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
亼亽|  楼主 | 2016-8-29 08:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
【HAL库每天一例】系列例程从今天开始持续更新。。。。。
我们将**每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。

参考文档见:

硬石电机控制专题指导手册
例程下载:
资料包括程序、相关说明资料以及软件使用截图

百度云盘:https://pan.baidu.com/s/1slN8rIt 密码:u6m1
360云盘:https://yunpan.cn/OcPiRp3wEcA92u密码 cfb6
(硬石YS-F1Pro开发板HAL库例程持续更新\5. 软件设计之电机控制(HAL库版本)\步进电机.zip
/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: YSF1_HAL_MOTOR-007. 基于232或485的57&42步进电机旋转控制实现
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:http://www.ing10bbs.com
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */

【1】例程简介
【2】跳线帽情况
【3】操作及现象
  根据bsp_STEPMOTOR.h文件中引脚定义方法连接开发板和步进电机驱动器,另外驱动器和57&42
步进电机的连接自行根据电机和驱动器标识连接,驱动器需要一个24V 5A的直流电源供电。本例
程可以选择使用RS232或者RS485通信控制电机旋转,默认使用USART2为通信接口,根据需要接线。
使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口为开发板提供
电源。下载完程序之后,开发板持续输出脉冲给电机驱动器,步进电机持续转动10圈后停止,
在其转动器件可以按下KEY1和KEY2组合实现电机转速、方向、停止、启动等等控制。

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

main.c文件内容
static void display_system_info(void)
{
  printf("当前系统信息:  当前状态:%s\n",ena==1?"停止转动":"正在转动");
  printf("转动速度:%d    转动方向:%s   等待转动圈数:%d\n\r",Toggle_Pulse,dir==1?"正转":"反转",Circle_number);
}

static void RS485_USARTx_Get_Para(void)
{
  __IO char ch,ch_count=0;
  char data[4]={0};
  
  printf("---------------- 设置电机转动参数 ---------------\n");
  printf("设置转动使能:A -->启动转动    B -->停止转动\n");
  ch=getchar();
  if((ch=='b')||(ch=='B'))
  {
    ena=1;
    printf("转动使能设置为:停止转动\n\r");
  }
  else
  {
    ena=0;
    printf("转动使能设置为:启动转动\n\r");
  }
  
  printf("设置转动方向:A -->正转    B -->反转\n");
  ch=getchar();
  if((ch=='b')||(ch=='B'))
  {
    dir=1;
    printf("转动方向设置为:反转\n\r");
  }
  else
  {
    dir=0;
    printf("转动方向设置为:正转\n\r");
  }
  
  printf("设置转动速度:(300~3500),并以回车键结束\n");
  ch_count=0;
  while(1)
  {
    ch=getchar();         
    if(ch>='0' && ch<='9' && ch_count<4)
    {
      data[ch_count]=ch-'0';
      ch_count++;
    }
    if(ch==0x0A)
    {
      if(ch_count==1)
      {
        Toggle_Pulse=data[0];
      }
      else if(ch_count==2)
      {
        Toggle_Pulse=data[0]*10+data[1];
      }
      else if(ch_count==3)
      {
        Toggle_Pulse=data[0]*100+data[1]*10+data[2];
      }
      else if(ch_count==4)
      {
        Toggle_Pulse=data[0]*1000+data[1]*100+data[2]*10+data[3];
      }
      break;
    }
  }
  printf("转动速度设置为:%d\n\r",Toggle_Pulse);
  
  printf("设置转动圈数:(1~999),并以回车键结束\n");
  ch_count=0;
  while(1)
  {
    ch=getchar();         
    if(ch>='0' && ch<='9' && ch_count<3)
    {
      data[ch_count]=ch-'0';
      ch_count++;
    }
    if(ch==0x0A)
    {
      if(ch_count==1)
      {
        Circle_number=data[0];
      }
      else if(ch_count==2)
      {
        Circle_number=data[0]*10+data[1];
      }
      else if(ch_count==3)
      {
        Circle_number=data[0]*100+data[1]*10+data[2];
      }
      break;
    }
  }
  printf("转动圈数设置为:%d\n\r",Circle_number);
}

/**
  * 函数功能: 主函数.
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */
int main(void)
{  
  /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
  HAL_Init();
  /* 配置系统时钟 */
  SystemClock_Config();
  
  /* 串口初始化 */
  RS485_USARTx_Init();
  
  /* 高级控制定时器初始化并配置PWM输出功能 */
  STEPMOTOR_TIMx_Init();
  /* 确定定时器 */
  HAL_TIM_Base_Start(&htimx_STEPMOTOR);
  
  RS485_USARTx_Get_Para();  
  if(dir==1)
  {
    STEPMOTOR_DIR_REVERSAL();
  }
  else
  {
    STEPMOTOR_DIR_FORWARD();
  }
  if(ena==0)
  {  
    /* 启动比较输出并使能中断 */
    HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);
    STEPMOTOR_OUTPUT_ENABLE();
  }
  else
  {
    STEPMOTOR_OUTPUT_DISABLE();
  }
  display_system_info();
  
  /* 无限循环 */
  while (1)
  {
    if(pulse_count==STEPMOTOR_MICRO_STEP*200*2*Circle_number)  // 转动指定圈数后停机
    {
      HAL_TIM_OC_Stop_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);      
      STEPMOTOR_OUTPUT_DISABLE(); // 停机
      
      RS485_USARTx_Get_Para();  
      if(dir==1)
      {
        STEPMOTOR_DIR_REVERSAL();
      }
      else
      {
        STEPMOTOR_DIR_FORWARD();
      }
      if(ena==0)
      {  
        /* 启动比较输出并使能中断 */
        HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);
        STEPMOTOR_OUTPUT_ENABLE();
      }
      else
      {
        STEPMOTOR_OUTPUT_DISABLE();
      }
      display_system_info();      
    }
  }
}

/**
  * 函数功能: 定时器比较输出中断回调函数
  * 输入参数: htim:定时器句柄指针
  * 返 回 值: 无
  * 说    明: 无
  */
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
  __IO uint16_t count;
  count=__HAL_TIM_GET_COUNTER(&htimx_STEPMOTOR);
  __HAL_TIM_SET_COMPARE(&htimx_STEPMOTOR,TIM_CHANNEL_1,count+Toggle_Pulse);
  pulse_count++;
}

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



沙发
mmuuss586| | 2016-8-29 10:20 | 只看该作者
谢谢分享;

使用特权

评论回复
板凳
一顶破锅| | 2016-8-29 15:25 | 只看该作者
你们的这一系列非常好  我感觉可以加精呀

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

122

主题

216

帖子

48

粉丝