四轴飞行器Arduino控制多电调控制测试

电子制作

257人已加入

描述

      很长时间没折腾了,因为前段时间忙家里的事情、学校的事情,所以就耽搁了。昨天搞了一个通宵,搞定了今天上午的一个报告,下午就继续搞飞机了。

  我们原定的目标就是通过Arduino来作为四轴飞行器的控制板,那么必然就需要用Arduino来控制四个电机的转速,其实就是多PWM输出。在去年我已经实现了单电机的输出,发现了不少问题。

  首先,舵机的信号格式和我们用的电调的信号格式是相同的,一般来说,航模上的电调信号线接于接收器的三号通道上,但是,如果接在别的通道上也是能正常工作的,这也证明了他们之间信号是相同的。

  但是,上次通过Arduino上的Servo库来控制电机时,发现Servo库输出的pwm宽度会超过电调接收的范围,从而导致电机无法启动。然而,通过遥控器遥控时就不存在这个问题。所以,我今天就首先对遥控器的pwm信号进行测量,然后对Arduino输出的pwm信号进行测量。然后计算出控制方式。注意:这里的pwm信号是通过Arudino上Servo库输出的pwm信号,它是脉冲宽度调制,不是Arduino默认的pwm,默认的pwm是通过占空比来模拟一个模拟量。

  好了,不多说,上图。

  首先,测试电池是否有能力带动两个电机同时稳定地工作,我用遥控器电路对他们进行了测试。先搭建了一个下图所示的电路,进行测试。

  

电调控制

 

  然后就需要测量遥控器输出的脉冲宽度和Arduino输出的脉冲宽度,搭了下面这个电路。为此我还去买了能测占空比的ut10a,但是那个万用表实在不给力,根本没有办法量到数据。-_-b

  这张图当中电调只是起到供电的作用,所以并没有连电机。

  

电调控制

 

  无奈,但是发现Arduino有pulseIn()这个函数,可以计算一个高电平或低电平持续时间,正好,把数据拿下了。

  最高位: 1900us

  最低位: 1100us

  那么就碰到了另外一个问题,既然没有仪器来测量脉冲宽度,那如何去测量Arduino输出的PWM脉冲的宽度呢?我在万念俱灰的情况下,把两个Arduino上的数字端口连在了一起,就像下面图中的一样,看看是否能自己测量自己。

  

电调控制

  结果很出乎意料,居然得到数据了,真的很佩服Arduino写底层库的人,中断控制得如此完美:-)

  

电调控制
电调控制

 

  可以看到,Servo库在输出0时,对应的脉冲宽度为522ms;而输出180时,对应的脉冲宽度为2373ms。远远大于遥控器输出的范围,所以导致一开始电调无法识别Arduino的pwm信号。这样经过简单的计算就可得出,电调的最低位应为56度,最高位应为133度。:-D

  有了这个重要的数据,下面就可以用它来控制电机了。不过首先还是先让程序控制舵机,保证他能正常运行,呵呵。

  

电调控制

 

  测试通过之后,就上电机啦。通过控制板上的两个旋钮,其实就是可变电阻,来控制电机的速度。

  

电调控制

 

  控制板特写

  

电调控制

 

  右边的电源模块特写,整个系统的动力电源和控制电源分为两路,控制电源由我自己做的手机电池包来提供.

  

电调控制

 

  电机特写,呵呵,山寨味道太浓了

  

电调控制

  最后,我测了下电机的电流,在两个电机空载,半油门的情况下,电流为4A左右。这两个电机都是经过风风雨雨的,什么坠机、落水都经历过,轴已经有点不正常了,所以也只是带大概估计一下。

  

电调控制

 

  下面就是测试程序


#include 

//Author:	HE Qichen
//Date:	2011-5-27
//Website:	http://gaishi.vicp.net
//Email:	heqichen(a)gaishi.vicp.net


#define inputPin1  A8
#define inputPin2  A9

#define motorPin1  5
#define motorPin2  6

Servo motor1;
Servo motor2;

void setup()
{
  motor1.attach(motorPin1);
  motor2.attach(motorPin2);
  motor1.write(motorSpeedTransfer(0));
  motor2.write(motorSpeedTransfer(0));
  Serial.begin(9600);
}

void loop()
{
  int input1, input2;
  int speed1, speed2;
  input1 = analogRead(inputPin1);
  input2 = analogRead(inputPin2);
  speed1 = motorSpeedTransfer(input1);
  speed2 = motorSpeedTransfer(input2);
  motor1.write(speed1);
  motor2.write(speed2);
  Serial.print("#1 value: ");
  Serial.print(speed1, DEC);
  Serial.print("    #2 value: ");
  Serial.println(speed2, DEC);
  
  delay(500);
}

int motorSpeedTransfer(int s)
{
  return (s/13 + 56);
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
carlson-chuo 2017-02-18
0 回复 举报
感谢分享,下载学习。 收起回复
henjizq 2015-09-27
3 回复 举报
没用!!! 收起回复
全部评论

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分