xuyaogyo 发表于 2013-5-24 19:25:22

用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);//引用脉冲函数
    }
}

}


参考的资料
http://www.arduino.cn/thread-45-1-1.html
http://www.docin.com/p-305686520.html
http://www.cnblogs.com/einyboy/archive/2012/12/15/2819616.html
http://www.elecfans.com/article/89/169/2012/20120621277343_4.html
http://www.diy-robots.com/?p=814
http://wenku.baidu.com/view/6c2537353968011ca3009119.html

当然我这里还有好多问题不明白也讲也不对的,还请各位高人指导指导, 让大家有共享知识的机会!

darkorigin 发表于 2013-5-24 22:21:42

写的很好,赞一个~~~~

拾瑞 发表于 2013-5-29 13:08:55

1,直接用SERVO库是可以的!不过你需要改一下PWM频率,由50HZ改为400HZ,这样可以驱动绝大部份电调了!
2,舵机和电调控制PWM,只和电压上升沿有关,和下降沿无关的!就一点我也是做了试验以后才知道的,只知道舵机信号应该是50HZ.......我这样的一知半解的小白真的是让所谓的标准舵机信号害死了还不知道为什么!!!
3,舵机和电调应该都是PWM调制,不会用analogWrite,应该用digitalWrite.......

和稀泥 发表于 2013-5-29 20:33:13

电调本身就可以控制舵机,二者信号是相通的

tanbocandy 发表于 2013-6-1 01:19:44

我有个杂牌的电调不知道行不 有时间试试

zhangzhe0617 发表于 2013-6-28 11:06:25

请问这个帖子是控制舵机的是么?我改了改用的电机叫两声然后一直在滴---滴,也不转:dizzy:好像是卡在高低行程设置,也不知道哪里出问题了

航迷★飞翔 发表于 2013-10-30 14:34:59

zhangzhe0617 发表于 2013-6-28 11:06 static/image/common/back.gif
请问这个帖子是控制舵机的是么?我改了改用的电机叫两声然后一直在滴---滴,也不转好像是卡在高低行 ...

我也是这样啊。。你问题解决了没?

zhangzhe0617 发表于 2013-11-1 14:33:24

航迷★飞翔 发表于 2013-10-30 14:34 static/image/common/back.gif
我也是这样啊。。你问题解决了没?

我改成用可变电阻先找到电机高低行程对应的油门值,在这个油门值范围能通过改变电阻调转速,不知道把这个映射范围预编译一下是不是下次就不用再设置了?代码不在这个本里暂时传不了,这是笨方法期待高手指点。滴滴叫是行程没调好。

学慧放弃 发表于 2013-11-19 22:17:17

我可以参考了,用来控制

osado 发表于 2013-11-27 00:07:06

請問是不是只適用好盈电调?

for 发表于 2014-3-5 22:15:45

三水的帖子?

for 发表于 2014-4-8 23:27:51

转向能控制吗比如让电机正转或者反转?:)

ml418ily 发表于 2014-5-16 17:47:39

留名!!!!!!!!!!!!!!!!!!!!!!

thistime 发表于 2014-7-3 22:00:33

用analogWrite就可以,我就是这样用的。只是电调刚上电时,可以进行各种设置,如果你不设置,就要保持PWM(一般是50%)一会就可以了

jin_tong 发表于 2014-7-8 15:44:24

留名,学习了,写得不错
页: [1] 2
查看完整版本: 用arduino控制好盈无刷电调