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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6366|回復: 1
打印 上一主題 下一主題
收起左側

步進電機STM32程序(用A4988控制)與限位開關配合使用

[復制鏈接]
跳轉到指定樓層
樓主
單片機是STM32的,有需要的可以參考一下,提供了.c和.h文件,只需添加在工程中就好,這里使用了3個步進電機和三個限位開關,添加的話可以對照著修改。
部分代碼顯示如下。
  1. #include "delay.h"
  2. #include "diver.h"
  3. #include "oled.h"
  4. #include "usart.h"
  5. //暫不知道步距角
  6. //電機引腳初始化
  7. extern u8 endB;

  8. void Step_Motor_GPIO_Init(void)
  9. {
  10.          GPIO_InitTypeDef  GPIO_InitStructure;
  11.          
  12.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能PA,PD端口時鐘
  13.                
  14.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;                                 // 端口配置
  15.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  16.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度為50MHz
  17.          GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根據設定參數初始化GPIOB.12高
  18.          
  19.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
  20.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  21.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度為50MHz
  22.          GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根據設定參數初始化GPIOB.12高
  23.         
  24.          limit1=1;
  25.          limit2=1;
  26.          limit3=1;
  27. }


  28. void SetMotor1_forward(u16 speed)
  29. {
  30.                 DIR1=False;  
  31.                 STEP1=1;
  32.                 delay_us(1);
  33.                 STEP1=0;
  34.                 delay_us(speed);
  35. }
  36. void SetMotor1_back(u16 speed)
  37. {
  38.                 DIR1=Turn; //后退
  39.                 STEP1=1;
  40.                 delay_us(1);
  41.                 STEP1=0;
  42.                 delay_us(speed);
  43. }

  44. void SetMotor2_forward(u16 speed)
  45. {
  46.                 DIR2=False;  
  47.                 STEP2=1;
  48.                 delay_us(1);
  49.                 STEP2=0;
  50.                 delay_us(speed);
  51. }
  52. void SetMotor2_back(u16 speed)
  53. {
  54.                 DIR2=Turn; //后退
  55.                 STEP2=1;
  56.                 delay_us(1);
  57.                 STEP2=0;
  58.                 delay_us(speed);
  59. }

  60. void SetMotor3_forward(u16 speed)
  61. {
  62.                 DIR3=False;  
  63.                 STEP3=1;
  64.                 delay_us(1);
  65.                 STEP3=0;
  66.                 delay_us(speed);
  67. }
  68. void SetMotor3_back(u16 speed)
  69. {
  70.                 DIR3=Turn; //后退
  71.                 STEP3=1;
  72.                 delay_us(1);
  73.                 STEP3=0;
  74.                 delay_us(speed);
  75. }

  76. void step1_forward(u16 steps,u16 speed)
  77. {
  78.         u16 i;
  79.         
  80.                 for(;i<=steps;i++)
  81.                                 {
  82.                                         if(limit_1==1)//判斷限位開關是否被按下,沒有則執行下去
  83.                                         SetMotor1_forward(speed);
  84.                                         else        break;//否則就跳出循環
  85.                                 }
  86.                                 USART1_RX_BUF[endB]=0;//清零準備下一次接收

  87. }

  88. void step1_back(u16 steps,u16 speed)
  89. {
  90.         u16 i;

  91.         for(;i<=steps;i++)
  92.                                 {
  93.                                         if(limit_2==1)
  94.                                         SetMotor1_back(speed);
  95.                                         else  break;
  96.                                 }
  97.                                 USART1_RX_BUF[endB]=0;
  98. }


  99. void step2_forward(u16 steps,u16 speed)
  100. {
  101.         u16 i;
  102.         
  103.                 for(;i<=steps;i++)
  104.                                 {
  105.                                         if(limit_2==1)
  106.                                         SetMotor2_forward(speed);
  107.                                         else  break;
  108.                                 }
  109.                                 USART1_RX_BUF[endB]=0;//清零準備下一次接收

  110. }

  111. void step2_back(u16 steps,u16 speed)
  112. {
  113.         u16 i;

  114.         for(;i<=steps;i++)
  115.                                 {
  116.                                         if(limit_2==1)
  117.                                         SetMotor2_back(speed);
  118.                                         else  break;
  119.                                 }
  120.                                 USART1_RX_BUF[endB]=0;
  121. }

  122. void step3_forward(u16 steps,u16 speed)
  123. {
  124.         u16 i;
  125.         
  126.                 for(;i<=steps;i++)
  127.                                 {
  128.                                         if(limit_3==1)
  129.                                         SetMotor3_forward(speed);
  130.                                         else  break;
  131.                                 }
  132.                                 USART1_RX_BUF[endB]=0;//清零準備下一次接收

  133. }

  134. void step3_back(u16 steps,u16 speed)
  135. {
  136.         u16 i;

  137.         for(;i<=steps;i++)
  138.                                 {
  139.                                         if(limit_3==1)
  140.                                         SetMotor3_back(speed);
  141.                                         else  break;
  142.                                 }
  143.                                 USART1_RX_BUF[endB]=0;
  144. }
  145. void step1_2_forward(u16 steps,u16 speed)
  146. {

  147. u16 i;

  148.         for(;i<=steps;i++)
  149.                                 {
  150.                                         if(limit_1==1&&limit_2==1)
  151.                                         {
  152.                                                 SetMotor1_forward(speed);
  153.                                           SetMotor2_forward(speed);//兩個步進電機一起運動
  154.                                         }
  155.                                                 else  break;
  156.                                 }
  157.      USART1_RX_BUF[endB]=0;
  158. }

  159. void step1_2_back(u16 steps,u16 speed)
  160. {

  161. u16 i;

  162.         for(;i<=steps;i++)
  163.                                 {
  164.                                         if(limit_1==1&&limit_2==1)
  165.                                         {
  166.                                                 SetMotor1_back(speed);
  167.                                           SetMotor2_back(speed);//兩個步進電機一起運動
  168.                                         }
  169.                                                 else  break;
  170.                                 }
  171.      USART1_RX_BUF[endB]=0;
  172. }






  173. /************以下是****************/
  174. //void STEP_1(u16 speed)
  175. //{ STEP1=0;delay_us(speed);  STEP2=0;  delay_us(speed);STEP3=0; delay_us(speed);STEP4=1;delay_us(speed);}
  176. //void STEP_2(u16 speed)
  177. //{ STEP1=0;delay_us(speed); STEP2=0; delay_us(speed);STEP3=1;delay_us(speed); STEP4=0;delay_us(speed);}
  178. //void STEP_4(u16 speed)
  179. //{ STEP1=0;  delay_us(speed);STEP2=1;delay_us(speed);STEP3=0;delay_us(speed); STEP4=0;delay_us(speed);}
  180. //void STEP_8(u16 speed)
  181. //{ STEP1=1;delay_us(speed); STEP2=0;delay_us(speed); STEP3=0;delay_us(speed);STEP4=0;delay_us(speed);}

  182. //void SetMotor_forward(u16 steps,u16 speed)//正轉
  183. //{
  184. //        u8 inch;
  185. //        u16 add;
  186. //        for(add=0;add<steps;add++)//轉半圈
  187. //        for(inch=0;inch<4;inch++)//完成一個拍數4*0.36°
  188. //                switch(inch)
  189. //                {
  190. //                        case 0:          STEP_1(speed);  break;
  191. //                  case 1:          STEP_2(speed);  break;
  192. //                        case 2:          STEP_4(speed);  break;
  193. //                        case 3:          STEP_8(speed);  break;
  194. //                }               
  195. //}
  196. //void SetMotor_back(u16 steps,u16 speed)//反轉
  197. //{
  198. //        u8 inch;
  199. //        u16 add;
  200. //        for(add=0;add<steps;add++)//轉半圈
  201. //        for(inch=0;inch<4;inch++)//完成一個拍數4*0.36°
  202. //                switch(inch)
  203. //                {
  204. //                        case 0:          STEP_8(speed);  break;
  205. //                  case 1:          STEP_4(speed);  break;
  206. //                        case 2:          STEP_2(speed);  break;
  207. //                        case 3:          STEP_1(speed);  break;
  208. //                }               
  209. //}
復制代碼

//已使用過,沒有任何問題。(使用的是4線二相的步進電機,末端注釋掉的是五線的,可用)

頭文件下載:
DIVER.zip (1.96 KB, 下載次數: 116)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:1062681 發表于 2024-3-19 10:31 | 只看該作者
USART1_RX_BUF[endB]=0;//清零準備下一次接收
請問這個串口這個去掉,會有問題嘛,這句話是用來提示當前狀態的嘛
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕a√ | 91视频.com | 第四色狠狠| 国产高清在线 | av在线视 | 国产农村一级国产农村 | 黄网站免费在线看 | 1区2区视频 | 久久精品视频一区二区 | h肉视频 | a中文在线视频 | 精品国产区 | 久久激情视频 | 涩涩视频网站在线观看 | 久久久久久电影 | 中文字幕视频在线观看 | 日韩二三区 | 色在线视频网站 | av在线免费播放 | 国产精品成人一区二区三区夜夜夜 | 亚洲天堂中文字幕 | 91精品国产91久久久久青草 | 自拍偷拍亚洲欧美 | 狠狠插狠狠操 | 久久精品久久久 | 久久久一二三 | 国产精品视频一二三区 | 国产激情视频在线 | 中文字幕一区在线观看视频 | 久久精品国产精品青草 | 久久久国产精品视频 | 中文字幕在线网 | 久久精品国产一区二区三区不卡 | 亚州精品天堂中文字幕 | 久久久久一区二区三区 | 久久亚洲欧美日韩精品专区 | 国产精品久久久久久久久久久免费看 | 亚洲视频区| 欧美成人免费电影 | 日日干日日射 | 成人不卡视频 |