29049| 10
|
[进阶] 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 原来这电调可高级了,还可以进入编程模式啥的。而且电调首次使用,没调制好油门行程,也是不能驱动电机的。但是我手头上并没有遥控器,于是改了一下代码,模拟设置油门行程。设置好了之后,电机终于转起来了! [mw_shl_code=cpp,false]//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);//引用脉冲函数 } } }[/mw_shl_code] |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed