求助L298N和舵机不能一起使用
求助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 ��
int dir2Pin; //in2 ��
int speedPin;//en�����ڿ����ٶ�
int motorspeed;// �ٶ�ֵ-100��100
motorL298N(int pdir1,int pdir2, int pspeed); //���캯��
motorL298N();
void setpin(int pdir1,int pdir2, int pspeed);
void motorinit();//�������
int readmotorspeed(); //��ȡ����ٶ�
void setmotorspeed(int pspeed); //���õ���ٶ�
};
//---------------------------------------------------------------------------
#endif
------------------------------------------------------------------------------------------------------------
MotorL298N.cpp文件
#include "MotorL298N.h"
motorL298N::motorL298N(int pdir1,int pdir2, int pspeed) //���캯��
{
dir1Pin=pdir1; //in1 ��
dir2Pin=pdir2; //in2 ��
speedPin=pspeed;//en�����ڿ����ٶ�
}
motorL298N::motorL298N()
{
}
void motorL298N::setpin(int pdir1,int pdir2, int pspeed)
{
dir1Pin=pdir1; //in1 ��
dir2Pin=pdir2; //in2 ��
speedPin=pspeed;//en�����ڿ����ٶ�
}
void motorL298N::motorinit()//�������
{
pinMode(dir1Pin, OUTPUT);
pinMode(dir2Pin, OUTPUT);
pinMode(speedPin, OUTPUT);
motorspeed=0;
}
int motorL298N::readmotorspeed() //��ȡ����ٶ�
{
return motorspeed;
}
void motorL298N::setmotorspeed(int pspeed) //���õ���ٶ�
{
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);
}
}
//---------------------------------------------------------------------------
本帖最后由 cnkids 于 2012-10-1 08:35 编辑
单独使用的时候两个都可以? 是的,用起来都行 Servo库和pwm是冲突的,所以在用Servo库的时候不能输出pwm,也就不能用pwm控制L298N调速,直接用高低电平控制正反转,是可以用的 本帖最后由 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);//引用脉冲函数
}
}
类很简单,好处,解决Servo库和pwm的冲突,可以和我写的MotorL298N类合在一起用 本帖最后由 芷雅焉 于 2012-12-11 00:51 编辑
谢谢分享~我也出现这种问题了。。但是我的情况和你的不完全一样。。我的是控制舵机和电机一起运动,电机症状的时候一切正常,电机反转的时候就不动了,而且莫名其妙的烧坏了8个舵机。。超级郁闷中。。至今仍没有想明白为什么。。
明天去试一下你的方法~先行谢谢
页:
[1]