控制/MCU
直流电机是应用最广泛的电机。从小型项目到先进的机器人技术,这些电机几乎无处不在。我们之前将 DC Motor 与许多其他微控制器(如Arduino、Raspberry pi )连接起来,并在许多机器人项目中使用它。今天我们学习用AVR微控制器Atmega16控制直流电机。
什么是直流电机?
直流电机是一种将电能转化为机械能的装置。具体来说,直流电机使用直流电流将电能转换为机械能。电机的基本原理是磁场和电流相互作用,在电机内部产生一个力,帮助电机转动。因此,当电流通过磁场中的线圈时,会产生磁力,从而产生扭矩,从而导致电机运动。通过反转电流来控制电机的方向。它的速度也可以通过改变供应电压来改变。由于微控制器有PWM引脚,所以它可以用来控制电机的速度。
在本教程中,将使用Atmega16演示直流电机操作。L293D 电机驱动器将用于反转电流方向,从而改变运动方向。L293D 电机驱动器使用H 桥电路配置,向电机输出所需电流。两个按钮用于选择电机的方向。一个按钮用于选择顺时针旋转,另一个用于选择直流电机的逆时针操作。
所需组件
直流电机 (5V)
L293D电机驱动器
Atmega16微控制器IC
16Mhz 晶体振荡器
两个 100nF 电容器
两个 22pF 电容器
按钮
跳线
面包板
USBASP v2.0
LED(任何颜色)
电路原理图
为直流电机控制编程 Atmega16
这里 Atmega16 使用 USBASP 和 Atmel Studio7.0 进行编程。如果您不知道 如何使用 USBASP 对 Atmega16 进行编程 ,请访问链接。 完整的程序在项目结束时给出, 只需将程序上传到 Atmega16 并使用两个按钮来顺时针和逆时针旋转直流电机。
直流电机使用 L293D 电机驱动器连接。按下相应的按钮时,直流电机将沿两个方向旋转。一个按钮用于顺时针方向旋转直流电机,另一个按钮用于逆时针方向旋转直流电机。首先定义微控制器的 CPU 频率并包含所有必要的库。
#define F_CPU 16000000UL #include#include
然后,使用一个变量来跟踪按钮按下状态。该变量将用于定义电机的方向。
诠释我;
使用数据方向寄存器选择 GPIO 的输入/输出模式。最初,将电机引脚的输出设为低电平,以避免在未按下按钮的情况下启动电机。
DDRA = 03; 门 &= ~(1<<1); 门 &= ~(1<<0);
检查连接到 Atmega16 的PORTA4的第一个按钮是否被按下,并将按钮的状态存储在变量中。
if(!bit_is_clear(PINA,4)) { i = 1; 门 &= ~(1<<1); _delay_ms (1000); }
同样检查第二个按钮是否被按下,连接到 Atmega16 的 PORTA5,并将按钮的状态存储在变量中。
否则如果 (!bit_is_clear(PINA,5)) { i = 2; 门 &= ~(1<<0); _delay_ms (1000); }
如果第一个按钮的状态为真,则顺时针旋转直流电机,如果第二个按钮的状态为真,则逆时针旋转直流电机。
如果 (i == 1) { 门 |= (1<<0); 门 &= ~(1<<1); } else if (i == 2) { PORTA |= (1<<1); 门 &= ~(1<<0); }
您可以根据使用的 GPIO 将电机引脚连接到任何 GPIO 引脚。此外,使用电机驱动器 IC 来减少微控制器上的负载也很重要,因为微控制器无法提供运行直流电机所需的电流。
/* 直流电机与 Atmega16 的接口
电路文摘(circuitdigest.com)*/
#define F_CPU 16000000UL //定义cpu频率
#include
#include
诠释我; //定义比较变量
诠释主要(无效)
{
//DDR数据方向寄存器
DDRA = 03; // 使 PORTA0,1 引脚作为输出,Rest 作为输入
门 &= ~(1<<1); // 最初将 PORTA1 引脚设为低电平,以避免在选择按钮之前移动
门 &= ~(1<<0); // 最初将 PORTA0 引脚设为低电平,以避免在选择按钮之前移动
而(1)
{
if(!bit_is_clear(PINA,4)) // 检查 PORTA4 按钮是否被按下
{
我 = 1; //存储状态为1
门 &= ~(1<<1);
_delay_ms(1000);
}
else if (!bit_is_clear(PINA,5)) // 检查 PORTA5 按钮是否被按下
{
我 = 2; //存储状态为2
门 &= ~(1<<0);
_delay_ms(1000);
}
if (i == 1) // 如果第一个按钮被按下
{
门 |= (1<<0); //顺时针旋转
门 &= ~(1<<1);
}
else if (i == 2) //如果第二个按钮被按下
{
门 |= (1<<1); //逆时针旋转
门 &= ~(1<<0);
}
}
}
全部0条评论
快来发表一下你的评论吧 !