STM32控制BYJ48步进电机(串口控制驱动代码)

本文介绍了一种使用STM32单片机控制步进电机的方法,详细展示了如何通过编写代码实现电机的顺时针旋转,并提供了完整的初始化设置及脉冲信号产生的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MOTOR.C

#include "motor.h"
#include "delay.h"

//////////////////////////////////////////////////////////////////////////////////	 
//电机驱动代码	   
//Author:znj
//修改日期:2021/3/2
//版本:V1.0								  
////////////////////////////////////////////////////////////////////////////////// 

u8 Clockwise_Index[]={0X09,0X01,0X03,0X02,0X06,0X04,0X0C,0X08};


#define N 512  //步进角所需要的拍数

//步进角5.625/64,64*64个脉冲前进一圈
//8个循环,每个循环8个脉冲,前进一个步进角
//减速比1/64
void BYJ_48_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;				 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_Write(GPIOA,0XFF);

}


void Motor_Create_pulse(void) //产生一个8拍8个脉冲信号
{
	u8 i;
	for(i=0;i<8;i++)
	{
		GPIO_Write(GPIOA,Clockwise_Index[i]);
		delay_ms(1);				
	}
	//GPIO_Write(GPIOA,0XFF);

}

void Motor_Clockwise(void) //顺时针转一圈
{
	u16 i;
	for(i=0;i<N;i++)
	{
		Motor_Create_pulse();		
	}
	//GPIO_Write(GPIOA,0XFF);
		
}

u8 Motor_Clockwiseturns(u8 turns)
{
	u8 i=0;
	for(i=0;i<turns;i++)
	{				
		
		Motor_Clockwise();							
	}
	return 1;
	
}

MAIN.C

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "stm32f10x_gpio.h"
#include "motor.h"
#include "math.h"


u8 data=0;
u8 temp[10];
u8 rx_count=0;
int main(void)
{			
	delay_init();	    	 	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	
	uart_init(115200);	 
 	LED_Init();	
	BYJ_48_Init();  
	
	while(1)
	{
 		if(temp[0]!=0)
		{					   						
			data = temp[0] - 48;
			printf("%d\r\n",data);
						
			while(!Motor_Clockwiseturns(data));
			rx_count=0;
			temp[0]=0;
        }	 
		
	}
}

void USART1_IRQHandler()
{
	  u8 res;
	  if(USART_GetITStatus(USART1,USART_IT_RXNE))//Receive data register not empty flag
        {
			res=USART_ReceiveData(USART1);//通过读取数据来清除RXNE标志			
            temp[rx_count++]=res;
        }
}


第1章 绪 论…………………………………………………………1 §1.1 设计的意义 …………………………………………1 §1.2 设计要解决的问题…………………………………1 §1.3 发展概况……………………………………………1 第2章 步进电机驱动分析与设计 …………………2 §2.1 程序开发环境 ……………………………2 §2.2 实验内容 ………………………………………2 §2.3 程序需要实现的功能……………………………2 §2.4 实验原理…………………………………………2 §2.4.1 步进电机的工作原理……………………………2 §2.4.2 调速原理…………………………………………4 §2.4.3 键盘扫描软件原理………………………………4 第3章 步进电机驱动设计…………………………………5 §3.1 硬件设计……………………………………………5 §3.1.1 设计思路………………………………………5 §3.2 软件设计…………………………………………5 §3.2.1 主程序模块设计…………………………………5 §3.2.2 定时器/计数器模块设计……………………6 §3.2.3 键盘扫描与处理模块设计………………………7 第4章 测试…………………………………………………8 第5章 总结…………………………………………………9 参 考 文 献…………………………………………………10 附录: 步进电机驱动程序代码……………………………11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Greif_Hairline

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值