微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第108例:双轴步进电机同步旋转控制

第108例:双轴步进电机同步旋转控制

时间: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-009. 双轴步进电机同步旋转控制
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:硬石电子社区
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */
【1】例程简介
【2】跳线帽情况  
【3】操作及现象
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
main.c文件内容

  1. int main(void)
  2. {
  3.   uint8_t flag=0;
  4.   
  5.   /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
  6.   HAL_Init();
  7.   /* 配置系统时钟 */
  8.   SystemClock_Config();

  9.   KEY_GPIO_Init();
  10.   
  11.   /* 高级控制定时器初始化并配置PWM输出功能 */
  12.   STEPMOTOR_TIMx_Init();
  13.   /* 启动定时器 */
  14.   HAL_TIM_Base_Start(&htimx_STEPMOTOR);
  15.   
  16.   /* 停止比较输出并禁止中断 */
  17.   HAL_TIM_OC_Stop_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);
  18.   HAL_TIM_OC_Stop_IT(&htimx_STEPMOTOR,TIM_CHANNEL_2);
  19.   
  20.   /* 无限循环 */
  21.   while (1)
  22.   {
  23.     if(KEY1_StateRead()==KEY_DOWN)  // 前进
  24.     {
  25.       if(flag==0)
  26.       {
  27.         STEPMOTOR_DIR1_FORWARD();    // 正转
  28.         STEPMOTOR_DIR2_FORWARD();    // 正转  
  29.         /* 启动比较输出并使能中断 */
  30.         HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);
  31.         HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_2);        
  32.         STEPMOTOR_OUTPUT1_ENABLE();  // 正常运行
  33.         STEPMOTOR_OUTPUT2_ENABLE();  // 正常运行
  34.         flag=1;
  35.       }
  36.       if(KEY3_StateRead()==KEY_DOWN) // 增速
  37.       {
  38.         speed++;
  39.         if(speed>=STEPMOTOR_SPEED_CLASS) // 参数范围限制
  40.           speed=STEPMOTOR_SPEED_CLASS-1;
  41.         else if(speed<0)                 // 参数范围限制
  42.           speed=0;
  43.         Toggle_Pulse=speed_class[speed]; // 调速
  44.       }
  45.       else if(KEY4_StateRead()==KEY_DOWN) // 减速
  46.       {
  47.         speed--;
  48.         if(speed>=STEPMOTOR_SPEED_CLASS) // 参数范围限制
  49.           speed=STEPMOTOR_SPEED_CLASS-1;
  50.         else if(speed<0)                 // 参数范围限制
  51.           speed=0;
  52.         Toggle_Pulse=speed_class[speed]; // 调速
  53.       }
  54.     }
  55.     else if(KEY2_StateRead()==KEY_DOWN)  // 后退
  56.     {
  57.       if(flag==0)
  58.       {
  59.         STEPMOTOR_DIR1_REVERSAL();  // 反转
  60.         STEPMOTOR_DIR2_REVERSAL();  // 反转        
  61.         /* 启动比较输出并使能中断 */
  62.         HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);
  63.         HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_2);
  64.         STEPMOTOR_OUTPUT1_ENABLE();  // 正常运行
  65.         STEPMOTOR_OUTPUT2_ENABLE();  // 正常运行
  66.         flag=1;
  67.       }
  68.       
  69.       if(KEY3_StateRead()==KEY_DOWN)  // 增速
  70.       {
  71.         speed++;
  72.         if(speed>=STEPMOTOR_SPEED_CLASS) // 参数范围限制
  73.           speed=STEPMOTOR_SPEED_CLASS-1;
  74.         else if(speed<0)                 // 参数范围限制
  75.           speed=0;
  76.         Toggle_Pulse=speed_class[speed]; // 调速
  77.       }
  78.       else if(KEY4_StateRead()==KEY_DOWN)  // 减速
  79.       {
  80.         speed--;
  81.         if(speed>=STEPMOTOR_SPEED_CLASS) // 参数范围限制
  82.           speed=STEPMOTOR_SPEED_CLASS-1;
  83.         else if(speed<0)                 // 参数范围限制
  84.           speed=0;
  85.         Toggle_Pulse=speed_class[speed]; // 调速
  86.       }      
  87.     }
  88.     else
  89.     {
  90.       flag=0;
  91.       speed=0;
  92.       pulse_count[0]=0;            // 重新计数
  93.       pulse_count[1]=0;            // 重新计数
  94.       Toggle_Pulse=speed_class[0];
  95.       /* 停止比较输出并禁止中断 */
  96.       HAL_TIM_OC_Stop_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);
  97.       HAL_TIM_OC_Stop_IT(&htimx_STEPMOTOR,TIM_CHANNEL_2);
  98.       STEPMOTOR_OUTPUT1_DISABLE();  // 停机
  99.       STEPMOTOR_OUTPUT2_DISABLE();  // 停机
  100.     }
  101.   }
  102. }

  103. /**
  104.   * 函数功能: 定时器比较输出中断回调函数
  105.   * 输入参数: htim:定时器句柄指针
  106.   * 返 回 值: 无
  107.   * 说    明: 无
  108.   */
  109. void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
  110. {
  111.   __IO uint16_t count;
  112.   count=__HAL_TIM_GET_COUNTER(&htimx_STEPMOTOR);
  113.   if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
  114.   {
  115.     __HAL_TIM_SET_COMPARE(&htimx_STEPMOTOR,TIM_CHANNEL_1,count+Toggle_Pulse);
  116.     pulse_count[0]++;
  117.   }
  118.   if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)
  119.   {
  120.     __HAL_TIM_SET_COMPARE(&htimx_STEPMOTOR,TIM_CHANNEL_2,count+Toggle_Pulse);
  121.     pulse_count[1]++;
  122.   }
  123. }

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

复制代码


感谢小编分享!

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

网站地图

Top