微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第106例:基于232或485的57&42步进电机旋转控制实现

第106例:基于232或485的57&42步进电机旋转控制实现

时间:10-02 整理:3721RD 点击:
【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使用。
  *
  * 淘宝:
  * 论坛:硬石电子社区
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */
【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文件内容

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

  6. static void RS485_USARTx_Get_Para(void)
  7. {
  8.   __IO char ch,ch_count=0;
  9.   char data[4]={0};
  10.   
  11.   printf("---------------- 设置电机转动参数 ---------------\n");
  12.   printf("设置转动使能:A -->启动转动    B -->停止转动\n");
  13.   ch=getchar();
  14.   if((ch=='b')||(ch=='B'))
  15.   {
  16.     ena=1;
  17.     printf("转动使能设置为:停止转动\n\r");
  18.   }
  19.   else
  20.   {
  21.     ena=0;
  22.     printf("转动使能设置为:启动转动\n\r");
  23.   }
  24.   
  25.   printf("设置转动方向:A -->正转    B -->反转\n");
  26.   ch=getchar();
  27.   if((ch=='b')||(ch=='B'))
  28.   {
  29.     dir=1;
  30.     printf("转动方向设置为:反转\n\r");
  31.   }
  32.   else
  33.   {
  34.     dir=0;
  35.     printf("转动方向设置为:正转\n\r");
  36.   }
  37.   
  38.   printf("设置转动速度:(300~3500),并以回车键结束\n");
  39.   ch_count=0;
  40.   while(1)
  41.   {
  42.     ch=getchar();         
  43.     if(ch>='0' && ch<='9' && ch_count<4)
  44.     {
  45.       data[ch_count]=ch-'0';
  46.       ch_count++;
  47.     }
  48.     if(ch==0x0A)
  49.     {
  50.       if(ch_count==1)
  51.       {
  52.         Toggle_Pulse=data[0];
  53.       }
  54.       else if(ch_count==2)
  55.       {
  56.         Toggle_Pulse=data[0]*10+data[1];
  57.       }
  58.       else if(ch_count==3)
  59.       {
  60.         Toggle_Pulse=data[0]*100+data[1]*10+data[2];
  61.       }
  62.       else if(ch_count==4)
  63.       {
  64.         Toggle_Pulse=data[0]*1000+data[1]*100+data[2]*10+data[3];
  65.       }
  66.       break;
  67.     }
  68.   }
  69.   printf("转动速度设置为:%d\n\r",Toggle_Pulse);
  70.   
  71.   printf("设置转动圈数:(1~999),并以回车键结束\n");
  72.   ch_count=0;
  73.   while(1)
  74.   {
  75.     ch=getchar();         
  76.     if(ch>='0' && ch<='9' && ch_count<3)
  77.     {
  78.       data[ch_count]=ch-'0';
  79.       ch_count++;
  80.     }
  81.     if(ch==0x0A)
  82.     {
  83.       if(ch_count==1)
  84.       {
  85.         Circle_number=data[0];
  86.       }
  87.       else if(ch_count==2)
  88.       {
  89.         Circle_number=data[0]*10+data[1];
  90.       }
  91.       else if(ch_count==3)
  92.       {
  93.         Circle_number=data[0]*100+data[1]*10+data[2];
  94.       }
  95.       break;
  96.     }
  97.   }
  98.   printf("转动圈数设置为:%d\n\r",Circle_number);
  99. }

  100. /**
  101.   * 函数功能: 主函数.
  102.   * 输入参数: 无
  103.   * 返 回 值: 无
  104.   * 说    明: 无
  105.   */
  106. int main(void)
  107. {  
  108.   /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
  109.   HAL_Init();
  110.   /* 配置系统时钟 */
  111.   SystemClock_Config();
  112.   
  113.   /* 串口初始化 */
  114.   RS485_USARTx_Init();
  115.   
  116.   /* 高级控制定时器初始化并配置PWM输出功能 */
  117.   STEPMOTOR_TIMx_Init();
  118.   /* 确定定时器 */
  119.   HAL_TIM_Base_Start(&htimx_STEPMOTOR);
  120.   
  121.   RS485_USARTx_Get_Para();  
  122.   if(dir==1)
  123.   {
  124.     STEPMOTOR_DIR_REVERSAL();
  125.   }
  126.   else
  127.   {
  128.     STEPMOTOR_DIR_FORWARD();
  129.   }
  130.   if(ena==0)
  131.   {  
  132.     /* 启动比较输出并使能中断 */
  133.     HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);
  134.     STEPMOTOR_OUTPUT_ENABLE();
  135.   }
  136.   else
  137.   {
  138.     STEPMOTOR_OUTPUT_DISABLE();
  139.   }
  140.   display_system_info();
  141.   
  142.   /* 无限循环 */
  143.   while (1)
  144.   {
  145.     if(pulse_count==STEPMOTOR_MICRO_STEP*200*2*Circle_number)  // 转动指定圈数后停机
  146.     {
  147.       HAL_TIM_OC_Stop_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);      
  148.       STEPMOTOR_OUTPUT_DISABLE(); // 停机
  149.       
  150.       RS485_USARTx_Get_Para();  
  151.       if(dir==1)
  152.       {
  153.         STEPMOTOR_DIR_REVERSAL();
  154.       }
  155.       else
  156.       {
  157.         STEPMOTOR_DIR_FORWARD();
  158.       }
  159.       if(ena==0)
  160.       {  
  161.         /* 启动比较输出并使能中断 */
  162.         HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);
  163.         STEPMOTOR_OUTPUT_ENABLE();
  164.       }
  165.       else
  166.       {
  167.         STEPMOTOR_OUTPUT_DISABLE();
  168.       }
  169.       display_system_info();      
  170.     }
  171.   }
  172. }

  173. /**
  174.   * 函数功能: 定时器比较输出中断回调函数
  175.   * 输入参数: htim:定时器句柄指针
  176.   * 返 回 值: 无
  177.   * 说    明: 无
  178.   */
  179. void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
  180. {
  181.   __IO uint16_t count;
  182.   count=__HAL_TIM_GET_COUNTER(&htimx_STEPMOTOR);
  183.   __HAL_TIM_SET_COMPARE(&htimx_STEPMOTOR,TIM_CHANNEL_1,count+Toggle_Pulse);
  184.   pulse_count++;
  185. }

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

复制代码


给小编点赞

给小编点赞! 谢谢!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top