找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1914|回复: 3
收起左侧

单片机步进电机的驱动程序模板可控制精度,有接口的调用方法

[复制链接]
ID:412460 发表于 2021-1-27 11:10 | 显示全部楼层 |阅读模式
初始化:
stepper_motor_init(stepper_motor_a_ptr);
stepper_motor_init(stepper_motor_b_ptr);

定时器需要放置的函数: 定时器暂用1ms,可根据应用修改
stepper_motor_timer(stepper_motor_a_ptr);
stepper_motor_timer(stepper_motor_b_ptr);
旋转配置:
stepper_motor_mode_set(stepper_motor_a_ptr,STEPPER_MOTOR_F,512,STEPPER_MOTOR_A_SPEED);  //Motor A顺时针转一圈
stepper_motor_mode_set(stepper_motor_b_ptr,STEPPER_MOTOR_R,512,STEPPER_MOTOR_B_SPEED);  //Motor B逆时针转一圈
stepper_motor_mode_set 参数说明:
1、结构体指针
2、旋转方向
   STEPPER_MOTOR_F  顺时针
   STEPPER_MOTOR_R  逆时针
   STEPPER_MOTOR_STOP  停止
3、旋转角度  (实际转动角度 = angle * 5.625 / 8)
4、旋转速度  1 最快,数值越大,速度越慢

单片机源程序如下:
  1. /*
  2. * @Descripttion:
  3. * @version:
  4. * @Author: linsuwei
  5. * @Date: 2020-10-27 10:39:36
  6. * @LastEditors: linsuwei
  7. * @LastEditTime: 2020-10-29 11:43:50
  8. */

  9. #include "stepper_motor.h"

  10. static u8 get_Offset(STEPPER_MOTOR_PTR stepmo_ptr);


  11. u32 a_motor_a_io[] = {
  12.     STEPPER_MOTOR_A_IO_0,
  13.     STEPPER_MOTOR_A_IO_1,
  14.     STEPPER_MOTOR_A_IO_2,
  15.     STEPPER_MOTOR_A_IO_3,
  16. };

  17. u32 a_motor_b_io[] = {
  18.     STEPPER_MOTOR_B_IO_0,
  19.     STEPPER_MOTOR_B_IO_1,
  20.     STEPPER_MOTOR_B_IO_2,
  21.     STEPPER_MOTOR_B_IO_3,
  22. };


  23. #define __IO_L    0
  24. #define __IO_F    1

  25. u8 stepper_timing_tab[] = {
  26.     __IO_L,__IO_F,__IO_F,__IO_F,    //pulse 1
  27.     __IO_L,__IO_L,__IO_F,__IO_F,    //pulse 2
  28.     __IO_F,__IO_L,__IO_F,__IO_F,    //...
  29.     __IO_F,__IO_L,__IO_L,__IO_F,
  30.     __IO_F,__IO_F,__IO_L,__IO_F,
  31.     __IO_F,__IO_F,__IO_L,__IO_L,
  32.     __IO_F,__IO_F,__IO_F,__IO_L,
  33.     __IO_L,__IO_F,__IO_F,__IO_L,
  34. };


  35. STEPPER_MOTOR_S stepper_motor_a = {
  36.     .mode = STEPPER_MOTOR_STOP,
  37.     .pulse = 0,
  38.     .speed = 1,
  39.     .max_step = 0,
  40.     .step = 0,
  41.     .timing_tab_ptr = &stepper_timing_tab[0],
  42.     .io_tab_ptr = &a_motor_a_io[0],
  43. };

  44. STEPPER_MOTOR_S stepper_motor_b = {
  45.     .mode = STEPPER_MOTOR_STOP,
  46.     .pulse = 0,
  47.     .speed = 1,
  48.     .max_step = 0,
  49.     .step = 0,
  50.     .timing_tab_ptr = &stepper_timing_tab[0],
  51.     .io_tab_ptr = &a_motor_b_io[0],
  52. };

  53. STEPPER_MOTOR_PTR stepper_motor_a_ptr = &stepper_motor_a;
  54. STEPPER_MOTOR_PTR stepper_motor_b_ptr = &stepper_motor_b;


  55. static u8 get_Offset(STEPPER_MOTOR_PTR stepmo_ptr)
  56. {
  57.     if(NULL == stepmo_ptr)
  58.         return 0;
  59.     if(STEPPER_MOTOR_F == stepmo_ptr->mode)
  60.         return stepmo_ptr->step;
  61.     else if(STEPPER_MOTOR_R == stepmo_ptr->mode)
  62.         return (7 - stepmo_ptr->step);
  63.     else
  64.         return stepmo_ptr->step;
  65. }


  66. void stepper_motor_stop(STEPPER_MOTOR_PTR stepmo_ptr)
  67. {
  68.     if(NULL == stepmo_ptr)
  69.         return;
  70.     for (u8 i = 0; i < 4; i++)
  71.     {
  72.         gpio_direction_input(stepmo_ptr->io_tab_ptr[i]);
  73.     }
  74.     stepmo_ptr->mode = STEPPER_MOTOR_STOP;
  75. }



  76. void stepper_motor_init(STEPPER_MOTOR_PTR stepmo_ptr)
  77. {
  78.     if(NULL == stepmo_ptr)
  79.         return;
  80.     stepmo_ptr->mode = STEPPER_MOTOR_STOP;
  81.     stepmo_ptr->step = 0;
  82.     stepmo_ptr->max_step = 0;
  83.     stepmo_ptr->pulse = 0;
  84.     stepmo_ptr->speed = 1;
  85.     stepmo_ptr->timing_tab_ptr = &stepper_timing_tab[0],
  86.     stepper_motor_stop(stepmo_ptr);
  87. }

  88. //减速比 64
  89. // Precision = 360 /((360/5.625)*64) = 5.625/64  控制精度
  90. // 实际转动角度 = (angle *8) * Precision = angle * 5.625 / 8

  91. void stepper_motor_mode_set(STEPPER_MOTOR_PTR stepmo_ptr, u8 mode, u16 angle ,u8 speed)
  92. {
  93.     if(NULL == stepmo_ptr)
  94.         return;
  95.     stepmo_ptr->mode = mode;
  96.     stepmo_ptr->speed = speed;
  97.     stepmo_ptr->max_step = angle * 8;   // 这里将精度放大 8倍,方便计算
  98.     if(STEPPER_MOTOR_STOP == mode)
  99.     {
  100.         stepper_motor_stop(stepmo_ptr);
  101.     }
  102. }



  103. void stepper_motor_timer(STEPPER_MOTOR_PTR stepmo_ptr)
  104. {
  105.     static u8 cnt = 0;
  106.     if(NULL == stepmo_ptr)
  107.         return;
  108.     if (STEPPER_MOTOR_STOP == stepmo_ptr->mode)
  109.     {
  110.         // stepper_motor_stop(stepmo_ptr);
  111.         return;
  112.     }
  113.     else
  114.     {
  115.         if (++cnt >= stepmo_ptr->speed)
  116.         {
  117.             cnt = 0;

  118.             if (stepmo_ptr->max_step > 0)
  119.             {
  120.                 if (++stepmo_ptr->pulse > stepmo_ptr->max_step)
  121.                 {
  122.                     stepmo_ptr->pulse = 0;
  123.                     stepmo_ptr->mode = STEPPER_MOTOR_STOP;
  124.                     stepper_motor_stop(stepmo_ptr);
  125.                     return;
  126.                 }
  127.             }
  128.             for (u8 i = 0; i < 4; i++)
  129.             {
  130.                 if (__IO_L == stepmo_ptr->timing_tab_ptr[get_Offset(stepmo_ptr) * 4 + i])
  131.                 {
  132.                     gpio_direction_output(stepmo_ptr->io_tab_ptr[i], 1);
  133.                 }
  134.                 else
  135.                 {
  136.                     gpio_direction_output(stepmo_ptr->io_tab_ptr[i], 0);
  137.                 }
  138.             }
  139.             stepmo_ptr->step = (++stepmo_ptr->step) & (8 - 1); //+1然后对8取余
  140.         }
  141.     }
  142. }
复制代码
51hei.png
所有资料51hei提供下载:
步进电机驱动程序.zip (2.41 KB, 下载次数: 23)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:328014 发表于 2021-1-27 18:18 | 显示全部楼层
这个程序真牛,能分享一下电路图吗?几相的电机,貌似还有位置反馈?
回复

使用道具 举报

ID:412460 发表于 2021-1-28 17:00 | 显示全部楼层
是5线的步进电机,没有位置反馈的,应用比较简单,只需要知道大概转动的角度!

11.pdf

136.04 KB, 下载次数: 12, 下载积分: 黑币 -5

补充一个原理图

回复

使用道具 举报

ID:869417 发表于 2021-1-29 08:59 | 显示全部楼层
正想做个分角器,正在考虑角度细分和精确度的问题,学习了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表