|
|

楼主 |
发表于 2015-2-21 14:49:05
|
显示全部楼层
本帖最后由 vblearn 于 2015-2-21 14:52 编辑
OK.谢谢楼上, 但已写出来了.
先接了L298N,开始用USB供电,根本带不动两个电机. 现在用12V电源(10A的). 驱动OK了.
还是考虑使用串口进行控制
现在定义了两个命令,一个是前后的速度,一个是左右的转向速度. 这两个数的范围是0到510,以255为中心.
经过计算后,变成左右电机的速度SPEED1,SPEED2,范围为0-255.
但PWM低值时无法驱动电机,高时又太快. 所以SPEED到PWM进行了一个简单的线性变换. 即定义了PWM的最小和最大值, 将SPEED的0-255映射到PWM的MIN到MAX.
由于两个电机速度不完全一致,还保留了两个变量对SPEED进行微调.
串口的处理代码可以参照上一贴项目1-万年历
下面是速度处理的代码.
- //control value
- int m_ValueCenter=255;// for Forward and Turn
- int m_Forward,m_Turn; //Current control -255 to 255
- int m_Speed1=0,m_Speed2=0; //-255 to 255
- int m_Speed1Adjust=0,m_Speed2Adjust=0;//adjust the motor speed
- #define C_PWM1MIN 60
- #define C_PWM1MAX 130
- #define C_PWM2MIN 60
- #define C_PWM2MAX 130
- int m_PWM1,m_PWM2; //PWM control;
复制代码
一个是从控制量到两电机速度的函数
- void S_CalculateControl()
- {
- // from m_Forward,m_Turn(-255 to 255); to m_Speed1,m_Speed2; (-255 to 255 )
- m_Speed1=m_Forward;
- m_Speed2=m_Forward;
- if (m_Forward>0)
- {
- if (m_Turn<0) //turn left
- {
- m_Speed1+=m_Turn; //chang speed
- if (m_Speed1<0) {
- m_Speed1=0;
- }
- }
- if (m_Turn>0) //turn right
- {
- m_Speed2-=m_Turn;
- if (m_Speed2<0) {
- m_Speed2=0;
- }
- }
- }
- if (m_Forward==0)
- {
- if (m_Turn!=0)
- {
- m_Speed1=-m_Turn; //chang speed
- m_Speed2=m_Turn;
- }
- }
- if (m_Forward<0)
- {
- //Treat turn
- if (m_Turn<0) //turn left
- {
- m_Speed1-=m_Turn; //chang speed
- if (m_Speed1>0) {
- m_Speed1=0;
- }
- }
- if (m_Turn>0)
- {
- m_Speed2+=m_Turn;
- if (m_Speed2>0) {
- m_Speed2=0;
- }
- }
- }
- }
复制代码
一个是实际控制电机的函数
- void S_Control()
- {
- int i;
- byte PWM1,PWM2;
- //last adjust
- m_Speed1+=m_Speed1Adjust;
- m_Speed2+=m_Speed2Adjust;
- if (m_Speed1>255)
- {
- m_Speed1=255;
- }
- if (m_Speed1<-255)
- {
- m_Speed1=-255;
- }
- if (m_Speed2>255)
- {
- m_Speed2=255;
- }
- if (m_Speed2<-255)
- {
- m_Speed2=-255;
- }
- if (m_Speed1>0)
- {
- digitalWrite(P_IN1,LOW);
- digitalWrite(P_IN2,HIGH);
- PWM1=m_Speed1*(C_PWM1MAX-C_PWM1MIN)/255+C_PWM1MIN;
- analogWrite(P_ENA,PWM1);
- }
- if (m_Speed1==0)
- {
- analogWrite(P_ENA,0); //
- digitalWrite(P_IN1,LOW);
- digitalWrite(P_IN2,LOW);
- }
- if (m_Speed1<0)
- {
- digitalWrite(P_IN1,HIGH);
- digitalWrite(P_IN2,LOW);
- PWM1=-m_Speed1*(C_PWM1MAX-C_PWM1MIN)/255+C_PWM1MIN;
- analogWrite(P_ENA,PWM1);
- }
- //Speed2
- if (m_Speed2>0)
- {
- digitalWrite(P_IN3,LOW);
- digitalWrite(P_IN4,HIGH);
- // analogWrite(P_ENB,m_Speed2);
- PWM2=m_Speed2*(C_PWM2MAX-C_PWM2MIN)/255+C_PWM2MIN;
- // Serial.print ("Run2 ");
- // Serial.println (PWM2);
- analogWrite(P_ENB,PWM2);
- }
- if (m_Speed2==0)
- {
- digitalWrite(P_IN3,LOW); //STOP
- digitalWrite(P_IN4,LOW);
- analogWrite(P_ENB,0);
- }
- if (m_Speed2<0)
- {
- digitalWrite(P_IN3,HIGH);
- digitalWrite(P_IN4,LOW);
- PWM2=-m_Speed2*(C_PWM2MAX-C_PWM2MIN)/255+C_PWM2MIN;
- analogWrite(P_ENB,PWM2);
- }
- }
复制代码
下一步,计划先拖根线传递12V和串口.试试后,再处理 移动电源和无线部分的问题. |
|