开源:智能宠物弹射喂食器连载贴之步进电机控制(二)

想要从云端控制宠物自动喂食器,最重要的部分就是电机啦,电机的作用就是用于将装在食物储物槽里的食物倒出来供宠物食用,如下图所示,这是某宝常见的一款宠物喂食器产品,其实下图所示动力舱其实就是一个电机,用于控制出料。

涂鸦官方推荐此时需要用一个减速电机来完成这个产品的设计,然而我手上没有这个电机,所以我就用步进电机来代替了,一样也可以完成这个功能,那么如何来实现呢?先来看看实验效果:

我手上的这个是一个步进模块:

步进电机选用的型号是:28BYJ48-H12

这里在软件编程上有一个比较重要参数需要了解一下,就是步距角。那么什么是步距角呢?度娘给你答案,可以详细看看。

https://baike.baidu.com/item/%E6%AD%A5%E8%B7%9D%E8%A7%92/5946465?fr=aladdin

来看看下面这个换算公式,或许你就明白了。如上图所示,步距角=5.625°/64,意思就是每64个脉冲步进电机就会转5.625度,因此我们很容易得出以下计算公式:电机转一圈有360°,那么转一圈的脉冲数 = 360 / 5.625 * 64 = 4096 个脉冲。进而很容易得到以下角度与脉冲的简单算法:

/*
 Rotation_Angle:旋转角度
 返回:Motor_Pulse 根据公式计算得出的脉冲个数
*/
int Motor_Angle_Cal(int Rotation_Angle)
{
 if(Rotation_Angle < 0 || Rotation_Angle > 360)
      return -1 ;
    Motor_Pulse = (int)((double)(Rotation_Angle / 5.625) * 64) ;
    return Motor_Pulse ;
}

下面开始在CubeMX上配置管脚,然后编写程序:

编写步进电机驱动程序:

motor.h

#ifndef __MOTOR_H
#define __MOTOR_H
#include "main.h"


//4相控制定义
#define MOTOR_A_ON  HAL_GPIO_WritePin(MOTOR_A_GPIO_Port, MOTOR_A_Pin, GPIO_PIN_SET);
#define MOTOR_A_OFF HAL_GPIO_WritePin(MOTOR_A_GPIO_Port, MOTOR_A_Pin, GPIO_PIN_RESET);

#define MOTOR_B_ON  HAL_GPIO_WritePin(MOTOR_B_GPIO_Port, MOTOR_B_Pin, GPIO_PIN_SET);
#define MOTOR_B_OFF HAL_GPIO_WritePin(MOTOR_B_GPIO_Port, MOTOR_B_Pin, GPIO_PIN_RESET);

#define MOTOR_C_ON  HAL_GPIO_WritePin(MOTOR_C_GPIO_Port, MOTOR_C_Pin, GPIO_PIN_SET);
#define MOTOR_C_OFF HAL_GPIO_WritePin(MOTOR_C_GPIO_Port, MOTOR_C_Pin, GPIO_PIN_RESET);

#define MOTOR_D_ON  HAL_GPIO_WritePin(MOTOR_D_GPIO_Port, MOTOR_D_Pin, GPIO_PIN_SET);
#define MOTOR_D_OFF HAL_GPIO_WritePin(MOTOR_D_GPIO_Port, MOTOR_D_Pin, GPIO_PIN_RESET);


extern int direction  ;
extern uint16_t Motor_Pulse ;

//电机脉冲计算
int Motor_Angle_Cal(int Rotation_Angle);
//电机8节拍控制
void MOTOR_CONTROLD(uint8_t step, uint8_t direction);
//关闭电机
void CLOSE_MOTOR(void);

#endif //__MOTOR_H

motor.c

#include "Motor.h"
//电机旋转的方向
int direction = 0 ;
//电机旋转的脉冲个数
uint16_t Motor_Pulse = 0 ;


//电机控制,采用8节拍来做
//A->AB->B->BC->C->CD->D->DA
void MOTOR_CONTROLD(uint8_t step, uint8_t direction)
{
    uint8_t __step = step ;

    //判断电机的旋转方向,如果为1,则逆向旋转
    if(1 == direction)
        __step = 8 - step ;

    switch(__step)
    {
        //A
        case 0:
            MOTOR_A_ON;
            MOTOR_B_OFF;
            MOTOR_C_OFF;
            MOTOR_D_OFF;
            break ;

        //AB
        case 1:
            MOTOR_A_ON;
            MOTOR_B_ON;
            MOTOR_C_OFF;
            MOTOR_D_OFF;
            break ;

        //B
        case 2:
            MOTOR_A_OFF;
            MOTOR_B_ON;
            MOTOR_C_OFF;
            MOTOR_D_OFF;
            break ;

        //BC
        case 3:
            MOTOR_A_OFF;
            MOTOR_B_ON;
            MOTOR_C_ON;
            MOTOR_D_OFF;
            break ;

        //C
        case 4:
            MOTOR_A_OFF;
            MOTOR_B_OFF;
            MOTOR_C_ON;
            MOTOR_D_OFF;
            break ;

        //CD
        case 5:
            MOTOR_A_OFF;
            MOTOR_B_OFF;
            MOTOR_C_ON;
            MOTOR_D_ON;
            break ;

        //D
        case 6:
            MOTOR_A_OFF;
            MOTOR_B_OFF;
            MOTOR_C_OFF;
            MOTOR_D_ON;

        //DA
        case 7:
            MOTOR_A_ON;
            MOTOR_B_OFF;
            MOTOR_C_OFF;
            MOTOR_D_ON;
            break ;
    }
}

//关闭电机
void CLOSE_MOTOR(void)
{
  MOTOR_A_OFF;
  MOTOR_B_OFF;
  MOTOR_C_OFF;
  MOTOR_D_OFF;
}

/*
 Rotation_Angle:旋转角度
 返回:Motor_Pulse 根据公式计算得出的脉冲个数
*/
int Motor_Angle_Cal(int Rotation_Angle)
{
 if(Rotation_Angle < 0 || Rotation_Angle > 360)
      return -1 ;
    Motor_Pulse = (int)((double)(Rotation_Angle / 5.625) * 64) ;
    return Motor_Pulse ;
}

编写主程序控制逻辑,在这里我们采用嘀嗒定时器来驱动步进电机:

我们在中断服务函数这个文件这里讲嘀嗒定期器产生的中断处理添加到这里,跳转进去发现这是个弱函数,也就是带__weak关键字修饰的,这并不是标准C的语法,而是拓展的,并没有实现。加上了__weak修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak声明的函数,并且编译器不会报错。所以我们可以在别的地方定义一个相同名字的函数,而不必也尽量不要修改之前的函数。

接下来我们定义个跟这个弱函数一模一样的处理函数,实现它。

main.c

/* USER CODE BEGIN 4 */
void HAL_SYSTICK_Callback(void)
{
    static uint8_t step = 0 ;
    //如果当前设置的脉冲数不为0
    if(Motor_Pulse)
    {
        //控制步进电机旋转
        MOTOR_CONTROLD(step, direction);
        step++ ;
        if(8 == step)
          step = 0 ;
        //脉冲计数不断减,当减到0时,说明控制到位,即需要执行else的关闭电机步骤。
        Motor_Pulse-- ;
    }
    else
    {
        //关闭电机
        CLOSE_MOTOR();
    }
}

然后在下行指令区调用电机转动函数即可:

效果如演示视频所示。

Engineer-Bruce_Yang CSDN认证博客专家 嵌入式硬件 单片机 arm开发
本科毕业于华南理工大学,现美国卡罗尔工商管理硕士研究生在读,曾就职于世界名企伟易达、联发科技等,多年嵌入式产品开发经验,在智能玩具、安防产品、平板电脑、手机开发有丰富的实战开发经验,现任深圳市云之手科技有限公司副总经理、研发总工程师。
已标记关键词 清除标记
相关推荐
介绍STM32CubeMX 5.0.0 STM32CubeMX是32位ARM®Cortex®STM32微控制的图形工具。它是STMCube“计划的一部分,既可以作为独立应用程序使用,也可以作为集成开发环境(IDE)集成的Eclipse插件使用 .STM32CubeMX具有以下主要功能: 轻松的微控制选择涵盖整个STM32产品组合 从STMicroelectronics板列表中选择电路板。 简单的微控制配置(引脚,时钟树,外设,中间件)和相应的初始化C代码的生成。 通过将先前保存的配置导入新的MCU项目,可轻松切换到属于同一系列的另一个微控制。 生成配置报告。 为选择的集成开发环境工具链生成IDE就绪项目。STM32CubeMX项目包括生成的初始化C代码,STM32 HAL驱动程序,用户配置所需的中间件堆栈以及在所选IDE中打开和构建项目所需的所有相关文件。 用户定义的应用程序序列的功耗计算。 自我更新允许用户使STM32CubeMX保持最新状态。 下载和更新用户应用程序开发所需的STM32Cube“嵌入式软件”(有关STM32Cube嵌入式软件产品的详细信息,请参阅附录E:STM32Cube嵌入式软件包)。 安装并运行STM32CubeMX 5.0.0 支持的操作系统和体系结构 Windows®7:32位(x86),64位(x64) Windows®8:32位(x86),64位(x64) Windows®10:32位(x86),64位(x64) Linux®:32位(x86)和64位(x64)(在RedHat,Ubuntu和Fedora上测试) 由于STM32CubeMX是32位应用程序,因此某些版本的Linux 64位 发行版需要安装32位兼容软件包,如作为ia32-libs。 MacOS:64位(x64)(在OS X Yosemite上测试) 软件要求 在Windows和Linux上:Java运行时环境(最低版本1.7.0_45) 在MacOS上:Java开发工具包(最低版本1.7.0_45) 安装STM32CubeMX 要安装STM32CubeMX,请执行以下步骤: 将最新的STM32CubeMX安装包的全部内容从http://www.st.com/stm32cubemx解压缩(解压缩)到同一目录中 在Windows上 确保您拥有管理员权限 双击SetupSTM32CubeMX-5.0.0.exe文件 在Linux上 确保您具有目标安装目录的访问权限,您可以以root(或sudo)身份运行安装,以在共享目录上安装STM32CubeMX 在SetupSTM32CubeMX-5.0.0.linux文件上双击(或从控制台窗口启动) 在MacOS上 确保您具有目标安装目录的访问权限,您可以以root(或sudo)身份运行安装,以在共享目录上安装STM32CubeMX 在SetupSTM32CubeMX-5.0.0应用程序上双击(或从控制台窗口启动) 安装后,您可以安全地从磁盘中删除zip的内容。 有关系统要求或其他可能安装的更多详细信息,请参阅STM32CubeMX用户手册。 运行STM32CubeMX 在Windows上 从Program Files> ST Microelectronics> STM32CubeMX中选择STM32CubeMX。 或者双击桌面上的STM32CubeMX图标。 在Linux上 从STM32CubeMX安装目录启动STM32CubeMX可执行文件 在MacOS上 从启动板启动STM32CubeMX应用程序 卸载STM32CubeMX 要卸载STM32CubeMX,请执行以下步骤: 在Windows上 打开Windows控制面板。 选择“程序和功能”以显示计算机上安装的程序列表。 右键单击STM32CubeMX并选择卸载功能。 在Linux上 使用文件资源管理,进入STM32CubeMX安装的卸载程序目录,然后双击startuninstall桌面快捷方式 或使用java -jar <install path> /Uninstaller/uninstaller.jar手动启动卸载 在MacOS上 使用文件资源管理,进入STM32CubeMX安装的Uninstaller目录,然后双击uninstaller.jar 或直接将STM32CubeMX应用程序移动到回收站中
<p> <strong><span style="font-size:20px;color:#FF0000;">本课程主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者</span></strong> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">1. 包含:<span style="color:#FFFF00;background-color:#FF0000;">项目源码、</span><span style="color:#FFFF00;background-color:#FF0000;">项目文档、数据库脚本、软件工具</span>等所有资料</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">2. 手把手的带你从零开始部署运行本套系统</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">3. 该项目附带的源码资料可作为毕设使用</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">4. 提供技术答疑和远程协助指导</span></strong></span><strong><span style="font-size:18px;"></span></strong> </p> <p> <br /> </p> <p> <span style="font-size:18px;"><strong>项目运行截图:</strong></span> </p> <p> <strong><span style="font-size:18px;">1)系统登陆界面</span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241015433522.png" alt="" /><br /> </span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">2)学生模块</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241015575966.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">3)教师模块</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016127898.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">4)系统管理员</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016281177.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016369884.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><br /> </span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">更多Java毕设项目请关注我的毕设系列课程 <a href="https://edu.csdn.net/lecturer/2104">https://edu.csdn.net/lecturer/2104</a></span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><br /> </span></strong> </p>
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页