极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21269|回复: 6

求助L298N和舵机不能一起使用

[复制链接]
发表于 2012-9-29 16:15:17 | 显示全部楼层 |阅读模式
求助L298N和舵机不能一起使用
可以驱动舵机,但电机不工作了,求大侠帮忙
主程序:
#include <Servo.h>
#include "MotorL298N.h"

motorL298N motor;
Servo myservo;
int pos=0;
void setup()
{
  motor.setpin(11,12,10);
  motor.motorinit();
  myservo.attach(6);
}
void loop()
{
  motor.setmotorspeed(-50);
  pos=0;
  int p = map(pos, -100,100, 78, 108);
  myservo.write(p);
}
------------------------------------------------------------------------------------------------------------
自己写的一个类,由于驱动L298N电机的
MotorL298N.h 头文件


#ifndef MotorL298NH
#define MotorL298NH
#if ARDUINO >= 100
#include <Arduino.h>
#else
#include <WProgram.h>
#endif

class motorL298N
{
  public:
     int dir1Pin;   //in1 &#65533;&#65533;
     int dir2Pin;   //in2 &#65533;&#65533;
     int speedPin;  //en  &#65533;&#65533;  &#65533;&#65533;&#65533;&#1727;&#65533;&#65533;&#65533;&#65533;&#1654;&#65533;
     int motorspeed;  // &#65533;&#1654;&#65533;&#1461;  -100&#65533;&#65533;100

    motorL298N(int pdir1,int pdir2, int pspeed); //&#65533;&#65533;&#65533;&#52911;&#65533;&#65533;
    motorL298N();
   void setpin(int pdir1,int pdir2, int pspeed);
   void motorinit();  //&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;
   int readmotorspeed(); //&#65533;&#65533;&#545;&#65533;&#65533;&#65533;&#65533;&#1654;&#65533;
   void setmotorspeed(int pspeed); //&#65533;&#65533;&#65533;&#245;&#65533;&#65533;&#65533;&#1654;&#65533;
};




//---------------------------------------------------------------------------
#endif

------------------------------------------------------------------------------------------------------------
MotorL298N.cpp文件

#include "MotorL298N.h"
motorL298N::motorL298N(int pdir1,int pdir2, int pspeed) //&#65533;&#65533;&#65533;&#52911;&#65533;&#65533;
{
    dir1Pin=pdir1;   //in1 &#65533;&#65533;
    dir2Pin=pdir2;   //in2 &#65533;&#65533;
    speedPin=pspeed;  //en  &#65533;&#65533;  &#65533;&#65533;&#65533;&#1727;&#65533;&#65533;&#65533;&#65533;&#1654;&#65533;
}
motorL298N::motorL298N()
{
}
void motorL298N::setpin(int pdir1,int pdir2, int pspeed)
{
    dir1Pin=pdir1;   //in1 &#65533;&#65533;
    dir2Pin=pdir2;   //in2 &#65533;&#65533;
    speedPin=pspeed;  //en  &#65533;&#65533;  &#65533;&#65533;&#65533;&#1727;&#65533;&#65533;&#65533;&#65533;&#1654;&#65533;
}

void motorL298N::motorinit()  //&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;
{
  pinMode(dir1Pin, OUTPUT);
  pinMode(dir2Pin, OUTPUT);
  pinMode(speedPin, OUTPUT);
  motorspeed=0;
}
int motorL298N::readmotorspeed() //&#65533;&#65533;&#545;&#65533;&#65533;&#65533;&#65533;&#1654;&#65533;
{
   return motorspeed;
}
void motorL298N::setmotorspeed(int pspeed) //&#65533;&#65533;&#65533;&#245;&#65533;&#65533;&#65533;&#1654;&#65533;
{
    motorspeed=pspeed;
    if(pspeed<0)
     pspeed=pspeed*(-1);
  int speed = map(pspeed, 0, 100, 0, 255);
  analogWrite(speedPin, speed);
  if (motorspeed>0)
  {
    digitalWrite(dir1Pin, LOW);
    digitalWrite(dir2Pin, HIGH);
  }
  else if(motorspeed<0)
  {
    digitalWrite(dir1Pin, HIGH);
    digitalWrite(dir2Pin, LOW);
  }
}

//---------------------------------------------------------------------------

回复

使用道具 举报

发表于 2012-10-1 08:33:57 | 显示全部楼层
本帖最后由 cnkids 于 2012-10-1 08:35 编辑

单独使用的时候两个都可以?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-1 12:26:32 | 显示全部楼层
是的,用起来都行
回复 支持 反对

使用道具 举报

发表于 2012-10-5 20:06:07 | 显示全部楼层
Servo库和pwm是冲突的,所以在用Servo库的时候不能输出pwm,也就不能用pwm控制L298N调速,直接用高低电平控制正反转,是可以用的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-22 09:55:06 | 显示全部楼层
本帖最后由 tom_hsh 于 2012-10-22 09:57 编辑

thanks 绿林网页 提供解决问题的思路
以下是我写的舵机类,大家一起研究
“myServo.h”文件

#ifndef myServoH
#define myServoH
#if ARDUINO >= 100
#include <Arduino.h>
#else
#include <WProgram.h>
#endif

class myServo
{
  public:
    int servopin;//定义舵机接口数字接口
    int myangle;//定义角度变量
    int pulsewidth;//定义脉宽变量
    int val;
   
   
    void ServoInit(int pin);
   int ReadServoAngle();
   void SetServoAngale(int pmyangle);
   myServo();
};
//---------------------------------------------------------------------------
#endif



---------------------------------------------------------------------------------------------------------
"myServo.cpp"文件

#include "myServo.h"

myServo::myServo()
{
  servopin=1;
}
void myServo::ServoInit(int pin)
{
   servopin=pin;
    pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
}
int myServo::ReadServoAngle()
{
   return myangle;
}
void myServo::SetServoAngale(int pmyangle)
{
     for(int i=0;i<=30;i++)//给予舵机足够的时间让它转到指定角度
     {
       myangle=pmyangle;
       pulsewidth=(myangle*11)+500;//将角度转化为500-2480的脉宽值
       digitalWrite(servopin,HIGH);//将舵机接口电平至高
       delayMicroseconds(pulsewidth);//延时脉宽值的微秒数
       digitalWrite(servopin,LOW);//将舵机接口电平至低
       delay(20-pulsewidth/1000);
     }
}
-------------------------------------------------------------------------------------------------------

用法:
#include "myServo.h"
myServo servo;

void setup()
{
    servo.ServoInit(6);
  Serial.begin(9600);
}
void loop()
{
int Angale;
    Angale=Serial.read();//读取串行端口的角度值,0到180度
if(Angale>'0'&&Angale<='180')
  {
   servo.SetServoAngale(Angale);//引用脉冲函数
   }
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-22 10:00:16 | 显示全部楼层
类很简单,好处,解决Servo库和pwm的冲突,可以和我写的MotorL298N类合在一起用
回复 支持 反对

使用道具 举报

发表于 2012-12-11 00:48:16 | 显示全部楼层
本帖最后由 芷雅焉 于 2012-12-11 00:51 编辑

谢谢分享~我也出现这种问题了。。但是我的情况和你的不完全一样。。我的是控制舵机和电机一起运动,电机症状的时候一切正常,电机反转的时候就不动了,而且莫名其妙的烧坏了8个舵机。。超级郁闷中。。至今仍没有想明白为什么。。

明天去试一下你的方法~先行谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-18 04:07 , Processed in 0.040238 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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