900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > stm32 驱动步进电机

stm32 驱动步进电机

时间:2022-05-29 15:42:42

相关推荐

stm32 驱动步进电机

基于stm32f103ZET6开发板驱动28BYJ-48步进电机

这里使用ULN驱动步进电机,所以只需要找到合适的IO口连接到驱动芯片的IN1~4脚即可,再通过IO口依次输出高电平再拉低即可完成驱动BSP_GPIO.h头文件(名字随便取的,不要在意)

这里使用ULN驱动步进电机,所以只需要找到合适的IO口连接到驱动芯片的IN1~4脚即可,再通过IO口依次输出高电平再拉低即可完成驱动

本代码使用的是PA0~3,依次连接的是IN1-4,如果更改成其他IO口则只需要修改对应的IO初始化函数。

BSP_GPIO.h头文件(名字随便取的,不要在意)

#ifndef __BSP_GPIO_H#define __BSP_GPIO_H#include "sys.h"#include "delay.h"void Motor_GPIOInit (void);//GPIO初始化函数void Motor_CW(void);//步进电机测试函数,逆时针转动void SysTick_Delay_Ms(__IO uint32_t );//滴答定时器void Motor_SW(void);//步进电机测试函数,顺时针转动void Motor_ctrl_angle(int dire ,int angle);//dire:0:顺时针,1:逆时针;angle:控制转动角度void Motor_ctrl_motor(int dire,float cycle);//这里只是把上一个函数的转动角度转化成转动周期void MotorStop(void);//停止转动#endif

头文件里定义了有关步进电机使用的所有驱动函数申明

下面是BSP_GPIO.c文件

. 在这里实现所有函数

#include "bsp_gpio.h"#include "stm32f10x.h"u32 DELAY_TIME =8500;//控制转动速度void Motor_GPIOInit (void){GPIO_InitTypeDef GPIO_InitStructure;//定义DPIO初始化结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的时钟GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//引脚用|运算将Pin0-4全部选中GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_Write(GPIOB,0x0000);//默认电平拉低}void Motor_CW(void)//逆时针转动,从IN1-4依次输出高电平再拉低,DELAY_TIME最低设置6500,太小步进电机只震动不转动{GPIO_SetBits(GPIOA,GPIO_Pin_0);SysTick_Delay_Ms(DELAY_TIME);GPIO_ResetBits(GPIOA,GPIO_Pin_0);GPIO_SetBits(GPIOA,GPIO_Pin_1);SysTick_Delay_Ms(DELAY_TIME);GPIO_ResetBits(GPIOA,GPIO_Pin_1);GPIO_SetBits(GPIOA,GPIO_Pin_2);SysTick_Delay_Ms(DELAY_TIME);GPIO_ResetBits(GPIOA,GPIO_Pin_2);GPIO_SetBits(GPIOA,GPIO_Pin_3);SysTick_Delay_Ms(DELAY_TIME);GPIO_ResetBits(GPIOA,GPIO_Pin_3);}void Motor_SW(void)//顺时针转动{GPIO_SetBits(GPIOA,GPIO_Pin_3);SysTick_Delay_Ms(DELAY_TIME);GPIO_ResetBits(GPIOA,GPIO_Pin_3);GPIO_SetBits(GPIOA,GPIO_Pin_2);SysTick_Delay_Ms(DELAY_TIME);GPIO_ResetBits(GPIOA,GPIO_Pin_2);GPIO_SetBits(GPIOA,GPIO_Pin_1);SysTick_Delay_Ms(DELAY_TIME);GPIO_ResetBits(GPIOA,GPIO_Pin_1);GPIO_SetBits(GPIOA,GPIO_Pin_0);SysTick_Delay_Ms(DELAY_TIME);GPIO_ResetBits(GPIOA,GPIO_Pin_0);}void Motor_ctrl_angle(int dire ,int angle)//dire控制转动方向,angle控制转动角度{int j=0;if(dire==0){//顺时针转动for(j=0;j<64*angle/45;j++)//将角度转化成循环次数,公式是网上CV的,精度不是很高。具体原理请查看步进电机资料,是根据步距角决定的{Motor_SW();}MotorStop();}else{//逆时针转for(j=0;j<64*angle/45;j++){Motor_CW();}MotorStop();}}void Motor_ctrl_motor(int dire,float cycle)//dire控制转动方向;cycle控制转动周期,就是转几圈{int angle=cycle*360;Motor_ctrl_angle(dire , angle);}void MotorStop(void) //转动停止{GPIO_Write(GPIOB,0x0000); }void SysTick_Delay_Ms(__IO uint32_t ms){uint32_t i;SysTick_Config(72000);for(i=0; i<ms ; i++){while(!(SysTick->CTRL)&(1<<16));}SysTick->CTRL &= SysTick_CTRL_ENABLE_Msk;}

**代码是我自己手动敲的,用的板子是正点原子stm32精英板,程序能跑,没有任何问题

**

关于IO口输出的电平时序我这里使用的是最简单的,如果有兴趣可以查看连接:/how-it-works/electrical-engineering/stepper-motor/

这里面讲解了不同时序的驱动方式

人生第一篇文章,有不好的 或者说错了的欢迎指正

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。