一、总体思路

      使用端口GPIOA来连接电机,所以给GPIOA编程就可以控制电机。使用系统时钟SysTick来周期性的给电机发送脉冲。用四个按钮来控制需要发送脉冲的个数,每个按钮被按下就设置给电机发送脉冲的个数,如果上一次给电机发送的脉冲没有发送完成,这次按钮发送的脉冲将不被响应。
 

二、GPIOA端口的设置

      由于需要控制两个电机,所以将GPIOA端口的1,2,3号引脚与电机0相连(分别控制电机的使能,旋转方向和脉冲),GPIOA的4,5,6号引脚与电机1相连。具体对端口的初始化代码为:
GPIO_InitTypeDef GPIO_InitStruct;
//开启电机0外设时钟
DJ_EnablePeriphClock_0();
//初始化电机0
GPIO_InitStruct.GPIO_Pin = DJ_EN_0 | DJ_DR_0 | DJ_MC_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(DJ_GPIO_0, &GPIO_InitStruct);
//设置电机0的初始化状态
DJ_DisEnable(DJ_GPIO_0, DJ_EN_0); //关闭电机0
上面的代码是对与电机0连接的引脚的初始化,电机1的初始化是一样的,只是引脚不同了。从上面的代码可以看到引脚的输出模式是推挽的(为了做Debug),实际应该使用开漏的,由于我们要给电机输入5V的高电平,所以我们应该在外部接一个上拉电阻,电源为5V。
 

三、SysTick设置

     SysTick是一个系统定时器,系统的滴答是可以配置的,在控制电机的程序中我们将系统滴答设置为100us,理论上可以将系统滴答设置为1/72000000s,由于系统的时钟为72MHz。每个脉冲间隔为5个滴答。也就是说每隔500us发送一个脉冲,脉冲周期为1ms。
     设置系统滴答通过宏:
     #define TICK 10000  //100us一个滴答
     实际的配置是通过下面代码:
    SysTick_Config(SystemCoreClock / TICK);
    为了实现每隔5个系统滴答发送一个脉冲,定义了两个全局变量TimingDelay和TimingLoad ,可以通过函数Timer来设置这个变量的值:
      void Timer(__IO uint32_t nTime)
{
TimingDelay = nTime;
TimingLoad = nTime;
}
     TimingDelay表示当前距离发送下一个脉冲还需要等待的滴答数,TimingLoad 表示发送脉冲的间隔,如果每个脉冲间隔为5个滴答,则TimingLoad =5。 这样在系统时钟的每次中断代码中将TimingDelay减1,当TimingDelay为0时就向电机发送脉冲(将对应电机脉冲的引脚的值变反就可以了),然后重新将TimingLoad赋值给TimingDelay来准备下一个脉冲的发送。具体代码如下:
if (TimingDelay)
TimingDelay--;
else
{
TimingDelay = TimingLoad;
if (dj_GetMc()) //判断是否还需要发送脉冲
{
printfd("\r\nsend %dth pulse, %d", dj_GetMc(), - GPIO_ReadOutputDataBit (DJ_GPIO_0, DJ_MC_0)); //用于调试
DJ_IO( - GPIO_ReadOutputDataBit (DJ_GPIO_0, DJ_MC_0), DJ_GPIO_0, DJ_MC_0); //用于发送脉冲
dj_DesMc();
}
else
SysTick_Shutdown(); //关闭系统时钟
}
      dj_GetMc函数和dj_DesMc函数分别获得全局变量dj_McCount的值和对该全局变量减1,这个全局变量代表总共需要发送几个脉冲。正如开头说的,按下一个键就设置需要发送的脉冲数,当脉冲发完了,就关闭系统定时器。
 

四、按键设置

     使用ARM板自带的WAKEUP,TAMPER,USER1,USER2四个键来配置需要发送脉冲的个数,它们分别配置为需要发送2,20,200,2000个脉冲。我们通过中断的方式来检查哪个键被按下了。配置将四个按键与EXTI相连,让EXTI产生中断到中断控制器NVIC。首先需要配置NVIC的抢占优先级和响应优先级,直接调用库函数就可以了:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

然后是配置按键与EXTI相连,具体配置代码如下:
static void NVIC_SetVector( IRQn_Type IRQn, uint8_t PreemptionPriority, uint8_t SubPriority)
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = IRQn;//EXTI0_IRQn | EXTI9_5_IRQn | EXTI3_IRQn | EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = PreemptionPriority;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = SubPriority;
NVIC_Init(&NVIC_InitStruct);
}
//WAKEUP键
static void EXTI_PA0_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
NVIC_SetVector(EXTI0_IRQn, , ); //配置NVIC
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //配置GPIOA_Pin0为EXTI0线
EXTI_InitStruct.EXTI_Line = EXTI_Line0;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising ; //上升沿触发
EXTI_Init(&EXTI_InitStruct);
}

     上面的代码显示了配置WAKEUP键,其它键也是同样的配置。当按下一个键时,对应的中断响应函数就会执行,我们在响应函数中判断全局变量dj_McCount是否为0,如果不为0,说明上一次按键的脉冲还没有发生完成,则直接退出中断响应函数;如果为0,说明当前没有在发生脉冲,则设置dj_McCount为2,开启系统定时器来发送脉冲。代码如下:
//WAKEUP
void EXTI0_IRQHandler(void)
{
if (EXTI_GetFlagStatus(EXTI_Line0) != RESET) //看是否产生了EXTI_Line0中断
{
printfd("\r\nexti0");
if (dj_GetMc() == )
{
dj_SetMc();
SysTick_Startup();
}
EXTI_ClearFlag(EXTI_Line0); //清除中断标志位
}
}

源代码:http://pan.baidu.com/s/1uy6PK

stm32控制电机的更多相关文章

  1. STM32 精确输出PWM脉冲数控制电机(转)

    STM32 精确输出PWM脉冲数控制电机 发脉冲两种目的1)速度控制2)位置控制 速度控制目的和模拟量一样,没有什么需要关注的地方发送脉冲方式为PWM,速率稳定而且资源占用少 stm32位置控制需要获 ...

  2. stm32控制步进电机加减速

    实习公司项目需要控制步进电机,电机方面主要包括控制运动.加减速.限位.下面介绍一下在电机控制方面的心得,由于对于电机的控制不需要很精确,并且自身能力有限,相比于大牛有很大的差距. 1.需要实现的功能 ...

  3. 使用STM32控制TMC5160驱动步进电机

    首先先来了解一下TMC5160的3种工作模式 TMC5160通过两个引脚来控制它的工作模式:SD_MODE和SPI_MODE. 1.当SD_MODE接地,SPI_MODE拉高,TMC5160即工作在模 ...

  4. STM32 控制步进电机 28BYJ-48

    STM32 控制步进电机 28BYJ-48  http://blog.chinaunix.net/uid-12664992-id-300272.html 步进电机驱动最简化的逻辑: //四相八拍:A- ...

  5. 实现硬件PWM控制电机旋转和通过编码器计算所转圈数的简单例程

    该例程所用的硬件设备: 直流电机驱动模块YYH-LWZ: H桥 大功率 正反转 刹车 PWM 调速 5/12/24V 12V直流减速电机JGB37-520B:ASLONG JGB37-520B编码器减 ...

  6. MPU6050工作原理及STM32控制MPU6050

    源:MPU6050工作原理及STM32控制MPU6050 MPU6050 介绍

  7. STM32控制永磁同步电机 | FOC电机控制算法概述

    1. FOC基本概念 参考:https://www.sohu.com/a/432103720_120929980 FOC(field-oriented control)为磁场导向控制,又称为矢量控制( ...

  8. 【单片机入门】(四)应用层软件开发的单片机学习之路-----ESP32开发板PWM控制电机以及中断的使用

    引言 各位大佬,晚上好啊,在上一篇博客中,我们讲了什么是UART串口通讯,以及使用USB转TTL使得单片机可以和c#上位机做一个串口通讯,接下来,为大家带来PWM的概念原理,以及实际案例,使用PWM对 ...

  9. STM32 控制红外线收发

    买了一块STM32的板子,这次需要将IR的code移植到STM32上面,因为STM32成本比树莓派低得多,所以 一些简单的外设挂在STM32上就行了. 我买的板子的型号是STM32F103C8T6,价 ...

随机推荐

  1. CSS Reset

    html, body, div, span, applet, object, iframe,h1, h2, h3, h4, h5, h6, p, blockquote, pre,a, abbr, ac ...

  2. ie8中遇到的兼容问题以及解决方案

    一.CSS3 1.可以通过在css中引入pie.htc,处理兼容问题(可处理的属性) -webkit-box-shadow: 0 1px 5px #ff2826; -webkit-border-rad ...

  3. java-如何用eclipse打包jar

    Eclipse通过导出的方式(右键单击项目,之后选择Export)打包java类文件生成jar包. 方法一:(在项目工程没有引用外部jar包时,直接导出) 选中工程---->右键,Export. ...

  4. (学)解决诡异的 Exception type: SocketException 127.0.0.1:80

    许久不发博了,老杨听完故事让我持续写一下“十万个为什么” 一.背景:  昨天我们亲密的战友HH刘老板亲临现场,指出我们协用的一个项目,客户方面反馈手持终端系统不定期“卡死”,要我们安排人飞到广州驻场解 ...

  5. tornado web 框架的认识

    tornado 简介 1,概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的 ...

  6. MySQL主从复制技术的简单实现

    配置环境: 主从服务器操作系统均为 ubuntu15.10 主从服务器MySQL版本均为 MySQL5.6.31 主服务器IP:192.168.0.178 从服务器IP:192.168.0.145 主 ...

  7. java06

    阅读并运行示例PassArray.java,观察并分析程序输出的结果 小结:引用传递.如果方法中有代码则更改了数组元素的值,因为引用时传递的是地址. 阅读程序WhatDoesThisDo.java, ...

  8. Filter 数组过滤函数精解示例

    '************************************************************************* '**模 块 名:Filter 数组过滤函数精解示 ...

  9. dot

    今天写程序的时候发现一个问题啊 在主函数里面吧某个指针node* r=NULL 赋值为空 然后调用函数insert(node* r,....) 在insert里面呢,我给这个指针赋值了啊 但是主函数里 ...

  10. 数据库中数据DELETE了怎样恢复

    USE [BBDAS_FP_DATA] GO /****** Object: StoredProcedure [dbo].[Recover_Deleted_Data_Proc] Script Date ...