因为实验Lagging Pendulum需要一个电机驱动L型摆,要求速度可调可测。在寻找现成设备无果后,决定自己造一个。

Arduino作为一个流行的开源硬件,上手简单,搭配不同扩展板可实现丰富功能,网上资源众多。因为四天后就要交实验答辩ppt,所以妥妥选择了Arduino。


硬件设备

Arduino开发板
L298N电机驱动板
光电测速模块及码盘
直流减速电机
两节18650电池(共7.4V)
导线若干

硬件原理

Arduino的DigitalPin 3、5、6、9和11可以输出pwm脉宽调制。使用函数analogWrite来输出设定值。analogWrite需要一个0~255的参数,其中0为关闭,255为全功率。

L298N电流驱动板可以驱动一个步进电机或两个直流电机。7.4V电池提供驱动电压,5V逻辑电压可由L298N板内供电。将Arduino的PWM接到L298N的使能端口EA。Pin8、9接到I1、I2;OUT1、OUT2接到直流电机两端。

光电码盘测速就三个引脚,Vcc(5V), Gnd, Out(clk)。将Out连接到Arduino的Pin2。随着码盘转动,Out输出方波,频率与速度成正比。
——连线图就懒得拍了——

程序清单

#include <MsTimer2.h>
int pinI1=8;//定义I1接口
int pinI2=9;//定义I2接口
int pwmPin=10;//定义EA(PWM调速)接口
int speed=200;

int vTest=2;//定义中断测速接口
int nWheel = 0;  //记录测速模块的次数
float omega = 0;  //角速度

float velocity(int n)
{
    //角速度的计算公式为(n/20)*(2pi),即n*0.31415
    float vel = n*0.31415;
    return vel;
}

void flash()
{
    int nr;
    nr = nWheel;
    omega = velocity(nr);
    nWheel = 0;
    Serial.print(omega);
    Serial.println("rad/s");

}

void setup()
{
  Serial.begin(9600);  //串口波特率为9600

  attachInterrupt(0,count, FALLING);

  pinMode(pinI1,OUTPUT);//定义该接口为输出接口
  pinMode(pinI2,OUTPUT);
  pinMode(pwmPin,OUTPUT);
  pinMode(vTest,INPUT);
  pinMode(13, OUTPUT);

  digitalWrite(pinI1,LOW);//使直流电机顺时针转
  digitalWrite(pinI2,HIGH);
  
  MsTimer2::set(1000, flash);        // 中断设置函数,每 1s 进入一次中断
  MsTimer2::start();
  
}
void loop()
{ 
  analogWrite(pwmPin,speed);
  
  digitalWrite(13, HIGH);       
}

void count()
{
  nWheel++;
}

改进

目前实现的功能只有用PC设定速度(0~255),测速模块将信息传送给Arduino,经计算将速度打印在PC屏幕上。调速不方便,可以用旋转角度电位计做模拟输入,用map函数映射到pwm参数设置,可以实现用旋钮调速。

引用