用AVR微控制器Atmega16控制直流电机

控制/MCU

1814人已加入

描述

  直流电机是应用最广泛的电机。从小型项目到先进的机器人技术,这些电机几乎无处不在。我们之前将 DC Motor 与许多其他微控制器(如Arduino、Raspberry pi )连接起来,并在许多机器人项目中使用它。今天我们学习用AVR微控制器Atmega16控制直流电机。

  什么是直流电机?

  直流电机是一种将电能转化为机械能的装置。具体来说,直流电机使用直流电流将电能转换为机械能。电机的基本原理是磁场和电流相互作用,在电机内部产生一个力,帮助电机转动。因此,当电流通过磁场中的线圈时,会产生磁力,从而产生扭矩,从而导致电机运动。通过反转电流来控制电机的方向。它的速度也可以通过改变供应电压来改变。由于微控制器有PWM引脚,所以它可以用来控制电机的速度。

  在本教程中,将使用Atmega16演示直流电机操作。L293D 电机驱动器将用于反转电流方向,从而改变运动方向。L293D 电机驱动器使用H 桥电路配置,向电机输出所需电流。两个按钮用于选择电机的方向。一个按钮用于选择顺时针旋转,另一个用于选择直流电机的逆时针操作。

ATmega16

  所需组件

  直流电机 (5V)

  L293D电机驱动器

  Atmega16微控制器IC

  16Mhz 晶体振荡器

  两个 100nF 电容器

  两个 22pF 电容器

  按钮

  跳线

  面包板

  USBASP v2.0

  LED(任何颜色)

  电路原理图

ATmega16

为直流电机控制编程 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
/* 直流电机与 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);

}



}

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分