您现在的位置是:网站首页> 硬件

动手学arduino用mos管驱动马达

  • 硬件
  • 2021-03-28
  • 1339人已阅读
摘要

市场上的小风扇很受小朋友们喜欢,你是否也想做一款属于自己的迷你风扇?

你需要准备一片arduino,一个小电机,扇叶,支架等。

本文只介绍核心控制部分,外壳安装省略。

1.jpeg

Arduino开发板上的每一个引脚只能提供10~20mA的电流,仅能驱动一个LED灯。如果你要用它驱动一个直流电机,最后的结果也许是电机不转,或许把你的芯片烧坏,都是有可能的。为了驱动大功率负载,我们就必须借助一些其他的电子元器件,这就是在硬件领域最重要的开关管MOSFET晶体管,它有三个引脚,arduino的引脚连G极,drain接马达负极、Source接地,马达接VCC。我们给G极高电平,MOSFET就会导通,以此达到小电流控制大电流的目的。

2.jpg

注意:arduino的GND要与外接电源的负极相连!

建议:G极与地之间接一个数百K的电阻。

在这里,MOS管就像一个开关,控制电机的功率。Arduino引脚2用于打开和关闭MOS管.

在实验中,可以用’NPN型BJT’代替NMOS管,但在改变管脚接线。


警告 – 不要直接从Arduino板引脚驱动电机。这可能会损坏电路板。


淘宝上有做好的mos模块,如下图:

3.jpeg
各个引脚
4.png
左上角 V+ V- 是输出的正负。右上角 Vin 和 GND 是输入的电源的正负极。V+ 和Vin 是通的,右上角的GND和下面的GND是通的。下面一排分别是 SIG (控制信号),VCC (控制信号电源),GND(控制信号的地)。
为了验证MOS所以设计了一个实验,用Arduino的PWM输出来控制 SIG,然后达到控制灯泡亮度的目的。
 

改变电机的转速——PWM

PWM(脉冲宽度调制)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
 

简单说来,arduino各引脚通常只有0(0伏)和1(5伏)两个状态,要让引脚输出0.4(2伏),怎么办?pwm就有办到。
 

在arduino中,用pwm驱动LED的暗亮程度,电机的转速等。
 

在仿真电路中,在10脚接一个LED电路,并联一个电压表,给一段让10脚电压从0-5V来回变化(LED呼吸灯)效果的代码。

代码:

仿真截图一:

5.jpg

仿真截图二:

6.jpg


驱动电机:mos的G极接arduino的3脚。

arduino板上画有“~”的引脚表示可以输出pwm。Arduino UNO 控制器的数字引脚中,3,5,6,9,10,11六个可以输出PWM信号。

7.jpg

代码:

8.png

Arduino Uno输出自定义频率的PWM

Arduino里的PWM

首先,Arduino Uno的5,6,9,10,3,11接口可以通过简单语句analogWrite(pin, dutyCycle)来实现一个指定占空比的PWM。其中pin的值选择(5,6,9,10,3,11),dutyCycle的值在0~255之间,0为占空比0%,255为占空比100%。但是这种方式PWM信号的频率是固定的默认值,大约1000Hz左右(16MHz/64/256)。


其次,手动切换高电平和低电平,再在中间加入delay函数,可以实现自定义频率的PWM:


void setup()

{

  pinMode(13, OUTPUT);

}


void loop()

{

  digitalWrite(13, HIGH);

  delayMicroseconds(100); // Approximately 10% duty cycle @ 1KHz

  digitalWrite(13, LOW);

  delayMicroseconds(1000 - 100); //修改这里的1000可以调整频率

}


这个例子中:一个循环是1000us = 1ms,所以一秒循环1000次,因此Frequency是1KHz,

每个循环中:有电的比率是100/1000 * 100% = 10%,所以duty cycle(占空比)为10%

这样就可以模拟出5V * 10%=0.5V的电压

好处是任何一个引脚都能通过这样输出PWM,

但是,这种操作需要CPU全神贯注的查数,任何其他的进程的干扰会导致输出的信号频率不准。


综上,需要底层的手段来控制Arduino实现PWM的频率调节。

调节Arduino里的时钟频率

Arduino Uno里有三个Timer:Timer0,Timer1,Timer2。 三个Timer都可以自定义调整频率,但是各有特点。Timer0负责控制delay等函数,动了Timer0的频率会导致计时函数不准;Timer1的计数器是16位的,和Timer0,Timer2的8位计数器不太一样;Timer2的频率可调的档位更多,因为它有7档预除数,下文会进一步解释。这里选择Timer2进行调节操作,先上代码:


void setup() {

  // put your setup code here, to run once:


  pinMode(3, OUTPUT); 

  pinMode(11, OUTPUT); 

  

  TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20); //Set Timer2 to varying top limit fast PWM mode

  TCCR2B = _BV(WGM22) | _BV(CS22) | _BV(CS21) | _BV(CS20);//another way to set prescaler CS2=fff

  

  OCR2A = 155; //Top value A

  OCR2B = 30; //Toggle value B, Output at pin 3

 

  //CS2  Divisor  Frequency

  //001    1        31372.55

  //010    8        3921.16

  //011    32       980.39

  //100    64       490.20   <--DEFAULT

  //101    128      245.10

  //110    256      122.55

  //111    1024     30.64

}


void loop() {

  // put your main code here, to run repeatedly:


}

由以上代码可见,需要的设置分为三个部分:pinMode,TCCR2A/B,OCR2A/B(这里的2是因为选择了Timer2)



Top