您现在的位置是:网站首页> 硬件
动手学arduino用mos管驱动马达
- 硬件
- 2021-03-28
- 1339人已阅读
市场上的小风扇很受小朋友们喜欢,你是否也想做一款属于自己的迷你风扇?
你需要准备一片arduino,一个小电机,扇叶,支架等。
本文只介绍核心控制部分,外壳安装省略。
Arduino开发板上的每一个引脚只能提供10~20mA的电流,仅能驱动一个LED灯。如果你要用它驱动一个直流电机,最后的结果也许是电机不转,或许把你的芯片烧坏,都是有可能的。为了驱动大功率负载,我们就必须借助一些其他的电子元器件,这就是在硬件领域最重要的开关管MOSFET晶体管,它有三个引脚,arduino的引脚连G极,drain接马达负极、Source接地,马达接VCC。我们给G极高电平,MOSFET就会导通,以此达到小电流控制大电流的目的。
注意:arduino的GND要与外接电源的负极相连!
建议:G极与地之间接一个数百K的电阻。
在这里,MOS管就像一个开关,控制电机的功率。Arduino引脚2用于打开和关闭MOS管.
在实验中,可以用’NPN型BJT’代替NMOS管,但在改变管脚接线。
警告 – 不要直接从Arduino板引脚驱动电机。这可能会损坏电路板。
淘宝上有做好的mos模块,如下图:
各个引脚
左上角 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呼吸灯)效果的代码。
代码:
仿真截图一:
仿真截图二:
驱动电机:mos的G极接arduino的3脚。
arduino板上画有“~”的引脚表示可以输出pwm。Arduino UNO 控制器的数字引脚中,3,5,6,9,10,11六个可以输出PWM信号。
代码:
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)
上一篇:动手学arduino智能水杯
下一篇:动手学arduino按键控制