极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13246|回复: 4

关于电机调速的问题,为什么串口输出nan,大神帮帮忙!!!

[复制链接]
发表于 2016-8-17 10:06:57 | 显示全部楼层 |阅读模式
mega2560,用的普通小车黄色电机,驱动是L298n,码盘是20栅的。借鉴了http://www.geek-workshop.com/forum.php?mod=viewthread&tid=5215&highlight=%B5%F7%CB%D9
原文处进行速度计算是这么写的:Input=rotation_v*elapse_time/10;我觉得有错改成了Input=rotation_v/elapse_time*50;(因为是20栅所以改成50)  。但运行后无法串口控制变速,而且关键是此时的Output串口输出为nan,不懂什么意思。。。我觉得问题就出在这一句,因为用原文语句电机可以旋转(通过串口给速度可以改变转速,但是速度与所需速度不一致),而自己改后的完全都不能旋转。我的代码如下,希望大神能给与帮助

  1. #include <PID_v1.h>
  2. double Setpoint, Input, Output;
  3. PID myPID(&Input,&Output,&Setpoint,15,2,1,DIRECT); //  pid值还未调好
  4. float control_v;   
  5. float rotation_v;   
  6. int time1,time2;   
  7. int elapse_time;   

  8. void setup()
  9. {
  10.   pinMode(8,OUTPUT);                  //原文只用了一个引脚
  11.   pinMode(9,OUTPUT);                  //此处加了一个
  12.   pinMode(10,OUTPUT);                 
  13.   digitalWrite(8,HIGH);
  14.   digitalWrite(9,LOW);
  15.   attachInterrupt(0,count,FALLING);
  16.   Serial.begin(9600);
  17.   time1=millis();
  18.   myPID.SetMode(AUTOMATIC);
  19. }

  20. void loop()
  21. {  
  22.   while(Serial.available()){                //原文采用电位器,此处改为串口
  23.     control_v=Serial.parseInt();              //
  24.   }                                           //
  25.   Setpoint=control_v;                        //
  26.   time2=millis();      
  27.   elapse_time=time2-time1;
  28.   time1=time2;
  29.   Input=rotation_v/elapse_time*50;     //原文处采用100栅Input=rotation_v*elapse_time/10;
  30.   rotation_v=0;                         //我采用的20栅码盘,并觉得原文速度计算有误,变作了更改
  31.   myPID.Compute();      

  32.   Serial.print(Setpoint);        
  33.   Serial.print(",");
  34.   Serial.print(Input);
  35.   Serial.print(",");
  36.   Serial.print(Output);        //检测Output输出是什么
  37.   Serial.print("\r\n");
  38.   analogWrite(10,Output);               //改了引脚
  39. }

  40. void count()
  41. {
  42.   rotation_v+=1;         
  43. }
复制代码


回复

使用道具 举报

 楼主| 发表于 2016-8-17 10:33:04 | 显示全部楼层
这是昨天的问题,今天看了看发现将Input=rotation_v/elapse_time*50;改为
Input=(rotation_v/elapse_time*50);后电机可以开始旋转了,难道是pid库的字符类型的问题?
效果如下  (..,..,..)依次为Setpoint值,Input值,Output值。然而Input依旧没有接近Setpoint的值只是让电机能转起来且Setpoint值越大转的越快,当我设置Setpoint为99,999这些大数字时,电机转速加快了,但Input的值却变化不大还是个位数,这是转速求法的问题吗?

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-17 10:33:30 | 显示全部楼层
转速设置为rad/s
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-17 10:34:54 | 显示全部楼层
可能我的pid得重调
回复 支持 反对

使用道具 举报

发表于 2016-8-18 00:13:24 | 显示全部楼层
pid没研究过......
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 03:38 , Processed in 0.038597 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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