02-基础例程2

基础例程2

01、直流电机

对于UL2003来说,可以看作是非门

输入为1,输出为0;

输入为0,输出为高组态[接一个上拉电阻即为1]

在这里插入图片描述

线路的连接

在这里插入图片描述

4路是用做步进电机的

对于直流电机,只需要一路。即异端接VCC,一段接OUT1。

在MOTOR_IN1引脚,与15引脚相连(下拉),即初始为0,对应OUT1为高组态。直流电机一端为5V,一端高组态,即不工作。

板子:ESP32——>ESP32 Dev Module

相应的代码如下:

/* 深圳市普中科技有限公司(PRECHIN 普中)
   技术支持:www.prechin.net
 * 实验名称:直流电机实验
 * 
 * 接线说明:电机模块-->ESP32 IO
 *         (IN1)-->(15)
 *         
 *         电机模块输出-->直流电机
 *         (5V)-->任意一脚
 *         (O1)-->任意一脚
 * 实验现象:程序下载成功后,直流电机旋转3S后停止 
 */

//定义电机控制管脚
#define motor_pin   15

//类型重定义
typedef unsigned char u8;
typedef unsigned int u16;

//定义全局变量

void setup() {
  pinMode(motor_pin, OUTPUT);//设置引脚为输出模式
  digitalWrite(motor_pin,1);//输出高电平,电机开启
  delay(3000);//延时3S
  digitalWrite(motor_pin,0);//输出低电平,电机停止
}

void loop() {
  
}

02、步进电机

步进电机型号:28BYJ48

步进电机的工作原理。4向5线。1条连接VCC,另外4条线接OUT1——OUT4,从而控制4个不同的方向。总共形成8个方向

在这里插入图片描述

步进电机的参数信息

在这里插入图片描述

实验目的:通过按键控制步进电机正反转、加速与减速

对于线路连接,与01、直流电机相似

控制逻辑

  • 正转

对于控制逻辑,A->AB->B->BC->C->CD->D->DA

即下面引脚依此为0

OUT1->OUT1 OUT2->OUT2->OUT2 OUT3 ->OUT3->OUT3 OUT4->OUT4->OUT4 OUT1

对于输入而言,即下面引脚依此为1

IN1——>IN1 IN2——>IN2——>IN2 IN3——>IN3——>IN3 IN4——>IN4——>IN4 IN1

  • 反转
u8 temp=step;
  
  if(dir==0)  //如果为逆时针旋转
    temp=7-step;//调换节拍信号
  • 初始态

key1-key4全部为上拉,即初始为

  • 接线说明
 /*
 * 接线说明:电机模块-->ESP32 IO
 *         (IN1-IN4)-->(15,2,0,4)
 *         
 *         电机模块输出-->28BYJ-48步进电机
 *         (5V)-->红线
 *         (O1)-->依次排序
 *         
 *         按键模块-->ESP32 IO
 *         (K1-K4)-->(14,27,26,25)
 */

实验程序

  • 对于main函数而言
/* 深圳市普中科技有限公司(PRECHIN 普中)
   技术支持:www.prechin.net
 * 
 * 实验名称:步进电机实验
 * 
 * 接线说明:电机模块-->ESP32 IO
 *         (IN1-IN4)-->(15,2,0,4)
 *         
 *         电机模块输出-->28BYJ-48步进电机
 *         (5V)-->红线
 *         (O1)-->依次排序
 *         
 *         按键模块-->ESP32 IO
 *         (K1-K4)-->(14,27,26,25)
 * 
 * 实验现象:程序下载成功后,当按下KEY1键可调节电机旋转方向;当按下KEY2键,电机加速;
            当按下KEY3键,电机减速;
 * 
 * 注意事项:
 * 
 */

#include "public.h"
#include "key.h"
#include "step_motor.h"


//定义全局变量
u8 g_key=0;
u8 g_dir=0;//默认逆时针方向
u8 g_speed=STEPMOTOR_MAXSPEED;//默认最大速度旋转
u8 g_step=0;

void setup() {
  key_init();
  step_motor_init();
}

void loop() {
  g_key=key_scan(0);
  if(g_key==KEY1_PRESS)//换向
  {
    g_dir=!g_dir;    
  }
  else if(g_key==KEY2_PRESS)//加速
  {
    if(g_speed>STEPMOTOR_MAXSPEED)//>1,延时减小,相当于加速
      g_speed-=1;     
  }
  else if(g_key==KEY3_PRESS)//减速
  {
    if(g_speed<STEPMOTOR_MINSPEED)//<5,延时增加,相当于减速
      g_speed+=1;     
  }
  step_motor_28BYJ48_send_pulse(g_step++,g_dir);    //每次一次循环,方向移动1次
  if(g_step==8)g_step=0;    
  delay(g_speed);   //速度用延时来表示
}

  • 对于按键扫描函数key.c
#include "key.h"


//端口初始化
void key_init(void)
{
  pinMode(key1_pin, INPUT_PULLUP);//设置引脚为输入上拉模式
  pinMode(key2_pin, INPUT_PULLUP);
  pinMode(key3_pin, INPUT_PULLUP);
  pinMode(key4_pin, INPUT_PULLUP);
}

/*******************************************************************************
* 函 数 名       : key_scan
* 函数功能        : 检测独立按键是否按下,按下则返回对应键值
* 输    入       : mode=0:单次扫描按键
                  mode=1:连续扫描按键
* 输    出       : KEY1_PRESS:K1按下
                  KEY2_PRESS:K2按下
                  KEY3_PRESS:K3按下
                  KEY4_PRESS:K4按下
                  KEY_UNPRESS:未有按键按下
*******************************************************************************/
u8 key_scan(u8 mode)
{
  static u8 key=1;

  if(mode)key=1;//连续扫描按键
  if(key==1&&(digitalRead(key1_pin)==0||digitalRead(key2_pin)==0||digitalRead(key3_pin)==0||digitalRead(key4_pin)==0))//任意按键按下
  {
    delay(10);//消抖
    key=0;
    if(digitalRead(key1_pin)==0)
      return KEY1_PRESS;
    else if(digitalRead(key2_pin)==0)
      return KEY2_PRESS;
    else if(digitalRead(key3_pin)==0)
      return KEY3_PRESS;
    else if(digitalRead(key4_pin)==0)
      return KEY4_PRESS;  
  }
  else if(digitalRead(key1_pin)==1&&digitalRead(key2_pin)==1&&digitalRead(key3_pin)==1&&digitalRead(key4_pin)==1) //无按键按下
  {
    key=1;      
  }
  return KEY_UNPRESS;   
}

  • 对于电机控制
#include "step_motor.h"

//端口初始化
void step_motor_init(void)
{
  pinMode(ina_pin, OUTPUT);//设置引脚为输出模式
  pinMode(inb_pin, OUTPUT);
  pinMode(inc_pin, OUTPUT);
  pinMode(ind_pin, OUTPUT);
}

/*******************************************************************************
* 函 数 名       : step_motor_28BYJ48_send_pulse
* 函数功能       : 输出一个数据给ULN2003从而实现向步进电机发送一个脉冲
* 输    入       : step:指定步进序号,可选值0~7
                  dir:方向选择,1:顺时针,0:逆时针
* 输    出       : 无
*******************************************************************************/
void step_motor_28BYJ48_send_pulse(u8 step,u8 dir)
{
  u8 temp=step;
  
  if(dir==0)  //如果为逆时针旋转
    temp=7-step;//调换节拍信号
  switch(temp)//8个节拍控制:A->AB->B->BC->C->CD->D->DA
  {
    case 0: digitalWrite(ina_pin,1);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,0);break;
    case 1: digitalWrite(ina_pin,1);digitalWrite(inb_pin,1);digitalWrite(inc_pin,0);digitalWrite(ind_pin,0);break;
    case 2: digitalWrite(ina_pin,0);digitalWrite(inb_pin,1);digitalWrite(inc_pin,0);digitalWrite(ind_pin,0);break;
    case 3: digitalWrite(ina_pin,0);digitalWrite(inb_pin,1);digitalWrite(inc_pin,1);digitalWrite(ind_pin,0);break;
    case 4: digitalWrite(ina_pin,0);digitalWrite(inb_pin,0);digitalWrite(inc_pin,1);digitalWrite(ind_pin,0);break;
    case 5: digitalWrite(ina_pin,0);digitalWrite(inb_pin,0);digitalWrite(inc_pin,1);digitalWrite(ind_pin,1);break;
    case 6: digitalWrite(ina_pin,0);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,1);break;
    case 7: digitalWrite(ina_pin,1);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,1);break;
    default: digitalWrite(ina_pin,0);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,0);break;//停止相序 
  }     
}


lWrite(ind_pin,1);break;
    case 7: digitalWrite(ina_pin,1);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,1);break;
    default: digitalWrite(ina_pin,0);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,0);break;//停止相序 
  }     
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值