如何使用PIC微控制器旋转步进电机

控制/MCU

1814人已加入

描述

步进电机是一种专门设计的电机,可按步进旋转。步进电机的速度取决于施加在其上的电信号速率。不同的模式可以控制步进电机的方向和旋转类型。主要有两种类型的步进电机可供选择,单极和双极。单极更容易操作、控制,也更容易获得。在本教程中,我们将步进电机与PIC微控制器PIC16F877A连接。

我们正在为这个项目使用28BYJ-48步进电机,价格便宜且易于获得。它是5V直流单极步进电机。我们还使用该电机提供的模块,该模块由ULN2003步进电机驱动器IC组成。ULN2003是达林顿对阵列,可用于驱动该电机,因为 PIC 微控制器无法提供足够的电流来驱动。ULN2003A能够以 600mA 的峰值电流驱动500mA的负载。

步进电机:

PIC16F877A

让我们从数据表中查看28BYJ-48 步进电机的规格。

PIC16F877A

如何旋转步进电机:

如果我们看到数据表,我们将看到引脚。

PIC16F877A

电机内部有两个中心抽头线圈可用。红线是两者的通用线,将连接到VCC或5V。

其他 4 根线粉红色、红色、黄色和蓝色将根据电信号控制旋转。此外,根据运动的不同,该电机可以使用 3 个步骤进行控制。全驱动模式、半驱动模式和波浪驱动模式。

步进电机的三种驱动模式:

全驱动:如果两个定子电磁铁同时通电,电机将以全扭矩运行,称为全驱动顺序模式。

 

粉红色 黄色
1 1 1 0 0
2 0 1 1 0
3 0 0 1 1
4 1 0 0 1

 

半驱动:当一相和两相通电时,电机将以半驱动模式运行。它用于增加角度分辨率。缺点是这种运动产生的扭矩较小。

 

粉红色 黄色
1 1 0 0 0
2 1 1 0 0
3 0 1 0 0
4 0 1 1 0
5 0 0 1 1
6 0 0 0 1
7 1 0 0 1
8 1 0 0 0

 

波浪驱动:在这种模式下,一个定子电磁铁被打开。它遵循与全驱动器模式相同的 4 个步骤。它消耗低功率和低扭矩。

 

粉红色 黄色
1 1 0 0 0
2 0 1 0 0
3 0 0 1 0
4 0 0 0 1

 

ULN2003 步进电机驱动器:

让我们了解由ULN2003 IC组成的分线板。了解引脚输出很重要。

PIC16F877A

黄色部分用于连接电机,红色部分显示跳线,放置跳线很重要,因为它将为电机启用续流二极管保护。粉红色输入用于微控制器连接。

我们将以顺时针方向以全驱动模式旋转电机,并以逆时针方向以波浪驱动模式再次旋转电机。

必需组件

图16F877A

编程套件

面包板

20兆赫晶体

33pF 圆盘电容器 – 2 个

4.7k 电阻

伯格线和引脚

ULN2003A 分线板和 28BYJ-48 步进电机。

要连接的其他电线

5V 电源单元或墙上适配器,额定电流为 500mA

电路图及说明

PIC16F877A

在电路图中,左侧显示 PIC16F877A,右侧显示 ULN2003A 连接。ULN2003 和步进电机部分位于分线板内。

从分线板到微控制器单元的连接将是-

A.IN1 =>引脚33

B.IN2 => 引脚34

C.IN3 =>引脚35

D.IN4 => 引脚36

我连接了所有组件和您的硬件来旋转步进电机与PIC微控制器已准备就绪。

PIC16F877A

如果您不熟悉 PIC 微控制器,请按照我们的 PIC 微控制器教程进行操作,说明 PIC 微控制器入门。

代码说明

与往常一样,首先,我们需要在 pic 微控制器中设置配置位,然后从 void main 函数开始。

这些是微控制器单元和库头文件的配置位的宏。

#define _XTAL_FREQ 200000000 //Crystal Frequency, used in delay

#define speed 1 // Speed Range 10 to 1  10 = lowest , 1 = highest

#define steps 250 // how much step it will take

#define clockwise 0 // clockwise direction macro

#define anti_clockwise 1 // anti clockwise direction macro

在第一行中,我们定义了延迟例程所需的晶体频率。其他宏用于定义与用户相关的选项。

如果您看到代码,则定义了三个函数,用于以顺时针和逆时针方向的三种模式驱动电机。以下是三个功能:

1.空隙full_drive(字符方向)

2.空隙half_drive(字符方向)

3.空隙wave_drive(字符方向)

在下面给出的完整代码中检查这些函数的定义:

现在在 void main 功能中,我们根据步骤使用全驱动模式顺时针驱动电机,几秒钟后,我们再次使用波浪驱动模式逆时针旋转电机。

void main(void)

{

system_init();   

while(1){

/* Drive the motor in full drive mode clockwise */

for(int i=0;i

{

full_drive(clockwise);

}

 

ms_delay(1000);

 

/* Drive the motor in wave drive mode anti-clockwise */

for(int i=0;i

{

wave_drive(anti_clockwise);

//full_drive(anti_clockwise);

}                                                              

ms_delay(1000);

}

}

 

这就是我们如何使用PIC微控制器旋转步进电机。步进电机在数控机床、机器人和其他嵌入式应用中非常有用。

/* 

* File:   main.c 

* Author: Sourav Gupta 

* By:- circuitdigest.com 

* Created on May 10, 2018, 1:26 PM 

* This program will drive a servo motor. 

*/ 

 

// PIC16F877A Configuration Bit Settings 

 

// 'C' source line config statements 

 

// CONFIG 

#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator) 

#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled) 

#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled) 

#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled) 

#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled) 

#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) 

#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) 

#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off) 

 

 

 

#include  

#include  

 

/* 

Hardware related definition 

*/ 

 

#define _XTAL_FREQ 200000000 //Crystal Frequency, used in delay 

#define speed 1 // Speed Range 10 to 1  10 = lowest , 1 = highest 

#define steps 250 // how much step it will take 

#define clockwise 0 // clockwise direction macro 

#define anti_clockwise 1 // anti clockwise direction macro 

 

 

/* 

*Application related function and definition 

*/ 

 

void system_init (void); // This function will initialise the ports. 

void full_drive (char direction); // This function will drive the motor in full drive mode 

void half_drive (char direction); // This function will drive the motor in full drive mode 

void wave_drive (char direction); // This function will drive the motor in full drive mode 

void ms_delay(unsigned int val); 

 

/* 

* main function starts here 

*/ 

 

 

void main(void) 



system_init(); 

while(1){ 

/* Drive the motor in full drive mode clockwise */ 

for(int i=0;i

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

全部0条评论

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

×
20
完善资料,
赚取积分