极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: ignore

关于电机中断计数问题

[复制链接]
发表于 2017-2-21 13:12:00 | 显示全部楼层
的确是断了电还是会跑一会儿,但我选择忽略它。
机械来说飞轮,离合,螺丝杆,之类的结构都可以有这种效果,不过要做得精致都不会便宜的。
不过这也说不准的,有时候也会遇到一些垃圾中的战斗机

回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-22 09:10:38 | 显示全部楼层
wing 发表于 2017-2-21 13:12
的确是断了电还是会跑一会儿,但我选择忽略它。
机械来说飞轮,离合,螺丝杆,之类的结构都可以有这种效果 ...

继电器,属于机械开关,虽然MCU给继电器动作信号,但是还是有点延误,这样的话,使用三极管做电子开关驱动电机,这样反应会快点,不过,这种电子开关,得不得考虑电机的功率啥的?
回复 支持 反对

使用道具 举报

发表于 2017-2-22 11:03:18 | 显示全部楼层
关于这个问题曾经有高手总结了多种情况,你可以参考一下

Arduino学习笔记A7 - Arduino 输出引脚扩流
http://www.geek-workshop.com/thread-196-1-1.html
(出处: 极客工坊)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-8 11:20:13 | 显示全部楼层
wing 发表于 2017-2-21 13:12
的确是断了电还是会跑一会儿,但我选择忽略它。
机械来说飞轮,离合,螺丝杆,之类的结构都可以有这种效果 ...

这是我之后的电路图,现在有个问题出现,就是正反转的时候计数会有差,正转计数正常(每200ms为16.17),反转计数不正常(每200ms为12.13.14.15.16.17),是不是硬件受到什么干扰

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2017-3-8 12:05:40 | 显示全部楼层
本帖最后由 wing 于 2017-3-8 12:08 编辑

你有接比较器么?
LM393之类的东西

我之前折腾过一下
http://www.geek-workshop.com/thread-27502-1-1.html

回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-8 13:19:52 | 显示全部楼层
wing 发表于 2017-3-8 12:05
你有接比较器么?
LM393之类的东西

有的,就是这种模块,正反转都是依靠这个模块,而且程序也调用用一块,结果就是不一样,反转导致计数器失步,是不是硬件上收到干扰?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2017-3-9 07:37:29 | 显示全部楼层
这个是光电和比较器一体的,我未用过这种
我那个是电机带码盘和光电,另外自己加比较电路的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-9 16:34:30 | 显示全部楼层
wing 发表于 2017-3-9 07:37
这个是光电和比较器一体的,我未用过这种
我那个是电机带码盘和光电,另外自己加比较电路的

由于没有示波器,淘宝了个百来块的编码器,读一下电机的正反转,发现正反转的转速是不同的,说明这个电机正反特性不同,导致了我的正反转读数出现错误,换了一个正反转转速几乎相同的电机,发现误差明显降低了(程序都是相同的),虽然表面解决了问题,但是还是不明白其中的原理,因为是行程记忆么,比方走了A米(900个计数),下次也是通过20线码盘获取这900个计数,与转速快慢没有关系(理论上),为什么我只是用了正反转转速一致的电机,误差就下降了?
回复 支持 反对

使用道具 举报

发表于 2017-3-10 01:29:19 | 显示全部楼层
ignore 发表于 2017-2-6 10:52
如果您不介意的话,可以看下我个程序,delay只用在EEPROM读写这里


在 Count 之內, 用 millis 及 Serial.print 都不太好的.

ISP 之內, 應該盡量只用簡單的運算, 如果只是計數, 只更新 counter.  要顯示的話, 盡量放在 loop 之內.

嘗試簡化 ISP, 只計算次數, 看看是否有分別.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-10 08:49:53 | 显示全部楼层
Super169 发表于 2017-3-10 01:29
在 Count 之內, 用 millis 及 Serial.print 都不太好的.

ISP 之內, 應該盡量只用簡單的運算, 如果只 ...

感谢你的指导,马上改进验证,在触发中断的函数中,之前是参考他人的测速程序,那个5ms是减小两次中断干扰,不知是否合理?
回复 支持 反对

使用道具 举报

发表于 2017-3-10 11:07:53 | 显示全部楼层
我最初的代码也在中断里加了时间判断,那个也是参考网上其他人的代码的
不过慢慢地发现那个比较器电路比我想象中的更加稳定,
所以后期的程序中断过程去掉了时间判断,只处理变量越界问题.

另外根据编码器计数来计算行程也是我的目标之一,还在研究中,多交流
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-10 14:37:54 | 显示全部楼层
wing 发表于 2017-3-10 11:07
我最初的代码也在中断里加了时间判断,那个也是参考网上其他人的代码的
不过慢慢地发现那个比较器电路比我 ...

经过我试验,发现这个20线编码盘是适合测转速,正真用来做行程记忆是不合适的,得根据电机控制的机构阻力不同的因素(机构等的抖动会影响传感器误读),来选择不一样的线,之后我使用4线,8线的码盘,效果明显比20线好,然后就有一个问题,我正转的时候非常准,只会在反转出现一个误差,而且这个误差不是每次都出现,而是时不时的出现,这样会导致行程错位,你有什么见解哈?
回复 支持 反对

使用道具 举报

发表于 2017-3-10 15:11:08 | 显示全部楼层
本帖最后由 Super169 于 2017-3-10 15:25 编辑
ignore 发表于 2017-3-10 08:49
感谢你的指导,马上改进验证,在触发中断的函数中,之前是参考他人的测速程序,那个5ms是减小两次中断干 ...


單看你的程式, 有幾個複雜的問題, 互相影響了, 真的不太肯定你收集到的結果, 會是什麼.

首先, 可能要看你的電機速度, 單從數字上推算:
20 線编码盘, CHANGE 的話, 一圈就有 40 個訊號.
5ms 以內不計算的, 一秒最多 200次, 即 5 圈左右.
換句話說, 只要你的電機, 超過 300rpm, 豈非就有問題了.  
if((millis()-time3)>5)  不成立, 就不計算, 之後再把 time3 = millis()....豈非更有問題???

一般電機, 300rpm 會不會太慢了?
我反而奇怪, 如果你的電機超過 300rpm, 每次都少於 5ms, 豈非因為 ((millis()-time3)>5) 不成立, 而完全不作計算?

但又有另一個可能, 當速度未達 5ms 時, 執行 ((millis()-time3)>5) 成立.
之後的 Serial 輸出, 如果超過 5ms...單從輸出計算, 9600bps, 只要輸出 6 個 byte, 就要 5ms 了 (1/9600*8*5 = 0.005), 還沒有計算其他運算時間.  所以, 你每次在 ISP 內都要花上 5ms 以上.    本來應該要觸發另一次中斷了, 但因為之前的還未完成, 就被忽略了.  
再者, 因為 millis() 在 ISP 內是停止的, 你最後用 time3=millis(), 那 time3 的值, 只會記下開始的時間, 那就已經是 5ms 之前的時間了.  如此下去, 每次都記下了 5ms 之前的時間, 當下次 ISP 執行時, ((millis()-time3)>5)  又變成自然成立了.

不過, Serial 是有 buffer 的, Serial.print 實際上不一定要用上幾個 ms, 在 ISP 內的運作會否有分別, 產生的 IO 是否會有點影響,  真的不知道.  所以 ISP 內實際所花的時間, 真的不太肯定.   但如果要每 5ms, 發出  "count=xx" 的訊息, 以 9600bps 是不能做到的, 應該會出現 overflow.

你的程式中, 混雜了 Serial.print 的耗時,  millis() 的停止, 以及 電機速度的因素.  很難完全憑空想像  ((millis()-time3)>5)  的結果會變怎樣了.  以上全屬憑空推測, 太多不肯定的地方了.

所以, 我之前就建議你先把 millis() 及 Serial.print 的部份, 從 ISP 中移除, 再看看結果. 
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-10 15:35:35 | 显示全部楼层
Super169 发表于 2017-3-10 15:11
單看你的程式, 有幾個複雜的問題, 互相影響了, 真的不太肯定你收集到的結果, 會是什麼.

首先, 可能 ...

看到你的讲解,首先,非常感谢哈,的确是忽略了很多因素,目前电机经过编码器测试,转速在115rmp左右,对于直接上轨道上测试行程(先不谈论是否数据是准确的),目前发现,会存在一个误差,就是反转是不是出现一个误差,不晓得怎么消除,也有可能是瞎猫碰到死耗子了吧
回复 支持 反对

使用道具 举报

发表于 2017-3-10 16:00:08 | 显示全部楼层
ignore 发表于 2017-3-10 15:35
看到你的讲解,首先,非常感谢哈,的确是忽略了很多因素,目前电机经过编码器测试,转速在115rmp左右,对 ...

那115rpm 應該沒問題吧 (一秒 2 圈? 真的很慢了).  5ms 的時間, 可因應不同的輸入而調教.
我之前用編碼器測試, CHANGE , FALLING, RISING 都比較容易出現跳動, 就是加入了 5ms 的篩選, 結果還是不太理想.  感覺上 LOW 相對穩定一點.  不過, 可能不同的編碼器品質不同, 結果或有分別.
或者你可以先試手動去轉動碼盤, 看看編碼器的讀數.  比如一個圈, 以 5ms 篩選, 是否收到大約 20次 LOW / FALLING / RISING, 又或 40 次 CHANGE.

至於你說的 "反转是不是出现一个误差", 不明白是什麼意思.
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 18:30 , Processed in 0.045809 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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