|
|
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;
- }
复制代码
|
|