久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2555|回復: 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提供下載:
步進電機驅動程序.zip (2.41 KB, 下載次數: 23)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av影片在线 | 久久五月婷 | 午夜影院网站 | 在线免费看黄 | 免费视频一区二区三区在线观看 | 国产成人免费视频网站高清观看视频 | 国产精品成人一区二区三区夜夜夜 | 成人精品国产一区二区4080 | 久久精品中文 | 欧美精品一区在线发布 | 国产婷婷综合 | 国产成人精品免费 | 久久99精品国产99久久6男男 | 国产精品一区二区三区四区 | 91国在线视频 | 中文字幕亚洲精品 | 欧美精品一区二区三区在线播放 | 欧美一区二区三区 | 自拍中文字幕 | 久久久久久久电影 | 一级在线免费观看 | 一区二区三区四区不卡视频 | 国产精品视频在线观看 | 成人永久免费 | 中文字幕在线一区 | 欧美日韩中| 一区二区三区免费在线观看 | 欧美乱大交xxxxx另类电影 | 羞羞视频网页 | 99re6热在线精品视频播放 | 日韩手机在线视频 | 毛片a级| 亚洲网一区 | 欧美一区二区三区在线视频 | 亚洲精品在线免费观看视频 | 中文字幕综合 | 国产精品九九九 | 久久久久久91 | 免费观看黄色一级片 | 国产一区二区自拍 | 91亚洲国产成人精品一区二三 |