赞
踩
博主最近在准备电赛,需要用到编码器测速、调速功能,但是发现网上开源资料质量参差不齐。我个人学习的过程中也尝试了许多方法。其实有很多开源代码并不能直接使用,有的库适用面很窄,亦或是有的代码实现功能极其不稳定,今天我就给大家分享一下我看了众多资料后写出的新的解决方法,希望能帮助到大家。我使用的Arduino_UNO主控,L298N驱动模块,搭配有霍尔编码器的GM25-370直流减速电机。
画的比较丑,但是博主真的尽力了。 看不懂的宝子 上图
Arduino_UNO 2 | 编码器A相 |
Arduino_UNO 3 | L298N IN1 |
Arduino_UNO 4 | L298N IN2 |
Arduino_UNO 5 | L298N EN1 |
编码器电机线+ | L298N OUT1 |
编码器电机线- | L298N OUT2 |
编码器+ | 5V |
编码器- | GND |
(PS: Arduino_UNO可以使用充电宝供电)
- //电机接线
- #define AIN1 3
- #define AIN2 4
- #define PWMA 5
- #define AA 2
-
- int valA=0;
- float n;
- int flag=0,pwm;
- int speed_a=70,speed_b=750;//speed_a:自定速度初始值 speed_b:目标速度
-
- unsigned long starttime,stoptime;//定时器
- void timer()
- {
- valA++;
- stoptime=millis();
- if((stoptime-starttime)>100) //每100秒记一次数
- {
- detachInterrupt(0); //关中断
- flag=1;
- }
- }
- void setup() {
- pinMode(AIN1,OUTPUT);
- pinMode(AIN2,OUTPUT);
- pinMode(PWMA,OUTPUT);
- pinMode(AA,INPUT);
- Serial.begin(9600);
- attachInterrupt(0,timer,RISING); //上升沿开中断
- starttime=millis();
- Serial.println(starttime);
-
- }
- void loop() {
- digitalWrite(AIN1,HIGH);
- digitalWrite(AIN2,LOW);
- analogWrite(PWMA,speed_a);
-
- if(flag==1) //if()前面加while(1)不行
-
- {
- n=valA;//*100/156.000; //放大一百倍串口绘图
- Serial.println(n,3);
- valA=0;
- flag=0;
- if(n>speed_b) //如果编码器测得的实际速度大于我们设定的目标速度就减速
- {
- speed_a--;//speed 为60/100 r/s
- }
- else //如果编码器测得的实际速度小于我们设定的目标速度就加速
- {
- speed_a++;
- }
-
- delay(0);
- starttime=millis();
- attachInterrupt(0,timer,RISING);
- }
-
- }

好啦,今天的分享就到这里啦,如果有小伙伴对本篇文章的哪块有困惑,欢迎打在评论区我们一起交流讨论啊。如有错误的地方,欢迎大家批评指教。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。