STM32/51单片机实训day7——电机驱动|ULN2003A步进电机|Proteus电路设计|旋转角度控制函数|驱动函数|Keil5程序设计

news2024/9/29 3:25:22

目录

1  ULN2003A步进电机简介

2  步进电机电路设计

3 旋转角度控制函数

4 程序设计 

motor.c

motor.h

前期LCD参考文章:​​​​​​​

内  容:编程实现控制步进电机旋转不同角度

学  时:3学时

知识点: GPIO配置、步进电机电路设计、编程实现旋转角度控制

重点: 步进电机电路设计、编程实现旋转角度控制

难点:编程实现旋转角度控制

时间:2022年12月27日9:00~11:50 

总结:

1 步进电机使用GPIOA进行输入输出,需要进行GPIO配置;

2 使用proteus设计步进电机电路;

3 编程实现步进电机旋转角度控制。

51单片机Proteus仿真+Keil工程-实验4-外部中断-步进电机驱动_轩笑鹄的博客-CSDN博客_51单片机外部中断实验

掌握外部中断的打开方式;掌握步进电机的基本控制。

步进电机控制系统+LCD状态显示+详细源码注释+proteus仿真(超详细)_HNU_刘yuan的博客-CSDN博客_步进电机驱动设计实现电机lcd按键加减速


1  ULN2003A步进电机简介

ULN2003A是一个七路反向器电路,即输入端高电平时ULN2003A输出端低电平,相反当输入端低电平的时ULN2003A输出端高电平

ULN2300A内部结构如下图所示,两个三极管串联,第一个管子的发射极接第2个管子的基极,所以整个电路的放大倍数是两个三极管放大倍数的乘积,具有很大的放大倍数。IN端接到单片机上,当IN端接入高电平时,两个三极管均导通,OUT端则能输出较大的电流

图1 ULA2300A内部结构

步进电机原理图如图2,电机共有六个引脚线,其中有两条线与供电电源相接,剩下四条线(A、B、C、D)用来控制电机的旋转。每个引脚线相当于有一个控制开关,通电后则可旋转一定的角度。

 图2 步进电机原理图

2  步进电机电路设计

步进电机电路设计如下图所示,其中步进电机的引脚通过网络与单片机引脚进行连接。

图2 步进电机电路

我的电路连接图如下: 

四相步进电机有单四拍(A-B-C-D)和双四拍(AB-BC-CD-DA)和八拍(A-AB-B-BC-C-CD-D-DA)这三种工作方式。

第一种工作方式扭矩小,功耗小,但震动大。

第二种工作方式扭矩较大,功耗也大,震动小。

第三种工作方式步距角小,输出更平滑,推荐采用这种方式。

只需要控制单片机的IO口使得ULN2003芯片按A-AB-B-BC-C-CD-D-DA的次序输出低电平(ULN2003A会使电平反向输出,因此STM32在输出高电平时,到达步进电机的电平才会为低电平)即可完成步进电机转动的一轮循环。如果要按相反方向转动,只要把上面A-AB-B-BC-C-CD-D-DA的次序反过来即可。

3 旋转角度控制函数

ULN2003A有四条线(A、B、C、D)用来控制电机的旋转,本实训使用八拍方式来驱动电机的旋转,每一拍旋转45°。经过proteus仿真试验发现,当节拍为A时,对应角度为-45°,当节拍为AB时,对应角度为0°,故为使电机顺时针旋转一周,我们采用如下节拍方式:B-BC-C-CD-D-DA-A-AB,八拍驱动方式逻辑时序如下表所示。

4 程序设计 

motor.c

#include "stm32f10x.h"

//PA2 PA3 PA4 PA5
/*void delay(void){
	uint32_t cnt = 0x20000;
	while(cnt--);}*/

void motor_init(void){
	//定义GPIO结构体
	GPIO_InitTypeDef GPIO_InitStruct;
	//打开时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//PB引脚
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;    // 初始化4个引脚
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // ?????????????
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;// 输出速率为50MHz
	GPIO_Init(GPIOA, &GPIO_InitStruct);    // ???????
	GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5); }
	
void motor_45(void){
	//B
	GPIO_SetBits(GPIOA, GPIO_Pin_3);  
	GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_5);
	delay();}
	
void motor_180(void){
	//B
	GPIO_SetBits(GPIOA, GPIO_Pin_3);  // 45°
	GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_5);
	delay();
	//BC
	GPIO_SetBits(GPIOA, GPIO_Pin_3 | GPIO_Pin_4 );  // LED ON
	GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_5);
	delay();
	//C
	GPIO_SetBits(GPIOA, GPIO_Pin_4 );  // LED ON
	GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5);
	delay();
	//CD
	GPIO_SetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5);  // LED ON
	GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_3);
	delay();
}

药品信息管理系统 :

#include "motor.h"
#include "stm32f10x.h"
#include "delay.h"

void delay(void){
	uint32_t cnt=0x20000;
	while(cnt--);
	
}



void Motor_GPIOInit (void)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;	
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	//GPIO_Write(GPIOB,0x0000);			/?????
  GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|	GPIO_Pin_4|	GPIO_Pin_5);	

}

void Motor_CW(void)			
{
	//B
	GPIO_SetBits(GPIOA,GPIO_Pin_3);
	GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_5);
	delay();
	
	//BC
	GPIO_SetBits(GPIOA,GPIO_Pin_3|GPIO_Pin_4);
	GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_5);
	delay();
	//GPIO_SetBits(GPIOA,GPIO_Pin_1);
	//SysTick_Delay_Ms(DELAY_TIME);
	//GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	
	//GPIO_SetBits(GPIOA,GPIO_Pin_2);
	//SysTick_Delay_Ms(DELAY_TIME);
	//GPIO_ResetBits(GPIOA,GPIO_Pin_2);
	
	//GPIO_SetBits(GPIOA,GPIO_Pin_3);
	//SysTick_Delay_Ms(DELAY_TIME);
	//GPIO_ResetBits(GPIOA,GPIO_Pin_3);
}
void Motor_RW(void){			
  GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3);
	GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5);
	delay();
	//B
	GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5);
	GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3);
	delay();
	
	//BC
	
	//GPIO_SetBits(GPIOA,GPIO_Pin_1);
	//SysTick_Delay_Ms(DELAY_TIME);
	//GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	
	//GPIO_SetBits(GPIOA,GPIO_Pin_2);
	//SysTick_Delay_Ms(DELAY_TIME);
	//GPIO_ResetBits(GPIOA,GPIO_Pin_2);
	
	//GPIO_SetBits(GPIOA,GPIO_Pin_3);
	//SysTick_Delay_Ms(DELAY_TIME);
	//GPIO_ResetBits(GPIOA,GPIO_Pin_3);
}
void Motor_SW(void)			
{
	GPIO_SetBits(GPIOA,GPIO_Pin_3);
	//SysTick_Delay_Ms(DELAY_TIME);
	GPIO_ResetBits(GPIOA,GPIO_Pin_3);
	
	GPIO_SetBits(GPIOA,GPIO_Pin_2);
	//SysTick_Delay_Ms(DELAY_TIME);
	GPIO_ResetBits(GPIOA,GPIO_Pin_2);
	
	GPIO_SetBits(GPIOA,GPIO_Pin_1);
	//SysTick_Delay_Ms(DELAY_TIME);
	GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	
	GPIO_SetBits(GPIOA,GPIO_Pin_0);
	//SysTick_Delay_Ms(DELAY_TIME);
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);
}

void Motor_ctrl_angle(int dire ,int angle)		//dire??????,angle??????
{
	int j=0;
	if(dire==0)		
	{				
		for(j=0;j<64*angle/45;j++)	
		{
			Motor_SW();
			
		}
		 MotorStop();
	}
	else			
	{		
		for(j=0;j<64*angle/45;j++)
	{
		Motor_CW();
	
	}	
		 MotorStop();

}
}
void Motor_ctrl_motor(int dire,float cycle)			//dire??????;cycle??????,?????
{
	int angle=cycle*360;
	Motor_ctrl_angle(dire , angle);

}
	
	
void MotorStop(void) 
{  
    GPIO_Write(GPIOB,0x0000);  
}

void SysTick_Delay_Ms(__IO uint32_t ms)
{
	uint32_t i;
	SysTick_Config(72000);
	
	for(i=0; i<ms ; i++)
	{
		while(!(SysTick->CTRL)&(1<<16))
			;
	}
	SysTick->CTRL &= SysTick_CTRL_ENABLE_Msk;
}

motor.h

#include "stm32f10x.h"

void motor_init(void);

void motor_45(void);
void motor_180(void);

药品信息管理系统 :

#ifndef __BSP_GPIO_H
#define __BSP_GPIO_H
#include "delay.h"




void Motor_GPIOInit (void);	
void Motor_CW(void);				
void SysTick_Delay_Ms(__IO uint32_t );
void Motor_SW(void);			
void Motor_ctrl_angle(int dire ,int angle);	
void Motor_ctrl_motor(int dire,float cycle);	
void MotorStop(void);	

void Motor_RW(void);


#endif

 2学分

了解RFID应用

了解RFID系统组成

完成完整的实训项目设计


前期LCD参考文章:

LCD12864液晶显示模块的使用与分析_楼上小白_1001号的博客-CSDN博客_lcd12864 

STM32 LCD12864使用教程_是along不是alone的博客-CSDN博客_lcd12864复位

引脚介绍
1.一共有20个引脚,重要的只有那么几个;
3~VO就是调节对比度的,相当于调节每个点显示出来的深浅,虽然只有亮与不亮两种选择,但亮的模式下相当于可以调节每个点到底多亮;
4~RS,为1的时候表示发送的发送的数据,为0表示发送命令;
5~RW,就是控制我们是往LCD12864读数据(1)还是写数据(0),我们要控制LCD,当然是往里面写数据(0);
6~E,使能信号;
17~RST复位引脚;
接下来的DB0~DB7就是用来传输我们的数据,一个字节八个位刚好。

一、LCD12864(带字库的)使用教程:_布鲁格若门的博客-CSDN博客_lcd12864

51单片机——LCD12864_小白变形计的博客-CSDN博客_单片机lcd12864 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【pygame学习_5】窗口设计

1、引言 窗体是游戏的交互界面&#xff0c;一般我们会遇到窗口大小可调&#xff0c;窗口无边框&#xff0c;全屏显示&#xff0c;最小化设计&#xff0c;改名字&#xff0c;换图标等设计需求。 屏幕绘制有如下重要函数&#xff1a; 2、屏幕模式函数 pygame.display.set.mode …

Event Loop

javascript是单线程语言 那么&#xff0c;你可能要问&#xff0c;javascript为什么是单线程&#xff0c;难道不能实现多线程吗&#xff1f; 这跟历史有关系。javascript从诞生的时候就是单线程&#xff0c;原因大概是不想让浏览器变得太复杂&#xff0c;因为多线程需要共享资源…

dark room - 2020 年苹果设计奖得主,一个足够强大的照片视频编辑器

dark room - 2020 年苹果设计奖得主&#xff0c;一个足够强大的照片视频编辑器 2020年苹果设计奖得主 2015年App Store最佳应用 Darkroom 是一个高级照片和视频编辑器。它对业余摄影师来说很容易操作&#xff0c;但对专业摄影师来说足够强大。 下载 ➤ Darkroom 下载安装 ⇲…

七十二——八十八

七十二、JavaScript——面向对象简介 面向对象编程&#xff08;OOP) 1. 程序是干嘛的 - 程序是现实世界的抽象&#xff08;照片就是对人的抽象&#xff09; 2. 对象是干嘛的&#xff1f; - 一个事物抽象到程序后就变成了对象 - 在程序的试接中&#xff0c;一切皆对象 - 一个事物…

来到CSDN一周年(hacker的2022年终总结)

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又一座的高山&#xff0c;那样的人生才是我想要的…

【数据结构】排序算法大总结

文章目录1. 排序的概念及运用2. 常见排序算法的实现2.1 插入排序2.1.1 直接插入排序2.1.2 希尔排序2.2 选择排序2.2.1 直接选择排序2.2.2 堆排序2.3 交换排序2.3.1 冒泡排序2.3.1 快速排序小区间优化hoare版本挖坑法前后指针法2.3.2 快排非递归2.4 归并排序2.4.1 归并排序递归2…

本地缓存天花板-Caffeine

前言 caffeine是一款高性能的本地缓存组件&#xff0c;关于它的定义&#xff0c;官方描述如下&#xff1a; Caffeine is a high performance, near optimal caching library. 翻译过来就是Caffeine是一款高性能、最优缓存库。 同时文档中也说明了caffeine是受Google guava启发…

【Git】一文带你入门Git分布式版本控制系统(分支管理策略、Bug分支)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…

Eth04 - Eth分层模块架构和索引方案

文章目录 1 Eth分层模块架构2 索引方案3 发送成功和接收成功回调函数传送门 ==>> AutoSAR入门和实战系列总目录 1 Eth分层模块架构 下面的图片表明了以太网控制器驱动程序和硬件的关系;从EthIf看来,要通过以太网控制器层去访问以太网控制器硬件,以太网控制器层有多…

AcWing1204.错误票据——学习笔记

题目&#xff1a;1204. 错误票据 - AcWing题库https://www.acwing.com/problem/content/description/1206/ import java.util.Scanner;public class Main {public static void main(String args[]){Scanner input new Scanner(System.in);int line input.nextInt();int loseI…

Python开发环境

1. Python开发环境 开发环境&#xff0c;英文是IDE&#xff08;Integrated Development Environment 集成开发环境&#xff09;。 不要纠结于使用哪个开发环境。开发环境本质上就是对Python解释器python.exe的封装&#xff0c;核心都一样。可以说:“开发环境IDE&#xff0c;只…

SpringCloud(10)— Elasticsearch集群

SpringCloud&#xff08;10&#xff09;— Elasticsearch集群 一 搭建ES集群 单机的 Elasticsearch 做数据存储&#xff0c;必然面临两个问题&#xff1a;海量数据存储问题&#xff0c;单点故障等 海量数据存储问题&#xff1a;将索引库从逻辑上拆分为 N 个分片&#xff08;…

直播回顾 | 如何运用数智化助力光伏上游产业节能降碳?

12月29日&#xff0c;【始祖双碳研习社-行业解决方案】系列直播课第一期直播顺利举办。 始祖科技解决方案专家张开宇在本次直播上进行了以《如何运用数智化助力光伏上游产业节能降碳》的主题分享&#xff0c;详细介绍了光伏行业产业链分析、光伏行业节能减排的现状与挑战、数智…

【Javassist】快速入门系列12 当检测到catch语句时在catch前插入代码

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 07 当检测到字段被访问时使用语…

【C++学习】vector的使用及模拟实现

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《C学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; vector的使用及模拟实现&#x1f387;构造函数&#x1f9e8;模拟实现&#x1f9e8;vector的扩容机制&…

力扣(LeetCode)363. 矩形区域不超过 K 的最大数值和(2022.12.30)

给你一个 m x n 的矩阵 matrix 和一个整数 k &#xff0c;找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。 题目数据保证总会存在一个数值和不超过 k 的矩形区域。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,0,1],[0,-2,3]], k 2 输出&#xff1a;2 解释&…

2022年-年度总结报告

目录1.攻克的技术难题问题1&#xff1a;2.学习的新技术1.system系统的学习2.网络3.游戏22年总结23年的计划1.先给自己画个大饼2.计划内的小饼1.攻克的技术难题 问题1&#xff1a; 跑VTS测试的时候&#xff0c;mkfs.exfat挂测失败&#xff0c;VTS刷最新的谷歌gsi没有过&#x…

大文件传输如何帮助媒体行业

过去几年&#xff0c;随着分辨率从4k到6k再到8k的升级&#xff0c;观众已经适应了高分辨率的时代。然而&#xff0c;许多媒体工作室的工作流程还停留在过去。 TB甚至PB大小的材料的传输让从业者无所适从。这就是高速文件传输对媒体行业有很大帮助的原因。 什么是大文件传输&am…

81.【SpringMVC】

SpringMVC(一)、认识MVC三层架构1.回顾MVC(1).什么是MVC三层框架(2).MVC要做那些事情?(3).常见的MVC三层框架结构(4).知识拓展2.代码回顾3.什么是SpringMVC(二)、第一个SpringMVC0.前提1.搭建环境2.配置WEB-INF的XML配置文件3.在资源Resource的包下设置springmvc-servlet.xml4…

30-深入Hotspot源码与Linux内核理解NIO/BIO/AIO

IO模型 IO模型就是说用什么样的通道进行数据的发送和接收&#xff0c;Java共支持3种网络编程IO模式&#xff1a;BIO&#xff0c;NIO&#xff0c;AIO BIO(Blocking IO) 同步阻塞模型&#xff0c;一个客户端连接对应一个处理线程 缺点&#xff1a; 1、IO代码里read操作是阻塞操…