关于电机调速的问题,为什么串口输出nan,大神帮帮忙!!!
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,不懂什么意思。。。我觉得问题就出在这一句,因为用原文语句电机可以旋转(通过串口给速度可以改变转速,但是速度与所需速度不一致),而自己改后的完全都不能旋转。我的代码如下,希望大神能给与帮助
#include <PID_v1.h>
double Setpoint, Input, Output;
PID myPID(&Input,&Output,&Setpoint,15,2,1,DIRECT); //pid值还未调好
float control_v;
float rotation_v;
int time1,time2;
int elapse_time;
void setup()
{
pinMode(8,OUTPUT); //原文只用了一个引脚
pinMode(9,OUTPUT); //此处加了一个
pinMode(10,OUTPUT);
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
attachInterrupt(0,count,FALLING);
Serial.begin(9600);
time1=millis();
myPID.SetMode(AUTOMATIC);
}
void loop()
{
while(Serial.available()){ //原文采用电位器,此处改为串口
control_v=Serial.parseInt(); //
} //
Setpoint=control_v; //
time2=millis();
elapse_time=time2-time1;
time1=time2;
Input=rotation_v/elapse_time*50; //原文处采用100栅Input=rotation_v*elapse_time/10;
rotation_v=0; //我采用的20栅码盘,并觉得原文速度计算有误,变作了更改
myPID.Compute();
Serial.print(Setpoint);
Serial.print(",");
Serial.print(Input);
Serial.print(",");
Serial.print(Output); //检测Output输出是什么
Serial.print("\r\n");
analogWrite(10,Output); //改了引脚
}
void count()
{
rotation_v+=1;
}
这是昨天的问题,今天看了看发现将Input=rotation_v/elapse_time*50;改为
Input=(rotation_v/elapse_time*50);后电机可以开始旋转了,难道是pid库的字符类型的问题?
效果如下(..,..,..)依次为Setpoint值,Input值,Output值。然而Input依旧没有接近Setpoint的值只是让电机能转起来且Setpoint值越大转的越快,当我设置Setpoint为99,999这些大数字时,电机转速加快了,但Input的值却变化不大还是个位数,这是转速求法的问题吗? 转速设置为rad/s 可能我的pid得重调
pid没研究过......
页:
[1]