Arduino基础篇(九)-- 无刷直流电机转速和方向控制

        本文选择Arduino MEGA 2560开发板做调试,通过调整PWM的占空比,控制BLDC3525,内置有感有霍尔驱动,实现对无刷直流电机的转速控制,通过调整数字口输出高低电平,从而实现电机方向控制。

1 认识BLDC电机

        无刷直流电机(BLDC)是永磁式同步电机的一种,而并不是真正的直流电机。区别于有刷直流电机,无刷直流电机不使用机械的电刷装置,采用方波自控式永磁同步电机,以霍尔传感器取代碳刷换向器,以钕铁硼作为转子的永磁材料,性能上相较一般的传统直流电机有很大优势,是当今最理想的调速电机。

        无刷直流电机(BLDC)以电子换向器取代了机械换向器,所以无刷直流电机既具有直流电机良好的调速性能等特点,又具有交流电机结构简单、无换向火花、运行可靠和易于维护等优点。

        无刷直流电机有以下的特点:

  1. 无刷直流电机的外特性好,能够在低速下输出大转矩,使得它可以提供大的起动转矩;
  2. 无刷直流电机的速度范围宽,任何速度下都可以全功率运行;
  3. 无刷直流电机的效率高、过载能力强,使得它在拖动系统中有出色的表现;
  4. 无刷直流电机的再生制动效果好,由于它的转子是永磁材料,制动时电机可以进入发电机状态;
  5. 无刷直流电机的体积小,功率密度高;
  6. 无刷直流电机无机械换向器,采用全封闭式结构,可以防止尘土进入电机内部,可靠性高;
  7. 无刷直流电机比异步电机的驱动控制简单。

        无刷直机电机的驱动方式按不同类别可分多种驱动方式:

  1. 按驱动波形:方波驱动,这种驱动方式实现方便,易于实现电机无位置传感器控制;
  2. 正弦驱动:这种驱动方式可以改善电机运行效果,使输出力矩均匀,但实现过程相对复杂。同时,这种方法又有 SPWM 和 SVPWM(空间矢量 PWM)两种方式,SVPWM的效果好于 SPWM。

2 PWM调速原理

        PWM 调速实质上是调节占空比,我们一般是根据占空比的大小来衡量速度,占空比是高电平在一个周期之中的比值,高电平的所占的比值越大,占空比就越大,对于直流电机来讲,电机输出端引脚是高电平电机就可以转动,当输出端高电平时,电机会转动,但是是一点一点的提速,在高电平突然转向低电平时,电机由于电感有防止电流突变的作用是不会停止的,会保持这原有的转速,以此往复,电机的转速就是周期内输出的平均电压值,所以实质上我们调速是将电机处于一种,似停非停,似全速转动又非全速转动的状态,那么在一个周期的平均速度就是我们占空比调出来的速度了。

        在电机控制中,电压越大,电机转速越快,而通过PWM输出不同的模拟电压,便可以使电机达到不同的输出转速。在电机控制中,不同的电机都有其适应的频率,频率太低会导致运动不稳定,如果频率刚好在人耳听觉范围,有时还会听到呼啸声。频率太高的电机可能反应不过来。

        在 PWM 调速系统中,一般可以采用定宽调频、调宽调频、定频调宽3 种方法改变控制脉冲的占空比,但是前两种方法在调速时改变了控制脉宽的周期,从而引起控制脉冲频率的改变,当该频率与系统的固有频率接近时将会引起振荡。为避免之,设计采用定频调宽改变占空比的方法来调节PWM。正常的电机频率在 6-16kHz之间为好

        定频调速是在脉冲波形的频率不变的前提下(脉冲波形的周期不变),通过改变一个周期波形中高电平的时间从而改变波形的占空比,从而改变平均电压,调整电机的转速。 假定电机始终接通电源时,电机最大转速为Vmax, 占空比为D = t /T, 则电机的平均速度Vd =D*Vmax, 由公式可知,当改变占空比D = t /T 时,就可以得到不同的电机平均速度Vd,从而达到调速的目的。

        对于直流电机的调速,我们可以通过提调节输出PWM的占空比,实现电机转速的控制;对于测速,通过定时器设置一定的时间,并计算反馈信号触发外部中断的次数,进行转换,就可以得到电机转速。

3 实验器材

  1. Arduino MEGA 2560
  2. BLDC 3525
  3. 12V电池组,或者电压源
  4. 接线方式:共地
Arduino基础篇(九)-- 无刷直流电机转速和方向控制_第1张图片 Arduino基础篇(九)-- 无刷直流电机转速和方向控制_第2张图片 Arduino基础篇(九)-- 无刷直流电机转速和方向控制_第3张图片


4 程序代码

/*********************************************************************
 ——————1.开发环境:Arduino IDE——————————————————————————————————
 ——————2.使用开发板型号:Arduino Mega 2560——————————————————————
 ——————3.电机型号:36GP BLDC3525直流无刷电机内置霍尔驱动(五线)—
*********************************************************************/
#include              //定时器库的头文件

// 引脚命名
#define FG_Pin 20                  // 霍尔信号,对应外部中断编号3
#define Motor 22                   // PWM波输入
#define Direction 24               // 换向线

// 定义变量,如果变量要在中断中访问,要使用volatile进行申明
uint16_t counter = 0;             // 霍尔信号计数器
volatile int16_t speed = 0;       // 定义转速

// 中断函数
void counterISR(){
  counter++;    // 计数+1
}

// 把计数器置零
void resetCounter(){
    measurement();
    counter = 0;
}

// 计算测量到的电机转速
long measurement( ){
  /* 
   * 此电机一圈输出9个脉冲信号,计时0.5s,测一次速度,计算信号变化的次数,转化为转速(rpm) 
   */
  speed = counter/9/0.5*60;  
  Serial.print("当前转速:");
  Serial.print(speed);
  Serial.println("r/min"); 
}

void setup() {
 
  Serial.begin(115200);
  pinMode(FG_Pin,INPUT);
  pinMode(Motor,OUTPUT);
  pinMode(Direction,OUTPUT);

  attachInterrupt(3,counterISR,RISING);      // 外部中断,每次上升沿触发一次中断,便计一次数
  
  FlexiTimer2::set(500,resetCounter);       // 定时器中断,中断设置函数,每 500ms 进入一次中断,计算一次转速
  FlexiTimer2::start();                		// 开始计时
}

void loop() {
    digitalWrite(Direction,HIGH);     		// 设置旋转方向,高电平逆时针转,方向为负  
    digitalWrite(Motor, HIGH);
    delayMicroseconds(100); 				// 此时占空比100%,频率10KHz
    digitalWrite(Motor, LOW);
    delayMicroseconds(100 - 0); 			// 修改这里的100可以调整频率,可知,方波周期为100微妙
}

5 实验结果

Arduino基础篇(九)-- 无刷直流电机转速和方向控制_第4张图片
        根据输出结果,可知,电机空载转速6000r/min。


6 实验总结

  1. 不要直接从Arduino板引脚驱动电机,这可能会损坏电路板,可以使用驱动电路或IC。
  2. 注意 PWM 信号的频率和占空比设置是否合适。
  3. 注意共地,否则有可能Arduino的PWM没法对电机调速。

    警告:若电机没有内置驱动,则不要直接从Arduino板引脚驱动电机,这可能会损坏电路板。使用驱动电路或IC。

你可能感兴趣的:(Arduino,arduino,嵌入式,无刷直流电机,BLDC,PWM)