stm32f407驱动步进电机(用限位传感器限制位置)

发布者:码字狂徒最新更新时间:2020-08-04 来源: 51hei关键字:stm32f407  驱动步进电机  限位传感器 手机看文章 扫描二维码
随时随地手机看文章

一、硬件
1.硬件准备:57步进电机(型号57CM18),驱动器TB6600,开发板STM32F407ZGT6,SN-4NDO限位金属传感器,检测面在9mm左右。



2.连线

驱动器右边分有两个区域

Signal:用于驱动器与开发板连接,进行电机的控制驱动。

ENA接口:当此信号有效时,驱动器将自动切断电机绕组电流,使电机处于自由状态(无保持转矩)。当此信号不连接时默认为无效状态,这时电机绕组通以电流,可正常工作。
DIR接口:控制电机旋转方向,信号有效时电机顺时针旋转,无效时逆时针旋转。
PUL接口:步进电机驱动器把控制器发出的脉冲信号转化为步进电机的角位移,驱动器每接受一个脉冲信号 PUL,就驱动步进电机旋转一个步距角,PUL 的频率和步进电机的转速成正比。对于最佳输入要求,此信号占空比最好 1:1,脉冲信号的频率不大于100KHz。
连接方式有两种方法:

(1)共阳极连接



将驱动器的ENA+,DIR+,PUL+接地, 阴极接电,也就是开发板的相对应的控制管脚。

(2)共阴极连接



如STM32F407接线如下:

ENA+(驱动器)  PE6(开发板)
DIR+(驱动器)  PE5(开发板)
PUL+(驱动器)  PC7(开发板)
ENA- DIR- PUL-(驱动器) GND(开发板)

3. High Voltage区域

该区域用于驱动器与步进电机连接。
和下图类似:




电机接法:





这里我采用的是驱动器接法是共阴极接法



对于电源,开发板使用3.3v,电机使用12v,1A,可根据实际情况调整。


4.细分

根据需求,该驱动器最多支持32细分,根据指示的S1,S2,S3开关状态调整驱动器侧面的dip拨码进行细分选择,同样可以通过S4,S5,S6三个开关控制电流大小,最大支持3.5A,峰值电流为4.0A。

我这里采用了4细分。具体如下图:



5.故障问题



PWR:绿灯,电源指示灯。
ALARM:红灯,故障(过流、过热和欠压)时亮。红灯亮起时,表明驱动器出故障了,
请立即切断驱动器电源,排除故障后再继续操作。

6.限位金属传感器

虽然说是传感器,但其实就是一个开关量,就跟光电开关一样。有两种接法:

  • PNP接法

蓝线接地,棕线接电源,黑色线作为输出接入开发板作为输入,在PNP接法中,常态黑色线为低电平,当传感器检测到物体时,会输出24V正电压。


NPN接法差别就是检测到物体时,黑线输出的是负电压。

我这里将传感器的黑线输出连接至KEY0作为对开发板的输入,当检测到物体时,PB0引脚会变为低电平。


二、代码

驱动器代码参照正点原子的例程,然后针对具体的情况做了相应的更改
主要用到了四个函数

void Driver_Init(void);//驱动器初始化

void TIM8_OPM_RCR_Init(u16 arr, u16 psc);//TIM8_CH2 初始化 单脉冲+重复计数模式

void Locate_Rle(long num, u32 frequency, DIR_Type dir) //相对定位函数

void Locate_Abs(long num, u32 frequency);/绝对定位函数

1.驱动初始化

由于ENA和DIR使用的引脚为PE6,PE5,因此在初始化中对它们进行相关的初始化即可(可以根据自己的开发板来更改引脚)。

整体流程:
定义GPIO结构体
使能GPIOE时钟
对结构体进行相关初始化,推挽输出,上拉等
设置PE5,输出为高电平沿顺时针方向
设置PE6,输出为低电平,使能输出


void Driver_Init(void)


{


        GPIO_InitTypeDef  GPIO_InitStructure;




        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);




        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;


        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;


        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;


        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;


        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;


        GPIO_Init(GPIOE, &GPIO_InitStructure);


        


        GPIO_SetBits(GPIOE,GPIO_Pin_5);


        GPIO_ResetBits(GPIOE,GPIO_Pin_6);


}


2.定时器

定时器的时基单元主要有三个寄存器组成:16位计数器,自动重转载寄存器(包括一个影子寄存器),预分频器(控制计数器时钟),其中预分频计数器的时钟频率1——65535。

16位向上、向下、向上/向下自动装载计数器
● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意
数值
● 4个独立通道:
─ 输入捕获
─ 输出比较
─ PWM生成(边缘或中间对齐模式)
─ 单脉冲模式输出
● 使用外部信号控制定时器和定时器互连的同步电路
● 如下事件发生时产生中断/DMA: ─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
─ 输入捕获
─ 输出比较
● 支持针对定位的增量(正交)编码器和霍尔传感器电路
● 触发输入作为外部时钟或者按周期的电流管理

因为用到TIME8与GPIOC(进行端口复用),所以使能对应的时钟。将GPIOC的Pin7复用为TIME8,对TIME8的结构体进行变量初始化,查开发手册可以知道,PC7复用功能为TIME8的CH2。

整体流程

配置TIME8,GPIOC时钟。
初始化TIM8,设置ARR(自动装填值即周期),PSC(时钟预分频系数)
设置TIM8_CH2的PWM模式,使能TIM2_CH2输出
使能TIM2


/***********************************************


//TIM8_CH2(PC7) 单脉冲输出+重复计数功能初始化


//TIM8 时钟频率 84*2=168MHz


//arr:自动重装值


//psc:时钟预分频数


************************************************/


void TIM8_OPM_RCR_Init(u16 arr,u16 psc)


{                                                         


        GPIO_InitTypeDef GPIO_InitStructure;


        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;


        TIM_OCInitTypeDef  TIM_OCInitStructure;


        NVIC_InitTypeDef NVIC_InitStructure;




        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);          //TIM8时钟使能   


        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);         //使能PORTC时钟                                                                                    




        GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_TIM8); //GPIOC7复用为定时器8


        


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;           //GPIOC7


        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能


        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //速度100MHz


        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出


        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;      //下拉


        GPIO_Init(GPIOC,&GPIO_InitStructure);               //初始化PF9


        


        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);


        


        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         


        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值   


        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim


        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式


        TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


        TIM_ClearITPendingBit(TIM8,TIM_IT_Update);




        TIM_UpdateRequestConfig(TIM8,TIM_UpdateSource_Regular); /********* 设置只有计数溢出作为更新中断 ********/


        TIM_SelectOnePulseMode(TIM8,TIM_OPMode_Single);/******* 单脉冲模式 **********/




        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2


        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出2使能


        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; /****** 比较输出2N失能 *******/


        TIM_OCInitStructure.TIM_Pulse = arr>>1; //设置待装入捕获比较寄存器的脉冲值,右移一位


        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高


        TIM_OC2Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx




        TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH2预装载使能         


        TIM_ARRPreloadConfig(TIM8, ENABLE); //使能TIMx在ARR上的预装载寄存器


        


        TIM_ITConfig(TIM8, TIM_IT_Update ,ENABLE);  //TIM8   使能或者失能指定的TIM中断




        NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn;  //TIM8中断


        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //先占优先级1级


        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //从优先级1级


        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能


        NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器


        


        TIM_ClearITPendingBit(TIM8, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM 中断源


        TIM_Cmd(TIM8, ENABLE);  //使能TIM8                                                                                          


}


3.中断服务函数




void TIM8_UP_TIM13_IRQHandler(void)


{


        if(TIM_GetITStatus(TIM8,TIM_FLAG_Update)!=RESET)//更新中断


        {


                TIM_ClearITPendingBit(TIM8,TIM_FLAG_Update);//清除更新中断标志位               


                if(is_rcr_finish==0)//重复计数器未设置完成


                {


                        if(rcr_integer!=0) //整数部分脉冲还未发送完成


                        {


                                TIM8->RCR=RCR_VAL;//设置重复计数值


                                rcr_integer--;//减少RCR_VAL+1个脉冲                                


                        }else if(rcr_remainder!=0)//余数部分脉冲 不为0


                        {


                                TIM8->RCR=rcr_remainder-1;//设置余数部分


                                rcr_remainder=0;//清零


                                is_rcr_finish=1;//重复计数器设置完成                                


                        }else goto out;   //rcr_remainder=0,直接退出                        


                        TIM_GenerateEvent(TIM8,TIM_EventSource_Update);//产生一个更新事件 重新初始化计数器

[1] [2] [3]
关键字:stm32f407  驱动步进电机  限位传感器 引用地址:stm32f407驱动步进电机(用限位传感器限制位置)

上一篇:基于stm32做的遥控器源程序(按键和摇杆均有)
下一篇:stm32f103基本定时器,定时器中断服务程序里面输出脉冲波形

推荐阅读最新更新时间:2024-11-15 00:08

四线二相步进电机L298驱动程序
/*============================================================================= 这个程序是想帮助更多的初学者掌握步进电机的使用,步进电机是一种控制精确的电机, 在个个场合中都有广泛的应用,他的控制非常简单,只要掌握脉冲时序就可以很好的控制。 可以控制它转一定的角度,可以当舵机使用,但它的成本很高,不太核算。 下面的程序是步进电机全步运行和1/2步运行。 ==============================================================================*/ #include reg52.h #d
[单片机]
stm32f407】外部中断实现按键中断方式
一.外部中断 STM32F4的每个IO都可以作为外部中断的中断输入口,这点也是STM32F4的强大之处。STM32F407的中断控制器支持22个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。 STM32F407的22个外部中断为: EXTI线0~15:对应外部IO口的输入中断。 EXTI线16:连接到PVD输出。 EXTI线17:连接到RTC闹钟事件。 EXTI线18:连接到USB OTG FS唤醒事件。 EXTI线19:连接到以太网唤醒事件。 EXTI线20:连接到USB OTG HS(在FS中配置)唤醒事件。 EXTI线21:连接到RTC入侵和时间戳事件。 EXTI线22:连接到RTC唤醒事件
[单片机]
迁移微雪2.9寸电子墨水屏代码到Stm32F407
主要完成了微雪2.9寸电子墨水屏的代码迁移。官方提供的代码是基于STM32F103的,我对他进行了 代码的迁移,使之能运行在Stm32F407上。 墨水屏是从立创商城上买的,正常价格大概100元左右。商城活动大约40块钱入手 这是刚来的时候的样子,排线让我弄丢了,直接拆了插槽 把杜邦线焊上去了、、、、 这是运行demo时候的样子 墨水屏看起来真的很好看。进入正题,代码的迁移: 毫无疑问第一步肯定是修改 IO了,我在 readme 文件里面看到了引脚的定义。 这款屏一共用到了六个IO 其中四个是通用IO 两个是作为 SPI协议的MOSI和CLK线的虽然这款屏是标准的四线SPI,但是屏幕貌似是不需要给单片机回传
[单片机]
迁移微雪2.9寸电子墨水屏代码到<font color='red'>Stm32F407</font>上
STM32F407和STM32F051主从I2C通信方法
简介:本文章主要介绍STM32F407和STM32F051主从I2C通信方法。 M4作为主机: int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_I2C1_Init(); MX_USART1_UART_Init(); /* USER CODE BEG
[单片机]
STM32f407的数字采集电路ADC的设计与使用
(1)简介 stm32 具有2路12位的ADC,具有18个通道(其中两个为内部通道)。各通道 的 ADC转换可以单次,连续,扫描或者间断模式执行。 ADC的数据可以选择左对齐或者右对齐存储在16位的数据寄存器里面。 其中模拟看门狗可以检查输出的电压是否在设定的范围内。 (2)ADC的主要技术指标 分辨率:12分辨率,不能够测量负压,无符号。做小的量化单位LSB=Vref+/2^12. 0-3.3V 时每份度为0.805mV 0-10V 时10V/4096=2.44mv 转换时间: 采样一次至少14个时钟周期,ADC的时钟频率最高14MHZ,也就是说最短时间1us.理论上可以采样50
[单片机]
STM32F407——串口显示跑马灯状态
#main.c #include sys.h #include delay.h #include usart.h #include led.h //#include beep.h //#include key.h #include exti.h extern u8 onoff,dir,speed,change,flag; extern u16 time; int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组 delay_init(168); //初始化延时函数 LED_In
[单片机]
<font color='red'>STM32F407</font>——串口显示跑马灯状态
基于SMA7029M的步进电机驱动设计
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。 1 步进电机特点及驱动 步进电机受脉冲电流控制,每输入一个脉冲电机转轴步进一个步距角增量。转子的角位移正比于输入脉冲的数量,转子的角速度正比于输入脉冲的频率,转子的旋转方向取决于定子绕组的通电顺序。在使用过程
[嵌入式]
设计单片机日志系统
环境: 主机:WIN10 开发环境:MDK5.12 MCU:STM32F407 说明: 为单片机设计了一套简单的日志系统,通过日志系统提供的接口可以查看设备状态,并进行一些基本的调试。 日志系统通过串口输出,所以单片机需要准备一个串口供日志系统使用。注意串口发送不能用DMA发送(避免在在中断中打印日志造成的中断竞争),接收可以用DMA接收。 功能: 打开/关闭各个模块的调试输出 输入动作指令,让设备进行一些动作 打印系统运行日志 指令: H:帮助 O:调试输出全开 O1:打开1号模块,打开其他模块指令类似 F:调试输出全关 F1:关闭1号模块 I:输出系统日志 C:清除系统日志 A1:执行1号动作,执行其他动
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved