极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: ignore

关于电机中断计数问题

[复制链接]
发表于 2017-2-7 11:03:42 | 显示全部楼层
ignore 发表于 2017-2-7 08:47
点开发现。这传感器好大哈,你讲的这种适用于工业自动化上的标准,我目前就是用于玩具小车上面,所以说, ...

推荐你个网址:www.dfrobot.cn。这里面传感器比较齐全,如果嫌价格贵先找到资料然后去淘宝上买。哈哈。
回复 支持 反对

使用道具 举报

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

EEPROM的寿命有限,不要擦写过于频繁哟。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-7 14:00:53 | 显示全部楼层
PINKWALKMAN 发表于 2017-2-7 11:05
EEPROM的寿命有限,不要擦写过于频繁哟。

嗯,这个会注意的,只不过现在用于测试,所以该浪费还是得浪费。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-7 15:11:50 | 显示全部楼层
PINKWALKMAN 发表于 2017-2-6 16:31
看你这个程序是做电机的位置环控制,不知精度要求高不高。
说实话之前做过电机位置环控制,用的私服电机加 ...

看了几遍你的视频,我在想,你这个位置是怎么反馈的?还有就是想询问下,我这个程序误差如何减小?怎么通过你说的PID调整?
回复 支持 反对

使用道具 举报

发表于 2017-2-8 08:11:11 | 显示全部楼层
ignore 发表于 2017-2-7 15:11
看了几遍你的视频,我在想,你这个位置是怎么反馈的?还有就是想询问下,我这个程序误差如何减小?怎么通 ...

步进电机前端的丝杆下面就是一个线性位移传感器(说白了就是个滑动变阻器),PID(比例、积分、微分)是一个工业上常用的控制算法。我这个也是舵机形式的一种,可以百度一下舵机的原理以及PID算法的知识看看。
因为反馈形式不一样所以,线性位移传感器相当于一个绝对位置编码器,误差以及累积误差都很小,这是它的特性;你采用的简易光电编码器属于增量式编码器,这种编码器理论上没有累积误差可是单片机在读取编码器脉冲时会有误读问题还有就是编码器脉冲信号在电线的传输过程中会被干扰等原因,所以工业上一般都采用差分光电编码器,当然比普通的要贵不少。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-8 08:54:35 | 显示全部楼层
本帖最后由 ignore 于 2017-2-8 08:57 编辑
PINKWALKMAN 发表于 2017-2-8 08:11
步进电机前端的丝杆下面就是一个线性位移传感器(说白了就是个滑动变阻器),PID(比例、积分、微分)是 ...


是的,正如你分析的,这种增量式传感器到单片机的过程中,一方面由于编码盘的原因,一圈理论采集40,但是都会在39,40,41之间徘徊,另一方面就是单片机容易受到干扰,图为我的电路原理图,不知道能否指导下?

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2017-2-8 10:36:39 | 显示全部楼层
我测试过 FALLING 的确比 CHANGE 要少一半的
稍后上代码给你参考下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-8 11:21:28 | 显示全部楼层
wing 发表于 2017-2-8 10:36
我测试过 FALLING 的确比 CHANGE 要少一半的
稍后上代码给你参考下

这个我也知道,我用两种方式,1:霍尔传感器加自制码盘,很明显CHANGE 比 FALLING 多一半,2:光电U型传感器加20线码盘,同一道程序CHANGE 与FALLING一致,我在想是不是这样U型传感器模块里面已加了某些算法,但感觉说不通,毕竟是单片机进行计数,https://detail.tmall.com/item.ht ... a230r.1.14.1.rvfskH
回复 支持 反对

使用道具 举报

发表于 2017-2-8 11:40:40 | 显示全部楼层
ignore 发表于 2017-2-8 08:54
是的,正如你分析的,这种增量式传感器到单片机的过程中,一方面由于编码盘的原因,一圈理论采集40,但 ...

咋说呢?说实在还是不清楚你具体想要达到的目的。
继电器一般用来控制器启停,是没有中间状态的,就是说要么电机以最高转速动作,要么停止。如果想要电机做准确的位置控制动作继电器控制电机肯定是不行的。要用到MOS管H桥结合PWM变频控制,当然少不了PID算法。
真正的私服电机有电流环PID,速度环PID,位置环PID,三环,环环相扣;电流环是电机力矩体现,速度环是电机转速体现,位置环是电机转动位置体现。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-8 13:34:21 | 显示全部楼层
PINKWALKMAN 发表于 2017-2-8 11:40
咋说呢?说实在还是不清楚你具体想要达到的目的。
继电器一般用来控制器启停,是没有中间状态的,就是说 ...

之前不懂,以为说用纯继电器通断电就可控制位置,看你这么说,发现继电器启停存在微小惯性误差,我不太清楚是不是因为没用到MOS管H桥控制结合PWM变频控制?有刷直流电机怎么通过变频控制?我以为有刷直接通过接通电控制,还是说需要个驱动板
回复 支持 反对

使用道具 举报

发表于 2017-2-8 14:21:37 | 显示全部楼层
ignore 发表于 2017-2-8 13:34
之前不懂,以为说用纯继电器通断电就可控制位置,看你这么说,发现继电器启停存在微小惯性误差,我不太清 ...

不好意思说错了,交流电机是变频控制,直流电机是脉宽调节控制。
不是道你这12V电机功率有多大,建议使用L298电机驱动器来的简单一些,这样的程序也很多,百度一下或者极客工坊论坛里也有不少。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-8 14:30:56 | 显示全部楼层
PINKWALKMAN 发表于 2017-2-8 14:21
不好意思说错了,交流电机是变频控制,直流电机是脉宽调节控制。
不是道你这12V电机功率有多大,建议使 ...

嗯,之前有考虑过 使用L298驱动器,但是体积太大,自己制版又不合算,只是想通过程序上来补偿,看来是尴尬了!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-13 15:13:01 | 显示全部楼层
wing 发表于 2017-2-8 10:36
我测试过 FALLING 的确比 CHANGE 要少一半的
稍后上代码给你参考下

看过一种计数的方式,就是利用CHANGE方式触发中断,在计数的时候,用digitalRead读出中断口的高低电平,再判断高低电平来计数加1,我认为CHANGE已经是高低电平改变了,为何还需要再次判断下。
if((millis()-time3)>5)                    //为了不计入噪音干扰脉冲,
           {                                         //当2次中断之间的时间大于5ms时,计一次有效计数
               int L=digitalRead(2);
               if(Llast == LOW && L == HIGH)
               {
                   count += 1;                           //当编码器码盘的OUTA脉冲信号下跳沿每中断一次,编码器码盘计数加一  
                   Serial.print("count=");
                   Serial.println(count);
                   DirectionCompare();                   //行程比较控制停止
               }
               Llast=L;
           }
           time3=millis();
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-13 15:12:48 | 显示全部楼层
wing 发表于 2017-2-8 10:36
我测试过 FALLING 的确比 CHANGE 要少一半的
稍后上代码给你参考下

看过一种计数的方式,就是利用CHANGE方式触发中断,在计数的时候,用digitalRead读出中断口的高低电平,再判断高低电平来计数加1,我认为CHANGE已经是高低电平改变了,为何还需要再次判断下。
if((millis()-time3)>5)                    //为了不计入噪音干扰脉冲,
           {                                         //当2次中断之间的时间大于5ms时,计一次有效计数
               int L=digitalRead(2);
               if(Llast == LOW && L == HIGH)
               {
                   count += 1;                           //当编码器码盘的OUTA脉冲信号下跳沿每中断一次,编码器码盘计数加一  
                   Serial.print("count=");
                   Serial.println(count);
                   DirectionCompare();                   //行程比较控制停止
               }
               Llast=L;
           }
           time3=millis();
回复 支持 反对

使用道具 举报

发表于 2017-2-13 17:24:39 | 显示全部楼层
TB6612这个片子挺小,驱动能力也可以,外围电路还少。
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 22:25 , Processed in 0.047626 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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