打印
[STM32F1]

【HAL库每天一例】第101例:28BYJ48步进电机控制实现

[复制链接]
1554|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
亼亽|  楼主 | 2016-8-23 08:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 亼亽 于 2016-8-23 08:53 编辑

【HAL库每天一例】系列例程从今天开始持续更新。。。。。
我们将**每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。

参考文档见:

硬石电机控制专题指导手册
例程下载:
资料包括程序、相关说明资料以及软件使用截图

百度云盘:https://pan.baidu.com/s/1slN8rIt 密码:u6m1
360云盘:https://yunpan.cn/OcPiRp3wEcA92u密码 cfb6
(硬石YS-F1Pro开发板HAL库例程持续更新\5. 软件设计之电机控制(HAL库版本)\步进电机.zip
/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: YSF1_HAL_MOTOR-002. 28BYJ48步进电机控制实现
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:http://www.ing10bbs.com
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */

【1】例程简介

【2】跳线帽情况

【3】操作及现象

/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/




main.c文件内容

/**
  ******************************************************************************
  * 文件名程: main.c
  * 作    者: 硬石嵌入式开发团队
  * 版    本: V1.0
  * 编写日期: 2015-10-04
  * 功    能: 28BYJ48步进电机控制实现
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:http://www.ing10bbs.com
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */
/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f1xx_hal.h"
#include "StepMotor/bsp_uln2003.h"
#include "key/bsp_key.h"

/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
#define STEPMOTOR_SPEED               10   // 定义步进电机速度,值越小,速度越快
                                           // 最小不能小于8
#define STEPMOTOR_CIRCLE_NUMBER       10    //  转动圈数
#define STEPMOTOR_DIRECTION           1    // 1:顺时针  0:逆时针


/* 私有变量 ------------------------------------------------------------------*/
// 速度,该值越小,速度越快,最小不能小于8
uint8_t speed=STEPMOTOR_SPEED;
// 转动圈数:28BYJ-48步进电机的步距角度为5.625/64,即每64个脉冲转5.625度
// 要转一圈需要360/5.625*64=4096个脉冲。
uint32_t Circle_number=STEPMOTOR_CIRCLE_NUMBER;
// 选择方向控制
uint8_t direction=STEPMOTOR_DIRECTION;

/* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
/* 函数体 --------------------------------------------------------------------*/
/**
  * 函数功能: 输出一个数据给ULN2003从而实现向步进电机发送一个脉冲
  * 输入参数: step:指定步进序号,可选值0~7
  *           direction:方向选择
  *               可选值:1:顺时针
  *                       0:逆时针
  * 返 回 值: 无
  * 说    明: 无
  */
static void step_motor_pulse(uint8_t step,uint8_t direction)
{
  uint8_t temp=step;
  
  if(direction==0)    // 如果为逆时针旋转
  {
    temp=8-step;      // 调换节拍信号
  }
  switch(temp)
  {
    // 8个节拍控制:A->AB->B->BC->C->CD->D->DA
    case 0:
      A_ON;  B_OFF; C_OFF; D_OFF;
    break;
    case 1:
      A_ON;  B_ON;  C_OFF; D_OFF;
    break;
    case 2:
      A_OFF; B_ON;  C_OFF; D_OFF;
    break;
    case 3:
      A_OFF; B_ON;  C_ON;  D_OFF;
    break;
    case 4:
      A_OFF; B_OFF; C_ON;  D_OFF;
    break;
    case 5:
      A_OFF; B_OFF; C_ON;  D_ON;
    break;
    case 6:
      A_OFF; B_OFF; C_OFF; D_ON;
    break;
    case 7:
      A_ON;  B_OFF; C_OFF; D_ON;
    break;
  }
}


/**
  * 函数功能: 主函数.
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */
int main(void)
{   
  /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
  HAL_Init();
  /* 配置系统时钟 */
  SystemClock_Config();
  
  KEY_GPIO_Init();
  
  ULN2003_GPIO_Init();
  
  /* 无限循环 */
  while (1)
  {
    if(KEY1_StateRead()==KEY_DOWN)
    {
      Circle_number=STEPMOTOR_CIRCLE_NUMBER;//赋值给目标旋转圈数,重新开始旋转
    }
    if(KEY2_StateRead()==KEY_DOWN)
    {
      direction=1-direction; // 1 --> 0 ; 0 --> 1 反转方向
      
    }
  }
}

void HAL_SYSTICK_Callback(void)
{
  static uint8_t count=0;               // 用于旋转速度控制
  static uint8_t step=0;                // 当前步进节拍
  static uint16_t pulse_count=0;        // 脉冲计数,4096个脉冲电机旋转一圈
  
  if(Circle_number)                     // 如果等待旋转圈数不为0
  {
    count++;                            // 增加时间计数
    if(count==speed)                    // 时间计数与目标速度相对时执行下一节拍输出
    {
      step_motor_pulse(step,direction); // 输出新节拍信号
      pulse_count++;                    // 脉冲输出数增加      
      step++;                           // 节拍数增加
      if(step==8) step=0;               // 循环开始输出节拍
      count=0;                          // 清零时间计数
    }
   
    if(pulse_count==4096)               // 如果已经输出了4096个脉冲信号,已经转动了一圈
    {
      pulse_count=0;                    // 脉冲计数清零
      Circle_number--;                  // 等待旋转圈数减1
    }
  }
  else
  {
    A_OFF;  B_OFF; C_OFF; D_OFF;        // 停机
  }
}
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/



沙发
mmuuss586| | 2016-8-23 10:21 | 只看该作者
谢谢分享;

使用特权

评论回复
板凳
80x86abc| | 2016-8-26 17:29 | 只看该作者
LL库什么时候整理下啊

使用特权

评论回复
地板
dongnanxibei| | 2016-8-26 21:18 | 只看该作者
这个STm32里面用到的回调函数讲讲吧,不懂。

使用特权

评论回复
5
亼亽|  楼主 | 2016-8-27 08:45 | 只看该作者
80x86abc 发表于 2016-8-26 17:29
LL库什么时候整理下啊

LL库什么来着

使用特权

评论回复
6
亼亽|  楼主 | 2016-8-27 08:49 | 只看该作者
dongnanxibei 发表于 2016-8-26 21:18
这个STm32里面用到的回调函数讲讲吧,不懂。

回调函数一般都是服务性质函数,可以类比中断服务函数理解,我们触发中断就可以执行中断服务函数,
那类比到回调函数,就是我们程序运行进入某个比较特殊状态,此状态一般有特殊意义,所以我们就可以让
它执行回调函数,实现一些功能

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
dongnanxibei + 3 很给力!
7
dongnanxibei| | 2016-8-27 15:05 | 只看该作者
楼主抽空给我回复讲解,不胜感激,讲的真是浅显易懂,高手。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

122

主题

216

帖子

48

粉丝