你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

[HAL库每天一例]第102例:基于串口的28BYJ48步进电机旋转...

[复制链接]
haohao663 提问时间:2016-8-27 09:06 /
【HAL库每天一例】系列例程从今天开始持续更新。。。。。
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。

参考文档见:

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

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

【1】例程简介
【2】跳线帽情况
【3】操作及现象

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


main.c文件内容
  1. /**
  2.   * 函数功能: 输出一个数据给ULN2003从而实现向步进电机发送一个脉冲
  3.   * 输入参数: step:序列号,选择step_motor数组对应的数据
  4.   *           direction:方向选择
  5.   *               可选值:0:顺时针
  6.   *                       1:逆时针
  7.   * 返 回 值: 无
  8.   * 说    明: 无
  9.   */
  10. static void step_motor_pulse(uint8_t step,uint8_t direction)
  11. {
  12.   uint8_t temp=step;
  13.   
  14.   if(direction==0)    // 如果为逆时针旋转
  15.   {
  16.     temp=8-step;      // 调换节拍信号
  17.   }
  18.   switch(temp)
  19.   {
  20.     // 8个节拍控制:A->AB->B->BC->C->CD->D->DA
  21.     case 0:
  22.       A_ON;  B_OFF; C_OFF; D_OFF;
  23.     break;
  24.     case 1:
  25.       A_ON;  B_ON;  C_OFF; D_OFF;
  26.     break;
  27.     case 2:
  28.       A_OFF; B_ON;  C_OFF; D_OFF;
  29.     break;
  30.     case 3:
  31.       A_OFF; B_ON;  C_ON;  D_OFF;
  32.     break;
  33.     case 4:
  34.       A_OFF; B_OFF; C_ON;  D_OFF;
  35.     break;
  36.     case 5:
  37.       A_OFF; B_OFF; C_ON;  D_ON;
  38.     break;
  39.     case 6:
  40.       A_OFF; B_OFF; C_OFF; D_ON;
  41.     break;
  42.     case 7:
  43.       A_ON;  B_OFF; C_OFF; D_ON;
  44.     break;
  45.   }
  46. }

  47. static void display_usart_cmd(void)
  48. {
  49.   printf("当前系统信息:\n");
  50.   printf("转动速度:%d    转动方向:%s   等待圈数:%d\n\r",speed,direction==1?"顺时针":"逆时针",Circle_number);
  51.   printf("在串口调试助手发送(A,B,C,D)字母,执行对应的命令\n");
  52.   printf("(A) 增速\n");
  53.   printf("(B) 减速\n");
  54.   printf("(C) 反转方向\n");
  55.   printf("(D) 设置圈数\n\r");
  56. }

  57. /**
  58.   * 函数功能: 主函数.
  59.   * 输入参数: 无
  60.   * 返 回 值: 无
  61.   * 说    明: 无
  62.   */
  63. int main(void)
  64. {   
  65.   __IO char ch,count=0;
  66.   char data[4]={0};
  67.   
  68.   /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
  69.   HAL_Init();
  70.   /* 配置系统时钟 */
  71.   SystemClock_Config();
  72.   
  73.   ULN2003_GPIO_Init();
  74.   
  75.   MX_DEBUG_USART_Init();
  76.   printf("这是一个基于串口命令的步进电机控制\n");
  77.   
  78.   display_usart_cmd();
  79.   
  80.   /* 无限循环 */
  81.   while (1)
  82.   {
  83.     /* 获取字符指令 */
  84.     ch=getchar();
  85.     setting_flag=1;
  86.     switch(ch)
  87.     {
  88.       case 'a':
  89.       case 'A':
  90.         speed-=5;
  91.         if(speed<8)
  92.           speed=8;
  93.         printf("转动速度:%d\n\r",speed);
  94.         break;
  95.       case 'b':
  96.       case 'B':
  97.         speed+=5;
  98.         if(speed>80)
  99.           speed=80;
  100.         printf("转动速度:%d\n\r",speed);
  101.         break;
  102.       case 'c':
  103.       case 'C':
  104.         direction=1-direction;
  105.         printf("转动方向:%s\n\r",direction==1?"顺时针":"逆时针");
  106.       break;
  107.       case 'd':
  108.       case 'D':
  109.         count=0;
  110.         printf("请输入一个(1~9999)之间的数,设置转动圈数\n");
  111.         printf("注意需要在末尾输入一个回车键\n\r");
  112.         while(1)
  113.         {
  114.           ch=getchar();         
  115.           if(ch>='0' && ch<='9' && count<4)
  116.           {
  117.             data[count]=ch-'0';
  118.             count++;
  119.           }
  120.           if(ch==0x0A)
  121.           {
  122.             if(count==1)
  123.             {
  124.               Circle_number=data[0];
  125.             }
  126.             else if(count==2)
  127.             {
  128.               Circle_number=data[0]*10+data[1];
  129.             }
  130.             else if(count==3)
  131.             {
  132.               Circle_number=data[0]*100+data[1]*10+data[2];
  133.             }
  134.             else if(count==4)
  135.             {
  136.               Circle_number=data[0]*1000+data[1]*100+data[2]*10+data[3];
  137.             }
  138.             break;
  139.           }
  140.         }
  141.         printf("当前设置转动圈数:%d\n",Circle_number);
  142.         break;
  143.       default:
  144.         display_usart_cmd();
  145.         break;
  146.     }
  147.     if(Circle_number) setting_flag=0;
  148.   }
  149. }

  150. void HAL_SYSTICK_Callback(void)
  151. {
  152.   static uint8_t count=0;               // 用于旋转速度控制
  153.   static uint8_t step=0;                // 当前步进节拍
  154.   static uint16_t pulse_count=0;        // 脉冲计数,4096个脉冲电机旋转一圈
  155.   
  156.   if((setting_flag==0) && Circle_number)                     // 如果等待旋转圈数不为0
  157.   {
  158.     count++;                            // 增加时间计数
  159.     if(count==speed)                    // 时间计数与目标速度相对时执行下一节拍输出
  160.     {
  161.       step_motor_pulse(step,direction); // 输出新节拍信号
  162.       pulse_count++;                    // 脉冲输出数增加      
  163.       step++;                           // 节拍数增加
  164.       if(step==8) step=0;               // 循环开始输出节拍
  165.       count=0;                          // 清零时间计数
  166.     }
  167.    
  168.     if(pulse_count==4096)               // 如果已经输出了4096个脉冲信号,已经转动了一圈
  169.     {
  170.       pulse_count=0;                    // 脉冲计数清零
  171.       Circle_number--;                  // 等待旋转圈数减1
  172.     }
  173.   }
  174.   else
  175.   {
  176.     A_OFF;  B_OFF; C_OFF; D_OFF;        // 停机
  177.     count=0;
  178.   }
  179. }
  180. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码



收藏 评论1 发布时间:2016-8-27 09:06

举报

1个回答
老三鬼 回答时间:2019-8-8 11:20:36

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版