狗趴(GodPub),开源硬件学习与实践

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 23172|回复: 18
打印 上一主题 下一主题

蛋疼的机翻 AccelStepper Class Reference 【步进电机库】

[复制链接]

5

主题

36

帖子

141

积分

QQ群用户

积分
141
跳转到指定楼层
楼主
发表于 2015-2-13 19:26:58 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 囧囧-科技大神粉 于 2015-2-13 19:29 编辑
  1. http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html#a73bdecf1273d98d8c5fbcb764cabeea5ac3523e4cf6763ba518d16fec3708ef23

  2. 支持对步进电机加速等等。更多…
  3. 公共类型
  4. 枚举
  5. MotorInterfaceType {  //电机接口类型
  6.   FUNCTION = 0, DRIVER = 1, FULL2WIRE = 2, FULL3WIRE = 3,
  7.   FULL4WIRE = 4, HALF3WIRE = 6, HALF4WIRE = 8
  8. }
  9. 符号名为pin的数量。使用这个在AccelStepper针参数构造函数提供一个符号名的别针。
  10. FUNCTION        
  11. 使用功能接口,实现你自己的驱动程序功能(仅内部使用)
  12. DRIVER        
  13. 步进驱动,2线驱动。
  14. FULL2WIRE        
  15. 2线整步
  16. FULL3WIRE        
  17. 3线整步
  18. FULL4WIRE        
  19. 4线整步
  20. HALF3WIRE        
  21. 3线半步
  22. HALF4WIRE        
  23. 4线半步

  24. Public Member Functions//公共成员函数



  25. AccelStepper (uint8_t interface=AccelStepper::FULL4WIRE, uint8_t pin1=2, uint8_t pin2=3, uint8_t pin3=4, uint8_t pin4=5, bool enable=true)

  26. 参数
  27. [in]        interface
  28. 引脚数接口。1,2,4或8个都支持,但它是优选使用 MotorInterfaceType  符号名
  29. AccelStepper::DRIVER (1) 指步进驱动器(与步骤和方向引脚)。如果还需要一个能线,调用 setEnablePin()  施工后。您也可以使用反转引脚setPinsInverted().
  30. AccelStepper::FULL2WIRE (2)指2线步进(需要2个引脚)。
  31. AccelStepper::FULL3WIRE(3)指3线步进,如HDD主轴(需要3引脚)。
  32. AccelStepper::FULL4WIRE (4)意味着一个4线步进(4引脚 需要)。
  33. AccelStepper::HALF3WIRE (6) means a 3 wire half stepper, such as HDD spindle (3 pins required)
  34. AccelStepper::HALF4WIRE (8)指4线半步进(4引脚需要)默认为 AccelStepper::FULL4WIRE   (4) pins.

  35. [in]        pin1(步)
  36. Arduino的数字引脚数电机引脚1.默认为引脚2.对于 AccelStepper::DRIVER  (interface==1), 这是步骤输入到驱动器。从低到高的转变意味step)
  37. [in]        pin2(驱动方向)
  38. Arduino的数字引脚数电机引脚2.默认为引脚3.对于 AccelStepper::DRIVER  (interface==1), 这是方向输入的驱动程序。高意味着前进。

  39. [in]        pin3
  40. Arduino的数字引脚数电机引脚3.默认为引脚4.

  41. in]        pin4
  42. Arduino的数字引脚数电机引脚4.默认为引脚5.

  43. [in]        enable
  44. 如果这是1(默认), enableOutputs()  将被调用,以使输出引脚的施工时间。

  45. References DIRECTION_CCW, enableOutputs(), and setAcceleration().

  46. AccelStepper (void(*forward)(), void(*backward)())
  47. 可选的构造,将调用自己的功能向前和向后的步骤。 你可以有多个同时步进,所有运动以不同的速度和加速度,只要你调用它们的run() 在足够频繁的时间间隔功能。
  48. 当前位置被设置为0,目标位置被设定为0。
  49. MaxSpeed and Acceleration 默认为1.0。
  50. 任何运动初始化应 发生前,  无引脚使用或初始化。

  51. 参数
  52. [in]        forward
  53. 空隙返回程序,这将使向前一步
  54. [in]        backward
  55. 空隙返回程序,这将使倒退
  56. References DIRECTION_CCW, and setAcceleration().

  57. void         moveTo (long absolute)
  58. 设置目标位置. run() 函数将试图将电动机(每次调用最多一步)从当前位置到目标位置的最近调用这个函数。注意:moveTo 也会重新计算速度对下一步骤。如果你要使用恒速运动,应该调用setSpeed() 后调用moveTo().

  59. 参数
  60. [in]        absolute
  61. 所需的绝对位置。负为0的位置逆时针。
  62. Examples:
  63. Bounce.pde, MultiStepper.pde, Overshoot.pde, ProportionalControl.pde, Quickstop.pde, and Random.pde.
  64. References computeNewSpeed().
  65. Referenced by move(), and runToNewPosition().

  66. void         move (long relative)
  67. 设置目标位置相对于当前位置
  68. 参数

  69. [in]        relative
  70. 所需的位置相对于当前位置。负是从当前位置逆时针。
  71. References moveTo().
  72. Referenced by stop().


  73. boolean         run ()
  74. 投票电机和步骤,如果一步是因为,实施加速度
  75. 和减速到acheive目标位置。必须以最小的步骤的时间间隔称之为尽可能频繁地,但至少一次,最好是在主回路。请注意,每个调用 run() 将至多一个步,然后,只有当一个步是由于,基于当前速度和自最后步骤的时间。

  76. 返回
  77. 真 , 如果电机仍在运行到目标位置。

  78. Examples:
  79. Bounce.pde, MultiStepper.pde, Overshoot.pde, Quickstop.pde, and Random.pde.
  80. References computeNewSpeed(), distanceToGo(), and runSpeed().
  81. Referenced by runToPosition().

  82. boolean         runSpeed ()
  83. 轮询电机,并加强它 如果一个步骤是因为,实施恒定的速度通过最近一次调用的设置为setSpeed().必须每步的时间间隔称此尽可能频繁地,但至少一次,
  84. 返回
  85. 真的,如果电机得到进一步加强。

  86. Examples:
  87. ConstantSpeed.pde.
  88. References DIRECTION_CW, and step().
  89. Referenced by run(), and runSpeedToPosition().


  90. void         setMaxSpeed (float speed)
  91. 设置允许的最大速度。在 run() 函数将加速上升的速度通过该功能设定。注意:最高速度可达到取决于你的处理器和时钟速度。
  92. 参数
  93. [in]        speed
  94. 所需的最大速度在每秒步骤。
  95. 必须>0。注意事项:速度超过了处理器所支持的最高速度在非线性加速和减速可能会导致。
  96. void         setAcceleration (float acceleration)
  97. 设定加速/减速速率。
  98. Parameters
  99. [in]        acceleration
  100. 所需的加速的步/秒秒,acceleration>0.0。这是一种昂贵的调用,因为它需要一个平方根来计算的。尽量少用
  101. Examples:
  102. Blocking.pde, Bounce.pde, MultiStepper.pde, Overshoot.pde, Quickstop.pde, and Random.pde.
  103. References computeNewSpeed().
  104. Referenced by AccelStepper().

  105. void         setSpeed (float speed)
  106. 设置所需的恒定速度与使用 runSpeed().
  107. 参数
  108. [in]        speed
  109. 所需的恒定速度在每秒步骤。正为顺时针。每秒超过1000步的速度是不可靠的。非常慢的速度可以设置(如0.00027777对每小时一次,大约。速度精度取决于Arduino的结晶。抖动取决于你如何频繁调用 runSpeed()函数。
  110. float         speed ()
  111. 最近设置的速度
  112. 返回
  113. 最近的速度在每秒步
  114. Referenced by setMaxSpeed(), and setSpeed().
  115. long         distanceToGo ()
  116. 从当前位置到目标位置的距离。
  117. 返回
  118. 从当前位置到在步骤目标位置的距离。正为顺时针从当前位置。
  119. Examples:
  120. Bounce.pde, MultiStepper.pde, and Random.pde.
  121. Referenced by computeNewSpeed(), and run().


  122. long         targetPosition ()
  123. 最近设置的目标位置。
  124. 返回
  125. 在步骤目标位置。正为顺时针方向从0位置。
  126. long         currentPosition ()
  127. 当前电动机位置。
  128. 返回
  129. 在步骤的当前电动机位置。正为顺时针方向从0位置。
  130. 例如:
  131. Bounce.pde, MultiStepper.pde, Overshoot.pde, and Quickstop.pde.
  132. void         setCurrentPosition (long position)
  133. 重置马达的当前位置,使得无论电动机恰好是正确的,现在被认为是新的0位置。可用来设定一个初始的硬件定位运动后步进零位。具有当前马达速度设置为0的副作用。
  134. [in]        position
  135. 设置步进电机现在的位置
  136. void         runToPosition ()
  137. 使电机的当前选定的恒定速度(前进或后退)到目标位置和阻塞,直到它在位置上。不使用此事件循环,因为它会阻止。
  138. Examples:
  139. Quickstop.pde.
  140. References run().
  141. Referenced by runToNewPosition().

  142. boolean         runSpeedToPosition ()
  143. 运行在当前选择的速度,直到到达目标位置不执行加速度。
  144. 返回
  145. 1,如果它在运行?//true if it stepped
  146. void         runToNewPosition (long position)
  147. 移动电机到新的目标位置和阻塞,直到它在位置上。不使用此事件循环,因为它会阻止。
  148. [in]        position
  149. 新的目标位置。
  150. Examples:
  151. Blocking.pde, and Overshoot.pde.
  152. References moveTo(), and runToPosition().

  153. void         stop ()
  154. 设置一个新的目标位置,导致步进停止尽可能快,使用当前的速度和加速度的参数。
  155. Examples:
  156. Quickstop.pde.
  157. References move().

  158. virtual void         disableOutputs ()
  159. 通过设置他们都LOW根据您的电子产品的设计,这可能在电源关闭的电机线圈,省电禁用电机引脚输出。这是非常有用的支持Arduino的低功耗模式:睡眠,然后重新启用期间禁用输出 withenableOutputs()  前再次加强。
  160. virtual void         enableOutputs ()
  161. 通过设置电机引脚输出模式使电机引脚输出。由构造自动调用。
  162. References FULL3WIRE, FULL4WIRE, HALF3WIRE, and HALF4WIRE.
  163. Referenced by AccelStepper().

  164. void         setMinPulseWidth (unsigned int minWidth)
  165. 设置由步进驱动所允许的最小脉冲宽度。最小实际脉冲宽度为大约20微秒。时间小于20微秒,通常会导致在20微秒左右。
  166. [in]        minWidth
  167. 的最小脉冲宽度为微秒。

  168. void         setEnablePin (uint8_t enablePin=0xff)
  169. 设置步进驱动器的使能引脚数量。 0xFF的指示未使用(默认)。否则,如果一个引脚设置,引脚将在何时开启enableOutputs() 调用并关机的时候disableOutputs() 调用
  170. Parameters
  171. [in]        enablePin
  172. 电机使Arduino的数字引脚数
  173. See Also
  174. setPinsInverted

  175. void         setPinsInverted (bool directionInvert=false, bool stepInvert=false, bool enableInvert=false)
  176. 设置反转步进驱动器引脚
  177. 参数
  178. [in]        directionInvert        为True变换方向针,假的非反转
  179. [in]        stepInvert        为True反转步销,假的非反转
  180. [in]        enableInvert        为True反转使能引脚,假(默认值)的非反转

  181. void         setPinsInverted (bool pin1Invert, bool pin2Invert, bool pin3Invert, bool pin4Invert, bool enableInvert)
  182. 设置反转2,3和4线步进针脚
  183. 参数
  184. [in]        pin1Invert        为True反转PIN1,假的非反转
  185. [in]        pin2Invert        为True反转PIN2码,假的非反转
  186. [in]        pin3Invert        为True反转PIN3,假的非反转
  187. [in]        pin4Invert        为True反转PIN4,假的非反转
  188. [in]        enableInvert        为True反转使能引脚,假(默认值)的非反转


  189. Protected Types//保护类型

  190. Direction { DIRECTION_CCW = 0, DIRECTION_CW = 1 }
  191. 转向指示器符号名马达转动的方向。
  192. 枚举
  193. DIRECTION_CCW
  194. 顺时针方向。
  195. DIRECTION_CW
  196. 逆时针方向。

  197. Protected Member Functions

  198. //受保护的成员函数
  199. void         computeNewSpeed ()
  200. 强制库来计算一个新的瞬时速度,并设置为当前的速度。这就是所谓的库:
  201. ~在每一步之后
  202. ~在通过setMaxSpeed() 改变setMaxSpeed之后
  203. ~在通过setAcceleration()改变setAcceleration之后
  204. ~在通过move() or moveTo() 改变目标位置(相对或绝对)之后
  205. virtual void         setOutputPins (uint8_t mask)
  206. 低电平函数来设置电机输出引脚位0掩码对应_pin[0]位掩码1对应_pin[1]您可以覆盖这impment,例如串行芯片输出insted的直接使用输出引脚
  207. Examples:
  208. MotorShield.pde.
  209. References FULL3WIRE, FULL4WIRE, HALF3WIRE, and HALF4WIRE.
  210. Referenced by disableOutputs(), step1(), step2(), step3(), step4(), step6(), and step8().

  211. virtual void         step (long step)
  212. 所谓以执行步骤。只有当需要的新的一步调用。子类可以重写,以实现新的步进接口。缺省调用step1(), step2(), step4() or step8() ,这取决于对步进定义的管脚数。
  213. Parameters
  214. [in]        step        当前步相位数(0到7)
  215. virtual void         step0 (long step)
  216. 所谓执行使用步进功能(pins = 0),只有当需要的新的一步称为步。调用_forward() or _backward() 来执行步
  217. [in]        step        当前步相位数(0到7)
  218. virtual void         step1 (long step)
  219. 叫上执行步进驱动器的步骤(例如那里pins == 1)。只有当需要的新的一步调用。子类可以重写,以实现新的步进接口。
  220. 默认设置或清除步骤的pin1步骤的输出,  并设置_pin2向所希望的方向的输出。 步骤引脚(_pin1)是脉冲1微秒 这是最低STEP脉冲宽度为3967的驱动程序。
  221. [in]        step        当前步相位数(0到7)
  222. References setOutputPins().
  223. Referenced by step().

  224. virtual void         step2 (long step)
  225. 所谓的执行上2针电机的一个步骤。只有当需要的新的一步调用。子类可以重写,以实现新的步进接口。默认设置或清除PIN1和PIN2的输出
  226. virtual void         step3 (long step)
  227. 所谓的执行上3针电机,如HDD主轴的一步。只有当需要的新的一步调用。子类可以重写,以实现新的步进接口。默认设置或清除的PIN1,PIN2,Pin3输出
  228. virtual void         step4 (long step)
  229. 所谓执行一个4针电机的一个步骤。只有当需要的新的一步调用。子类可以重写,以实现新的步进接口。默认设置或清除PIN1,PIN2,PIN3,PIN4的输出。
  230. virtual void         step6 (long step)
  231. 所谓的执行上3针电机,如HDD主轴的一步。只有当需要的新的一步调用。子类可以重写,以实现新的步进接口。默认设置或清除的PIN1,PIN2,3脚输出
  232. virtual void         step8 (long step)
  233. 所谓执行一个4针半步r电机的一个步骤。只有当需要的新的一步调用。子类可以重写,以实现新的步进接口。默认设置或清除PIN1,PIN2,PIN3,PIN4的输出。


  234. 详细说明
  235. 支持步进电机加速等等。
  236. 这定义了单个2或4引脚的步进电机,或具有fdriver芯片步进启动子,可选的加速,减速,绝对定位命令等多个同时步进机都支持,都以不同的速度和加速度移动。
  237. =================
  238. 运算
  239. 此模块通过计算在微秒的步的时间。由调用者被改变后的各步与速度和加速度参数之后的步的时间被重新计算。每个步骤的时间被记录在微秒。在run()函数步骤电机一次,如果的新的一步到期。该run()函数必须被频繁调用直到电机是在所需的位置,在这之后时间运行()什么也不做。
  240. =============
  241. 定位
  242. 位置由一个符号长整型指定。在施工时,马达的当前位置被认为是0正的位置是沿顺时针方向从初始位置;负位置是逆时针。当前位置可以初始化定位之后被改变对于实例。
  243. ===============
  244. 警告
  245. 这是一个开环控制器:如果电机摊位或oversped,AccelStepper不会有当电机确实是一个正确的想法(因为电机的实际位置的任何反馈。我们只知道,我们认为这是相对的。到初始开始点)。
  246. ===============
  247. 性能
  248. 可以可靠地支撑最快电机速度是每秒约4000步在16兆赫上的Arduino如乌诺等更快的处理器的时钟频率可以支持更快步进速度。然而,比下降到非常低的速度(远小于1每秒)也支持的任何速度更小,所提供的run()函数被调用足够频繁到步骤电动机每当需要的速度设定。调用setAcceleration()是昂贵的,因为它需要一个平方根来计算的。
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏

5

主题

36

帖子

141

积分

QQ群用户

积分
141
19#
 楼主| 发表于 2015-2-24 19:35:38 | 只看该作者
卓泰科技 发表于 2015-2-24 18:03
想要精确输出脉冲,试试定时器

外部定时器 + arduino的外部中断?

84

主题

143

帖子

725

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
725
QQ
18#
发表于 2015-2-24 18:03:00 | 只看该作者
想要精确输出脉冲,试试定时器
天理路上甚宽,稍游心,胸中便觉广大宏朗;
人欲路上甚窄,才寄迹,眼前俱是荆棘泥涂。

5

主题

36

帖子

141

积分

QQ群用户

积分
141
17#
 楼主| 发表于 2015-2-24 16:32:56 | 只看该作者
大材小用,泪流满面的arduino
对于步进电机驱动器的控制要点在于,输出脉冲的尽量稳定。这就要求,充当控制器的单片机要专注,尽量减少其他无关的事情
比如串口通信,在9600下,哪怕4个字节的接收,也会带来3.6ms的延迟,在400us为周期下,这就是9个脉冲周期了
所以,如果字节数太多,就必然影响脉冲,所以,单字节控制,依靠ASCII码进行定义的控制方式就出现了~~~

  1. /*
  2. 纯串口控制
  3.   加入脱机控制
  4. */


  5. //电机的高电平持续时间 us
  6. int maichongjiangeMax=1260;
  7. int maichongjiangeMin=120;
  8. long maichongjiangeSet=600;

  9. //电机的高电平持续时间的初始值 0us
  10. int maichongjiange=0;

  11. //脉冲的占空比为1/maichongzhankongbi
  12. int maichongzhankongbi=4;

  13. //加减速时速度每隔300us变化一次
  14. int jiajiansubianhuashijian=300;


  15. ////////////////////////////////////////////
  16. int kongzhifangshi;//控制方式,低电平则为串口控制,高电平为按键控制
  17. int jsq1=0;
  18. int tempint;
  19. char kongzhimingling[5];

  20. boolean testxinxi=0;


  21. boolean fangxiang=0;//电机转动方向标识
  22. int maichongjsq=0;//脉冲计数器


  23. unsigned long time1=micros();
  24. unsigned long time2=micros();


  25. void setup(){

  26. //为防止意外,先行定义为20%的运行速度
  27. kongzhimingling[0]=fangxiang+48;
  28. kongzhimingling[1]=49;
  29. kongzhimingling[2]=48;
  30. kongzhimingling[3]=79;//ascII 79=O ON

  31. Serial.begin(9600);


  32. /*
  33. 暂定A0 analogRead(0)的值来确定转速
  34. 为方便演示,此处为使用1K 多圈精密可调电阻,A0就接在中间脚上
  35. 那么可见,其电压大致为0-5v之间,现在就电压区间进行分级
  36. 如果粗分为10档,就意味着每100个返回单位对应10%的速度
  37. */

  38. pinMode(7, OUTPUT);// EN+,脱机,高电平有效
  39. pinMode(8, OUTPUT);// CW+,方向
  40. pinMode(9, OUTPUT);// CLK+,频率(转速)

  41. digitalWrite(7, HIGH);//电机默认脱机
  42. digitalWrite(8, LOW);//
  43. digitalWrite(9, LOW);

  44. }


  45. void loop(){




  46.    while (Serial.available() > 0) {

  47.     //丧心病狂的1位控制,0延迟,纯ASCII分拆
  48.         //定义1 0-9表示转速,每一个表示10%
  49.         //定义2 A正转、B反转
  50.         //定义3 C联机、D脱机
  51.        
  52.    tempint=Serial.read();
  53.    
  54.    //调速度
  55.    if(tempint>47 && tempint< 58) maichongjiangeSet = 625/(0.5+4.5*(tempint-48)/10);//0-1023
  56.    //调方向
  57.    if(tempint==65)digitalWrite(8, 0);
  58.    if(tempint==66)digitalWrite(8, 1);
  59.     //脱机
  60.    if(tempint==67)digitalWrite(7, 0);
  61.    if(tempint==68)digitalWrite(7, 1);
  62.    
  63.    tempint=0;

  64. }






  65. //加速过程
  66. while(maichongjiange>maichongjiangeSet){
  67.   jiasu();
  68.   maichongqudong();
  69.   }

  70.   //加减过程
  71. while(maichongjiange<maichongjiangeSet){
  72.   jiansu();
  73.   maichongqudong();
  74.   }

  75. //在脉冲频率无变化的时候驱动电机正常运行
  76. maichongqudong();





  77. }






  78. void jiasu() //脉冲加速过程
  79. {

  80. if(micros()-time1>jiajiansubianhuashijian && maichongjiange>maichongjiangeMin){//加速过程,xxx us加速一次,加速到 yyy为止
  81. maichongjiange--;
  82. time1=micros();
  83. }

  84. }

  85. void jiansu()//脉冲减速过程
  86. {

  87. if(micros()-time1>jiajiansubianhuashijian && maichongjiange<maichongjiangeMax){
  88. maichongjiange++;
  89. time1=micros();
  90. }

  91. }


  92. void maichongqudong()//脉冲驱动
  93. {



  94. //步进电机控制脉冲
  95. if (micros()-time2 > maichongjiange){

  96.         maichongjsq++;//每过一个“脉冲间隔”时间段,则“脉冲计数器”自增1
  97.         maichongjsq=maichongjsq%maichongzhankongbi;//对“脉冲计数器”取模,这个取摸结果实质就是对占空比的调节(占空比为1/模),以4为例,则“脉冲计数器”的变化为:0——1——2——3——0

  98.         if(maichongjsq==0)digitalWrite(9, HIGH);//输出控制步进电机的电平
  99.         else digitalWrite(9, LOW);

  100.      time2= micros();
  101. }

  102. }


复制代码


5

主题

36

帖子

141

积分

QQ群用户

积分
141
16#
 楼主| 发表于 2015-2-24 15:31:21 | 只看该作者
djc5-3 反向时减速在加速的过程太快,导致噪音,所以直接去掉


/*
纯串口控制
  加入脱机控制
*/


//电机的高电平持续时间 us
int maichongjiangeMax=1260;
int maichongjiangeMin=120;
long maichongjiangeSet=600;

//电机的高电平持续时间的初始值 0us
int maichongjiange=0;

//脉冲的占空比为1/maichongzhankongbi
int maichongzhankongbi=4;

//加减速时速度每隔300us变化一次
int jiajiansubianhuashijian=300;


////////////////////////////////////////////
int kongzhifangshi;//控制方式,低电平则为串口控制,高电平为按键控制
int jsq1=0;
int tempint;
char kongzhimingling[5];

boolean testxinxi=0;


boolean fangxiang=0;//电机转动方向标识
int maichongjsq=0;//脉冲计数器


unsigned long time1=micros();
unsigned long time2=micros();


void setup(){

//为防止意外,先行定义为20%的运行速度
kongzhimingling[0]=fangxiang+48;
kongzhimingling[1]=49;
kongzhimingling[2]=48;
kongzhimingling[3]=79;//ascII 79=O ON

Serial.begin(9600);


/*
暂定A0 analogRead(0)的值来确定转速
为方便演示,此处为使用1K 多圈精密可调电阻,A0就接在中间脚上
那么可见,其电压大致为0-5v之间,现在就电压区间进行分级
如果粗分为10档,就意味着每100个返回单位对应10%的速度
*/

pinMode(7, OUTPUT);// EN+,脱机,高电平有效
pinMode(8, OUTPUT);// CW+,方向
pinMode(9, OUTPUT);// CLK+,频率(转速)

digitalWrite(7, HIGH);//电机默认脱机
digitalWrite(8, LOW);//
digitalWrite(9, LOW);

}


void loop(){




   while (Serial.available() > 0) {

    //格式:方向(1位),速度百分比(2位),脱机(1位) 如012O / 012F
//kongzhimingling[jsq1]= Serial.read();
   tempint=Serial.read();

if(jsq1==0){   

  if(tempint==48 || tempint==49)kongzhimingling[0]= tempint;        

  }else if(jsq1==1 || jsq1==2){
          
  if(tempint>47 && tempint<58)kongzhimingling[jsq1]= tempint;        

}else if(jsq1==3){

   if(tempint==79 || tempint==70) kongzhimingling[3]= tempint;
}

if(jsq1<3)delayMicroseconds(1200);
jsq1++;


testxinxi=1;
  }

  if(testxinxi){
   testxinxi=0;
   jsq1=0;
   Serial.print("get:");
      Serial.println(kongzhimingling);  

//脱机
if(kongzhimingling[3]==79)digitalWrite(7, LOW);
else if(kongzhimingling[3]==70){
  digitalWrite(7, HIGH);
  Serial.println("off-line");
}

   //速度调节

   maichongjiangeSet = 625/(0.5+4.5*((kongzhimingling[1]-48)*10+kongzhimingling[2]-48)/100);//0-1023

   Serial.print("maichongjiangeSet:");
      Serial.println(maichongjiangeSet);  

   //方向调节

  if(kongzhimingling[0]-48 != fangxiang){ //有效高电平且现在电机转速与设置相反

     Serial.println("change");


  //2、记录新的方向
  fangxiang=!fangxiang;

  //3、反方向
  digitalWrite(8, fangxiang);



  }else  Serial.println("keep");


}






//加速过程
while(maichongjiange>maichongjiangeSet){
  jiasu();
  maichongqudong();
  }

  //加减过程
while(maichongjiange<maichongjiangeSet){
  jiansu();
  maichongqudong();
  }

//在脉冲频率无变化的时候驱动电机正常运行
maichongqudong();





}






void jiasu() //脉冲加速过程
{

if(micros()-time1>jiajiansubianhuashijian && maichongjiange>maichongjiangeMin){//加速过程,xxx us加速一次,加速到 yyy为止
maichongjiange--;
time1=micros();
}

}

void jiansu()//脉冲减速过程
{

if(micros()-time1>jiajiansubianhuashijian && maichongjiange<maichongjiangeMax){
maichongjiange++;
time1=micros();
}

}


void maichongqudong()//脉冲驱动
{



//步进电机控制脉冲
if (micros()-time2 > maichongjiange){

        maichongjsq++;//每过一个“脉冲间隔”时间段,则“脉冲计数器”自增1
        maichongjsq=maichongjsq%maichongzhankongbi;//对“脉冲计数器”取模,这个取摸结果实质就是对占空比的调节(占空比为1/模),以4为例,则“脉冲计数器”的变化为:0——1——2——3——0

        if(maichongjsq==0)digitalWrite(9, HIGH);//输出控制步进电机的电平
        else digitalWrite(9, LOW);

     time2= micros();
}

}




5

主题

36

帖子

141

积分

QQ群用户

积分
141
15#
 楼主| 发表于 2015-2-19 21:41:17 | 只看该作者

上程序,蓝牙的
控制上
正:1
反:0
速度上:axx,a其实是占位符

  1. /*
  2. djc3 无极调速 + 串口控制
  3. 规定Pin4口为一个判断点,
  4. 低电平则为串口控制,高电平为按键控制
  5. 对串口的输入做限制,必须为数字

  6. */


  7. //电机的高电平持续时间 us
  8. int maichongjiangeMax=1260;
  9. int maichongjiangeMin=120;
  10. long maichongjiangeSet;

  11. //电机的高电平持续时间的初始值 0us
  12. int maichongjiange=0;

  13. //脉冲的占空比为1/maichongzhankongbi
  14. int maichongzhankongbi=4;

  15. //加减速时速度每隔300us变化一次
  16. int jiajiansubianhuashijian=300;


  17. ////////////////////////////////////////////
  18. int kongzhifangshi;//控制方式,低电平则为串口控制,高电平为按键控制
  19. int jsq1=0;
  20. int tempint;
  21. char kongzhimingling[4];



  22. boolean testxinxi=0;

  23. int Pinval;//存储IO口(Pin5、Pin6)高低电平的值

  24. boolean fangxiang=0;//电机转动方向标识
  25. int maichongjsq=0;//脉冲计数器


  26. unsigned long time1=micros();
  27. unsigned long time2=micros();


  28. void setup(){

  29. //为防止意外,先行定义为20%的运行速度
  30. kongzhimingling[0]=fangxiang+48;
  31. kongzhimingling[1]=49;
  32. kongzhimingling[2]=48;


  33. Serial.begin(9600);

  34. //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向) 输入状态,就读取值来确定电机的转动方向
  35. pinMode(5, INPUT);  
  36. pinMode(6, INPUT);  

  37. /*
  38. 暂定A0 analogRead(0)的值来确定转速
  39. 为方便演示,此处为使用1K 多圈精密可调电阻,A0就接在中间脚上
  40. 那么可见,其电压大致为0-5v之间,现在就电压区间进行分级
  41. 如果粗分为10档,就意味着每100个返回单位对应10%的速度
  42. */

  43. pinMode(7, OUTPUT);// EN+,脱机,高电平有效
  44. pinMode(8, OUTPUT);// CW+,方向
  45. pinMode(9, OUTPUT);// CLK+,频率(转速)

  46. digitalWrite(7, LOW);//电机默认联机
  47. digitalWrite(8, LOW);//
  48. digitalWrite(9, LOW);

  49. }


  50. void loop(){

  51. kongzhifangshi = digitalRead(4);

  52. if(kongzhifangshi==1){

  53. //转速调节,通过可变电阻实现无极调速

  54.   //可能是读取过于频繁,导致夹杂着无效数值,所以此处做个循环
  55.   do
  56.   {
  57. maichongjiangeSet = analogRead(0);//0-1023
  58. }while(maichongjiangeSet >1024);

  59. // 25% us =1000,000/(圈/每秒*400*4)=625/(0.5【min】+4.5×analogRead(0)/1024)
  60. //即把电压线性到转速上
  61.   maichongjiangeSet = 625/(0.5+4.5*maichongjiangeSet/1024);//0-1023

  62. fangxiangchange(); //转动方向的切换

  63. }else{


  64.    while (Serial.available() > 0) {

  65.     //格式:方向(1位),速度百分比(2位) 如012
  66. //kongzhimingling[jsq1]= Serial.read();
  67. if(jsq1==0){        
  68.   tempint=Serial.read();
  69.   if(tempint==48 || tempint==49)kongzhimingling[0]= tempint;        
  70. }else{
  71.   tempint=Serial.read();
  72.   if(tempint>47 && tempint<58)kongzhimingling[jsq1]= tempint;        

  73. }

  74. delayMicroseconds(1200);
  75. jsq1++;
  76. if(jsq1==3) jsq1=0;

  77. testxinxi=1;
  78.   }

  79.   if(testxinxi){
  80.    testxinxi=0;
  81.    jsq1=0;
  82.    Serial.print("get:");
  83.       Serial.println(kongzhimingling);  
  84.    //速度调节


  85.    maichongjiangeSet = 625/(0.5+4.5*((kongzhimingling[1]-48)*10+kongzhimingling[2]-48)/100);//0-1023

  86.    Serial.print("maichongjiangeSet:");
  87.       Serial.println(maichongjiangeSet);  

  88.    //方向调节

  89.   if(kongzhimingling[0]-48 != fangxiang){ //有效高电平且现在电机转速与设置相反

  90.      Serial.println("change");


  91.   //1、把速度降到最低
  92.   while(maichongjiange<maichongjiangeMax){
  93.   jiansu();
  94.   maichongqudong();
  95.   }

  96. // Serial.println("jiansuOK");

  97.   //2、记录新的方向
  98.   fangxiang=!fangxiang;

  99.   //3、反方向
  100.   digitalWrite(8, fangxiang);

  101.   //4、在把速度加到原来值
  102.   while(maichongjiange<maichongjiangeSet){
  103.   jiasu();
  104.   maichongqudong();
  105.   }

  106.   //Serial.println("jiasuOK");

  107.   }else  Serial.println("keep");


  108. }




  109. }



  110. //加速过程
  111. while(maichongjiange>maichongjiangeSet){
  112.   jiasu();
  113.   maichongqudong();
  114.   }

  115.   //加减过程
  116. while(maichongjiange<maichongjiangeSet){
  117.   jiansu();
  118.   maichongqudong();
  119.   }

  120. //在脉冲频率无变化的时候驱动电机正常运行
  121. maichongqudong();





  122. }






  123. void jiasu() //脉冲加速过程
  124. {

  125. if(micros()-time1>jiajiansubianhuashijian && maichongjiange>maichongjiangeMin){//加速过程,xxx us加速一次,加速到 yyy为止
  126. maichongjiange--;
  127. time1=micros();
  128. }

  129. }

  130. void jiansu()//脉冲减速过程
  131. {

  132. if(micros()-time1>jiajiansubianhuashijian && maichongjiange<maichongjiangeMax){
  133. maichongjiange++;
  134. time1=micros();
  135. }

  136. }


  137. void maichongqudong()//脉冲驱动
  138. {



  139. //步进电机控制脉冲
  140. if (micros()-time2 > maichongjiange){

  141.         maichongjsq++;//每过一个“脉冲间隔”时间段,则“脉冲计数器”自增1
  142.         maichongjsq=maichongjsq%maichongzhankongbi;//对“脉冲计数器”取模,这个取摸结果实质就是对占空比的调节(占空比为1/模),以4为例,则“脉冲计数器”的变化为:0——1——2——3——0

  143.         if(maichongjsq==0)digitalWrite(9, HIGH);//输出控制步进电机的电平
  144.         else digitalWrite(9, LOW);

  145.      time2= micros();
  146. }

  147. }


  148. void fangxiangchange() //转动方向的切换
  149. {



  150.   //关于反向,虽然直接对引脚进行控制也是可以的,但加入一个,减速——取反——加速的过程应该更好
  151. /*本例中,
  152. pin7, EN+,脱机,高电平有效
  153. pin8, CW+,方向
  154. pin9, CLK+,频率(转速)
  155. 已经用掉了,假设加减速、方向都由外部控制,那么很显然,就会出现2种控制方式:
  156. A、模拟方式,即通过测量2个点电阻变化所导致的分压变化,即可实现强弱、方向的调节,具体类似于ACS712的读取,此方式可以类似于“无级变速”
  157. B、数字方式,即通过摇杆或4个微动开关,来分别实现加减速、方向的切换

  158. 就实际操作而言,速度上测电阻分压,方向上用微动开关比较合适,即用2个数字口+1个PWM口实现具体控制
  159. */

  160. Pinval = digitalRead(5);  //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向)

  161. if(Pinval==1 && fangxiang){ //有效高电平且现在电机转速与设置相反

  162. //1、把速度降到最低
  163. while(maichongjiange<maichongjiangeMax){
  164. jiansu();
  165. maichongqudong();
  166.     }
  167. //2、反方向
  168. digitalWrite(8, LOW);
  169. //3、记录新的方向
  170. fangxiang=0;
  171. //4、在把速度加到原来值
  172. while(maichongjiange<maichongjiangeSet){
  173. jiasu();
  174. maichongqudong();
  175.     }

  176. }

  177. Pinval = digitalRead(6);  //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向)

  178. if(Pinval==1 && !fangxiang){ //有效高电平且现在电机转速与设置相反

  179. //1、把速度降到最低
  180. while(maichongjiange<maichongjiangeMax){
  181. jiansu();
  182. maichongqudong();
  183.     }
  184. //2、反方向
  185. digitalWrite(8, HIGH);
  186. //3、记录新的方向
  187. fangxiang=1;
  188. //4、在把速度加到原来值
  189. while(maichongjiange<maichongjiangeSet){
  190. jiasu();
  191. maichongqudong();
  192.     }

  193. }




  194. }
复制代码





84

主题

143

帖子

725

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
725
QQ
14#
发表于 2015-2-19 18:11:44 | 只看该作者
囧囧大神威武
天理路上甚宽,稍游心,胸中便觉广大宏朗;
人欲路上甚窄,才寄迹,眼前俱是荆棘泥涂。

5

主题

36

帖子

141

积分

QQ群用户

积分
141
13#
 楼主| 发表于 2015-2-19 14:41:33 | 只看该作者
本帖最后由 囧囧-科技大神粉 于 2015-2-19 14:49 编辑




TNND 土豆的流畅完全不能看,算了@百度盘,原始视频


http://pan.baidu.com/s/1kTHv6T5




5

主题

36

帖子

141

积分

QQ群用户

积分
141
12#
 楼主| 发表于 2015-2-18 14:07:59 | 只看该作者
  1. /*
  2. djc3 无极调速 + 串口控制
  3. 规定Pin4口为一个判断点,
  4. 低电平则为串口控制,高电平为按键控制
  5. 对串口的输入做限制,必须为数字

  6. */


  7. //电机的高电平持续时间 us
  8. int maichongjiangeMax=1260;
  9. int maichongjiangeMin=120;
  10. long maichongjiangeSet;

  11. //电机的高电平持续时间的初始值 0us
  12. int maichongjiange=0;

  13. //脉冲的占空比为1/maichongzhankongbi
  14. int maichongzhankongbi=4;

  15. //加减速时速度每隔300us变化一次
  16. int jiajiansubianhuashijian=300;


  17. ////////////////////////////////////////////
  18. int kongzhifangshi;//控制方式,低电平则为串口控制,高电平为按键控制
  19. int jsq1=0;
  20. int tempint;
  21. char kongzhimingling[4];
  22. boolean testxinxi=0;

  23. int Pinval;//存储IO口(Pin5、Pin6)高低电平的值

  24. boolean fangxiang=0;//电机转动方向标识
  25. int maichongjsq=0;//脉冲计数器


  26. unsigned long time1=micros();
  27. unsigned long time2=micros();


  28. void setup(){

  29. Serial.begin(9600);

  30. //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向) 输入状态,就读取值来确定电机的转动方向
  31. pinMode(5, INPUT);  
  32. pinMode(6, INPUT);  

  33. /*
  34. 暂定A0 analogRead(0)的值来确定转速
  35. 为方便演示,此处为使用1K 多圈精密可调电阻,A0就接在中间脚上
  36. 那么可见,其电压大致为0-5v之间,现在就电压区间进行分级
  37. 如果粗分为10档,就意味着每100个返回单位对应10%的速度
  38. */

  39. pinMode(7, OUTPUT);// EN+,脱机,高电平有效
  40. pinMode(8, OUTPUT);// CW+,方向
  41. pinMode(9, OUTPUT);// CLK+,频率(转速)

  42. digitalWrite(7, LOW);//电机默认联机
  43. digitalWrite(8, LOW);//
  44. digitalWrite(9, LOW);
  45. }


  46. void loop(){

  47. kongzhifangshi = digitalRead(4);

  48. if(kongzhifangshi==1){

  49. //转速调节,通过可变电阻实现无极调速

  50.   //可能是读取过于频繁,导致夹杂着无效数值,所以此处做个循环
  51.   do
  52.   {
  53. maichongjiangeSet = analogRead(0);//0-1023
  54. }while(maichongjiangeSet >1024);

  55. // 25% us =1000,000/(圈/每秒*400*4)=625/(0.5【min】+4.5×analogRead(0)/1024)
  56. //即把电压线性到转速上
  57.   maichongjiangeSet = 625/(0.5+4.5*maichongjiangeSet/1024);//0-1023

  58. fangxiangchange(); //转动方向的切换

  59. }else{


  60.    while (Serial.available() > 0) {
  61.    
  62.     //格式:方向(1位),速度百分比(2位) 如012
  63. //kongzhimingling[jsq1]= Serial.read();
  64. if(jsq1==0){         
  65.   tempint=Serial.read();
  66.   if(tempint==48 || tempint==49)kongzhimingling[0]= tempint;         
  67. }else{
  68.   tempint=Serial.read();
  69.   if(tempint>47 && tempint<58)kongzhimingling[jsq1]= tempint;       
  70.   
  71. }

  72. delayMicroseconds(1200);
  73. jsq1++;
  74. if(jsq1==3) jsq1=0;

  75. testxinxi=1;
  76.   }
  77.   
  78.   if(testxinxi){
  79.    testxinxi=0;
  80.    jsq1=0;
  81.    Serial.print("get:");
  82.       Serial.println(kongzhimingling);  
  83.    //速度调节

  84.    
  85.    maichongjiangeSet = 625/(0.5+4.5*((kongzhimingling[1]-48)*10+kongzhimingling[2]-48)/100);//0-1023
  86.    
  87.    Serial.print("maichongjiangeSet:");
  88.       Serial.println(maichongjiangeSet);  
  89.    
  90.    //方向调节
  91.    
  92.   if(kongzhimingling[0]-48 != fangxiang){ //有效高电平且现在电机转速与设置相反

  93.      Serial.print("bian");

  94.    
  95.   //1、把速度降到最低
  96.   while(maichongjiange<maichongjiangeMax){
  97.   jiansu();
  98.   maichongqudong();
  99.   }
  100.   
  101.   Serial.println("jiansuOK");
  102.   
  103.   //2、记录新的方向
  104.   fangxiang=!fangxiang;
  105.   
  106.   //3、反方向
  107.   digitalWrite(8, fangxiang);

  108.   //4、在把速度加到原来值
  109.   while(maichongjiange<maichongjiangeSet){
  110.   jiasu();
  111.   maichongqudong();
  112.   }
  113.   
  114.   Serial.println("jiasuOK");

  115.   }else  Serial.print("baochi");

  116.   
  117. }




  118. }



  119. //加速过程
  120. while(maichongjiange>maichongjiangeSet){
  121.   jiasu();
  122.   maichongqudong();
  123.   }

  124.   //加减过程
  125. while(maichongjiange<maichongjiangeSet){
  126.   jiansu();
  127.   maichongqudong();
  128.   }

  129. //在脉冲频率无变化的时候驱动电机正常运行
  130. maichongqudong();





  131. }






  132. void jiasu() //脉冲加速过程
  133. {

  134. if(micros()-time1>jiajiansubianhuashijian && maichongjiange>maichongjiangeMin){//加速过程,xxx us加速一次,加速到 yyy为止
  135. maichongjiange--;
  136. time1=micros();
  137. }

  138. }

  139. void jiansu()//脉冲减速过程
  140. {

  141. if(micros()-time1>jiajiansubianhuashijian && maichongjiange<maichongjiangeMax){
  142. maichongjiange++;
  143. time1=micros();
  144. }

  145. }


  146. void maichongqudong()//脉冲驱动
  147. {



  148. //步进电机控制脉冲
  149. if (micros()-time2 > maichongjiange){

  150.         maichongjsq++;//每过一个“脉冲间隔”时间段,则“脉冲计数器”自增1
  151.         maichongjsq=maichongjsq%maichongzhankongbi;//对“脉冲计数器”取模,这个取摸结果实质就是对占空比的调节(占空比为1/模),以4为例,则“脉冲计数器”的变化为:0——1——2——3——0

  152.         if(maichongjsq==0)digitalWrite(9, HIGH);//输出控制步进电机的电平
  153.         else digitalWrite(9, LOW);

  154.      time2= micros();
  155. }

  156. }


  157. void fangxiangchange() //转动方向的切换
  158. {



  159.   //关于反向,虽然直接对引脚进行控制也是可以的,但加入一个,减速——取反——加速的过程应该更好
  160. /*本例中,
  161. pin7, EN+,脱机,高电平有效
  162. pin8, CW+,方向
  163. pin9, CLK+,频率(转速)
  164. 已经用掉了,假设加减速、方向都由外部控制,那么很显然,就会出现2种控制方式:
  165. A、模拟方式,即通过测量2个点电阻变化所导致的分压变化,即可实现强弱、方向的调节,具体类似于ACS712的读取,此方式可以类似于“无级变速”
  166. B、数字方式,即通过摇杆或4个微动开关,来分别实现加减速、方向的切换

  167. 就实际操作而言,速度上测电阻分压,方向上用微动开关比较合适,即用2个数字口+1个PWM口实现具体控制
  168. */

  169. Pinval = digitalRead(5);  //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向)

  170. if(Pinval==1 && fangxiang){ //有效高电平且现在电机转速与设置相反

  171. //1、把速度降到最低
  172. while(maichongjiange<maichongjiangeMax){
  173. jiansu();
  174. maichongqudong();
  175.     }
  176. //2、反方向
  177. digitalWrite(8, LOW);
  178. //3、记录新的方向
  179. fangxiang=0;
  180. //4、在把速度加到原来值
  181. while(maichongjiange<maichongjiangeSet){
  182. jiasu();
  183. maichongqudong();
  184.     }

  185. }

  186. Pinval = digitalRead(6);  //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向)

  187. if(Pinval==1 && !fangxiang){ //有效高电平且现在电机转速与设置相反

  188. //1、把速度降到最低
  189. while(maichongjiange<maichongjiangeMax){
  190. jiansu();
  191. maichongqudong();
  192.     }
  193. //2、反方向
  194. digitalWrite(8, HIGH);
  195. //3、记录新的方向
  196. fangxiang=1;
  197. //4、在把速度加到原来值
  198. while(maichongjiange<maichongjiangeSet){
  199. jiasu();
  200. maichongqudong();
  201.     }

  202. }




  203. }

复制代码


5

主题

36

帖子

141

积分

QQ群用户

积分
141
11#
 楼主| 发表于 2015-2-18 12:54:23 | 只看该作者
为了控制的迁移,串口控制是必须的:

当然,还是有待完善的地方,那就是对于串口字符串的检验




  1. /*
  2. djc3 无极调速 + 串口控制
  3. 规定Pin4口为一个判断点,
  4. 低电平则为串口控制,高电平为按键控制


  5. */


  6. //电机的高电平持续时间 us
  7. int maichongjiangeMax=1260;
  8. int maichongjiangeMin=120;
  9. long maichongjiangeSet;

  10. //电机的高电平持续时间的初始值 0us
  11. int maichongjiange=250;

  12. //脉冲的占空比为1/maichongzhankongbi
  13. int maichongzhankongbi=4;

  14. //加减速时速度每隔300us变化一次
  15. int jiajiansubianhuashijian=300;


  16. ////////////////////////////////////////////
  17. int kongzhifangshi;//控制方式,低电平则为串口控制,高电平为按键控制
  18. int jsq1=0;
  19. char kongzhimingling[4];
  20. boolean testxinxi=0;

  21. int Pinval;//存储IO口(Pin5、Pin6)高低电平的值

  22. boolean fangxiang=0;//电机转动方向标识
  23. int maichongjsq=0;//脉冲计数器


  24. unsigned long time1=micros();
  25. unsigned long time2=micros();


  26. void setup(){

  27. Serial.begin(9600);

  28. //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向) 输入状态,就读取值来确定电机的转动方向
  29. pinMode(5, INPUT);  
  30. pinMode(6, INPUT);  

  31. /*
  32. 暂定A0 analogRead(0)的值来确定转速
  33. 为方便演示,此处为使用1K 多圈精密可调电阻,A0就接在中间脚上
  34. 那么可见,其电压大致为0-5v之间,现在就电压区间进行分级
  35. 如果粗分为10档,就意味着每100个返回单位对应10%的速度
  36. */

  37. pinMode(7, OUTPUT);// EN+,脱机,高电平有效
  38. pinMode(8, OUTPUT);// CW+,方向
  39. pinMode(9, OUTPUT);// CLK+,频率(转速)

  40. digitalWrite(7, LOW);//电机默认联机
  41. digitalWrite(8, LOW);//
  42. digitalWrite(9, LOW);
  43. }


  44. void loop(){

  45. kongzhifangshi = digitalRead(4);

  46. if(kongzhifangshi==1){

  47. //转速调节,通过可变电阻实现无极调速

  48.   //可能是读取过于频繁,导致夹杂着无效数值,所以此处做个循环
  49.   do
  50.   {
  51. maichongjiangeSet = analogRead(0);//0-1023
  52. }while(maichongjiangeSet >1024);

  53. // 25% us =1000,000/(圈/每秒*400*4)=625/(0.5【min】+4.5×analogRead(0)/1024)
  54. //即把电压线性到转速上
  55.   maichongjiangeSet = 625/(0.5+4.5*maichongjiangeSet/1024);//0-1023

  56. fangxiangchange(); //转动方向的切换

  57. }else{


  58.           while (Serial.available() > 0) {

  59.                   //格式:方向(1位),速度百分比(2位) 如012
  60.         kongzhimingling[jsq1]= Serial.read();


  61. delayMicroseconds(1200);
  62. jsq1++;
  63. if(jsq1==3) jsq1=0;

  64. testxinxi=1;
  65.   }

  66.   if(testxinxi){
  67.           testxinxi=0;
  68.           jsq1=0;
  69.           Serial.print("get:");
  70.       Serial.println(kongzhimingling);  
  71.           //速度调节


  72.           maichongjiangeSet = 625/(0.5+4.5*((kongzhimingling[1]-48)*10+kongzhimingling[2]-48)/100);//0-1023

  73.           Serial.print("maichongjiangeSet:");
  74.       Serial.println(maichongjiangeSet);  

  75.           //方向调节

  76.                 if(kongzhimingling[0]-48 != fangxiang){ //有效高电平且现在电机转速与设置相反

  77.                           Serial.print("bian");


  78.                 //1、把速度降到最低
  79.                 while(maichongjiange<maichongjiangeMax){
  80.                 jiansu();
  81.                 maichongqudong();
  82.                 }

  83.                 Serial.println("jiansuOK");

  84.                 //2、记录新的方向
  85.                 fangxiang=!fangxiang;

  86.                 //3、反方向
  87.                 digitalWrite(8, fangxiang);

  88.                 //4、在把速度加到原来值
  89.                 while(maichongjiange<maichongjiangeSet){
  90.                 jiasu();
  91.                 maichongqudong();
  92.                 }

  93.                 Serial.println("jiasuOK");

  94.                 }else  Serial.print("baochi");


  95.         }




  96. }



  97. //加速过程
  98. while(maichongjiange>maichongjiangeSet){
  99.   jiasu();
  100.   maichongqudong();
  101.   }

  102.   //加减过程
  103. while(maichongjiange<maichongjiangeSet){
  104.   jiansu();
  105.   maichongqudong();
  106.   }

  107. //在脉冲频率无变化的时候驱动电机正常运行
  108. maichongqudong();





  109. }






  110. void jiasu() //脉冲加速过程
  111. {

  112. if(micros()-time1>jiajiansubianhuashijian && maichongjiange>maichongjiangeMin){//加速过程,xxx us加速一次,加速到 yyy为止
  113. maichongjiange--;
  114. time1=micros();
  115. }

  116. }

  117. void jiansu()//脉冲减速过程
  118. {

  119. if(micros()-time1>jiajiansubianhuashijian && maichongjiange<maichongjiangeMax){
  120. maichongjiange++;
  121. time1=micros();
  122. }

  123. }


  124. void maichongqudong()//脉冲驱动
  125. {



  126. //步进电机控制脉冲
  127. if (micros()-time2 > maichongjiange){

  128.         maichongjsq++;//每过一个“脉冲间隔”时间段,则“脉冲计数器”自增1
  129.         maichongjsq=maichongjsq%maichongzhankongbi;//对“脉冲计数器”取模,这个取摸结果实质就是对占空比的调节(占空比为1/模),以4为例,则“脉冲计数器”的变化为:0——1——2——3——0

  130.         if(maichongjsq==0)digitalWrite(9, HIGH);//输出控制步进电机的电平
  131.         else digitalWrite(9, LOW);

  132.      time2= micros();
  133. }

  134. }


  135. void fangxiangchange() //转动方向的切换
  136. {



  137.   //关于反向,虽然直接对引脚进行控制也是可以的,但加入一个,减速——取反——加速的过程应该更好
  138. /*本例中,
  139. pin7, EN+,脱机,高电平有效
  140. pin8, CW+,方向
  141. pin9, CLK+,频率(转速)
  142. 已经用掉了,假设加减速、方向都由外部控制,那么很显然,就会出现2种控制方式:
  143. A、模拟方式,即通过测量2个点电阻变化所导致的分压变化,即可实现强弱、方向的调节,具体类似于ACS712的读取,此方式可以类似于“无级变速”
  144. B、数字方式,即通过摇杆或4个微动开关,来分别实现加减速、方向的切换

  145. 就实际操作而言,速度上测电阻分压,方向上用微动开关比较合适,即用2个数字口+1个PWM口实现具体控制
  146. */

  147. Pinval = digitalRead(5);  //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向)

  148. if(Pinval==1 && fangxiang){ //有效高电平且现在电机转速与设置相反

  149. //1、把速度降到最低
  150. while(maichongjiange<maichongjiangeMax){
  151. jiansu();
  152. maichongqudong();
  153.     }
  154. //2、反方向
  155. digitalWrite(8, LOW);
  156. //3、记录新的方向
  157. fangxiang=0;
  158. //4、在把速度加到原来值
  159. while(maichongjiange<maichongjiangeSet){
  160. jiasu();
  161. maichongqudong();
  162.     }

  163. }

  164. Pinval = digitalRead(6);  //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向)

  165. if(Pinval==1 && !fangxiang){ //有效高电平且现在电机转速与设置相反

  166. //1、把速度降到最低
  167. while(maichongjiange<maichongjiangeMax){
  168. jiansu();
  169. maichongqudong();
  170.     }
  171. //2、反方向
  172. digitalWrite(8, HIGH);
  173. //3、记录新的方向
  174. fangxiang=1;
  175. //4、在把速度加到原来值
  176. while(maichongjiange<maichongjiangeSet){
  177. jiasu();
  178. maichongqudong();
  179.     }

  180. }




  181. }
复制代码


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

本版积分规则

QQ|Archiver|手机版|狗趴(GodPub) Arduino&Raspberry Pi开源硬件学习与实践[QQ群:20085629]  

GMT+8, 2024-5-14 15:57 , Processed in 0.049458 second(s), 32 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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