Arduino控制好盈电调(非常重要)转载

用arduino控制好盈无刷电调本来的想法用arduino的pwm脚,通过analogWrite 输出pwm信号就可以驱动电调的。写了个程序一试,不行,电机就是B-B的叫。后来找了一些资料,看到网上一些朋友用Servo库以控制舵机的方式来驱动电调。说arduino的analogWrite输出跟Servo的不是一个东西(http://www.elecfans.com/article/89/169/2012/20120621277343.html) ,后来我用Servo库试了一下,电机是可以动起来了,但是只动了一下,又停了 :http://wenku.baidu.com/view/6c2537353968011ca3009119.html

为什么用Servo就可以,而用analogWrite 输出的PWM信号就不行了呢。书上说analogWrite 产生的是一个大约490Hz的占空比可变的脉冲序列,而根据文库中写的,控制无刷电调要使用20ms的PWM信号。我想应该就是这个原因吧。

后来继续搜,在arduino.cn上看到一篇贴子,不用Servo来驱动舵机 http://www.arduino.cn/thread-45-1-1.html。我尝试用它来控制我的无刷电调,但是一开始是失败的。后来我看到了好盈电调的说明书,http://www.docin.com/p-305686520.html 原来这电调可高级了,还可以进入编程模式啥的。而且电调首次使用,没调制好油门行程,也是不能驱动电机的。但是我手头上并没有遥控器,于是改了一下代码,模拟设置油门行程。设置好了之后,电机终于转起来了!

//see http://www.docin.com/p-305686520.html

int sp1=9;//定义舵机接口数字接口7
int pulsewidth;//定义脉宽变量
int val;
int val1;
int myangle1;
//下面是servopulse函数部分(此函数意思:也就是說每次都是0.5ms高電平 1.98ms低電平 然後再0.52ms低電平 17ms延時也是低電平)
void servopulse(int sp1,int val1)//定义一个脉冲函数
{
myangle1=map(val1,0,180,500,2480);
digitalWrite(sp1,HIGH);//将舵机接口电平至高
delayMicroseconds(myangle1);//延时脉宽值的微秒数
digitalWrite(sp1,LOW);//将舵机接口电平至低
delay(20-val1/1000);
}
//servopulse函数部分到此结束
void setup()
{
pinMode(sp1,OUTPUT);//设定舵机接口为输出接口
//设置两组串口波特率
Serial.begin(9600);

Serial.println("servu=o_seral_simple ready" ) ;

//看电调说明书,设置油门行程时,一开始需要把遥控器打到最高点。i<=110大概是2杪多
for(int i=0;i<=110;i++)
{
servopulse(sp1,150);//引用脉冲函数
}

//等电机发出B-B两声后(就是两秒后,大概就是这里了)把油门打到最低点
for(int i=0;i<=55;i++)
{
servopulse(sp1,20);//引用脉冲函数
}

//后面提示后,就可以控制电机转动了
for(int i=0;i<=150;i++)
{
servopulse(sp1,150);//引用脉冲函数
}

Serial.println("hello world" ) ;

}

void loop()//将0到9的数转化为0到180角度,并让LED闪烁相应数的次数
{
val='8';

if(val>'0'&& val<='9')
{
val1=val-'0';//将特征量转化为数值变量
val1=map(val1,0,9,0,180);//将角度转化为500-2480的脉宽值
Serial.print("moving servo to ");
Serial.print(val1,DEC);
Serial.println();
for(int i=0;i<=50;i++)//给予舵机足够的时间让它转到指定角度
{
servopulse(sp1,val1);//引用脉冲函数
}
}

}

标签: Arduino教程