STM32/51单片机实训day7——电机驱动|ULN2003A步进电机|Proteus电路设计|旋转角度控制函数|驱动函数|Keil5程序设计
目录
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;// 输出速率为50MHzGPIO_Init(GPIOA, &GPIO_InitStruct); // ???????GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5); }void motor_45(void){//BGPIO_SetBits(GPIOA, GPIO_Pin_3); GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_5);delay();}void motor_180(void){//BGPIO_SetBits(GPIOA, GPIO_Pin_3); // 45°GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_5);delay();//BCGPIO_SetBits(GPIOA, GPIO_Pin_3 | GPIO_Pin_4 ); // LED ONGPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_5);delay();//CGPIO_SetBits(GPIOA, GPIO_Pin_4 ); // LED ONGPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5);delay();//CDGPIO_SetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5); // LED ONGPIO_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)
{//BGPIO_SetBits(GPIOA,GPIO_Pin_3);GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_5);delay();//BCGPIO_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();//BGPIO_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
STM32/51单片机实训day7——电机驱动|ULN2003A步进电机|Proteus电路设计|旋转角度控制函数|驱动函数|Keil5程序设计相关推荐
- STM32/51单片机实训day6(一)——Proteus8.6版本+STM32F103驱动LCD12864显示|Keil5单片机程序设计
内 容:实现LCD显示 学 时:4学时 知识点:LCD12864芯片介绍,读写操作时序,电路设计 重点: 读写操作时序 难点:读写操作时序 时间:2022年12月26日 9:00-11:50 总结 ...
- STM32/51单片机实训day8——基于Keil5+Proteus8使用DHT11温度传感器实现温湿度采集并在LM016L液晶屏上显示
目录 任务指导 1 DHT11产品概述 2 应用领域 3 传感器性能说明 4 接口说明 5 电源引脚 6 串行接口(单线双向) 通讯过程如图3所示: 任务实现 内 容:本任务使用DHT1 ...
- STM32/51单片机实训day3——点亮LED灯、闪烁LED灯(一)理论
内 容:编写代码实现LED灯的点亮功能 学 时:2学时 知识点:分析原理图.LED灯控制原理 重点:GPIO参数配置.LED原理图分析 难点:编写 GPIO参数配置函数.LED点亮函数 时间:20 ...
- 51单片机实训(一)————基于Proteus的光控小夜灯
文章目录 前言 一.项目概述 1.1 系统概述 1.2 功能设计 二.项目硬件设计 2.1 AT89C51单片机最小系统 2.2 外设电路 三.项目软件设计 3.1 程序代码设计 四.项目调试与分析 ...
- 51单片机实训(二)————基于Proteus的花样流水灯设计
文章目录 前言 一.项目概述 1.1 系统概述 1.2 功能设计 二.项目硬件设计 2.1 AT89C51单片机最小系统 2.2 外设电路 三.项目软件设计 3.1 程序代码设计 四.项目调试与分析 ...
- 51单片机c语言学习感想,51单片机实训心得体会
[www.hywsbj.com--心得体会] 单片机实训有哪些心得体会呢?下面是小编为大家收集的资料,欢迎阅读哦. 51单片机实训心得体会 通过为期一周的单片机实训,是我们对这门课有了许多新的了解,弥 ...
- 单片机c51语言实训总结,大学生51单片机实训心得体会
<大学生51单片机实训心得体会>由会员分享,可在线阅读,更多相关<大学生51单片机实训心得体会(1页珍藏版)>请在人人文库网上搜索. 1.大学生51单片机实训心得体会实践是检验 ...
- 51单片机实训项目之“万年历”代码原理详解
一.原理图 二.芯片器件 STC89C52 DS18B20(温度传感器) DS1302(时钟芯片) LCD1602液晶显示 独立按键 杜邦线 三.仿真图 四.程序代码详解 (一).子程序 EEPROM ...
- 51单片机实训-4×4矩阵键盘电子琴
制作说明: 晶振可以使用11.0592或12MHz: 扬声器应该按照图中给出的附图加上驱动电路: 显示器及七段译码器不接,单片机电子琴也可以正常工作. 74LS47 和数码管之间,应该接上" ...
最新文章
- ICML2020 | PGFS:如何保证生成分子是可合成的?强化学习来帮忙
- 18python入门到精通_《Python从入门到精通(60课)》18 序列类型之元组
- antd 轮播图样式_React - AntD 走马灯组件前后切换面板
- Linux 系统应用编程——网络编程(常用命令解析)
- c# 配置文件App.config操作类库
- 企业需求的Java程序员是什么样子的
- linux头文件怎么编译,microsoft编译器怎么使用Linux头文件
- 如何输入已经以新的TTY运行的Docker容器
- SPFA算法判断负环
- FreeMarker下拉列表选中值回显
- Science和Nature杂志论文异同简述
- Kotlin - 函数
- 软考高级 真题 2011年上半年 信息系统项目管理师 案例分析
- 为什么很少人用redmine_为什么古代书法家要把字写歪?
- 计算机分辨率无法调整,电脑分辨率调不了怎么办?电脑分辨率不能调的解决方法...
- Python--快递收费小程序
- 【Android 】零基础到飞升 | Service初涉
- Android拉取微信公众号列表,Xposed实时获取微信公众号推送
- 4、数据库服务的启动与登录
- 人脸识别技术的简单认识(含原理)
热门文章
- BVT测试(冒烟测试)
- (4.0系统)安卓神器XPOSED框架不用root激活指南
- 《大象:thinking in uml 》(第二版) 5章 UML核心模型
- 软件测试5年外包的感想,最后被领导直接逼退。
- 摄像头(Pi Cam) 配置方法
- BUUCTF-HAVE FUN
- 计算机网络摩尔定律芯片运算速度,需要定时刷新的半导体存储器芯片是什么 答案:DRAM...
- Vue.js基础特性、生命周期及常用指令
- python如何读取word中超链接的文本_如何使用python从docx文件中提取超链接中的url...
- Gecco学习笔记(十)