用STM32定时器中断产生PWM控制步进电机


前言

控制步进电机可以使用PWM、定时器中断、延时,这里用的就是
定时器中断来让它转动。

一、硬件部分

1.使用的硬件

板子用的是正点原子的STM32F103 mini板,驱动器是DM420(DM420驱动器资料),用开关电源供电,电机就是普通的42步进电机,步距角为1.8°,虽然按照图片来看它是个蠕动泵。如下图

2.硬件连接

PUL+——PB0,脉冲输入
DIR+——PB1,方向使能
ENA+——PB2,脱机使能,共阴极接法的话,输入低电平,让它无效。
这里连接驱动器采用共阴极接法,如图
在这里插入图片描述

3.总硬件连接图

在这里插入图片描述

二、控制步进电机转动

想让它转,简单的说就是高电平,低电平循环输入,产生脉冲,让它转动。
其转速与产生脉冲频率有关:

arr:自动重装载寄存器的值
psc:定时器频率
α为步距角(1.8°),x为驱动器细分倍数(设置为2,也就是说转动一圈需要400个脉冲,每个脉冲转动0.9度)
脉冲频率 = Fck_int(72MHZ) / ((arr+1)*(psc+1))
转速(r/min)= 脉冲频率 * 60 / ((360/α)*x)

假如我将arr设置为100-1,psc设置为7200-1,则脉冲频率为100Hz,转速为15r/min.

三、电机驱动代码

1.GPIO.h

#ifndef __GPIO_H
#define __GPIO_H	 
#include "sys.h"

#define LED0 PAout(8)	// PA8,测试是否进入中断

#define PUL PBout(0)  //脉冲输出
#define DIR PBout(1)  //方向使能
#define ENA PBout(2)  //脱机使能

void GPIO_Init(void);//端口初始化
	 				    
#endif

2.timer.c

#include "timer.h"
#include "led.h"


void TIM3_Int_Init(u16 arr,u16 psc)
{
 	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

	TIM_TimeBaseStructure.TIM_Period = arr;
	TIM_TimeBaseStructure.TIM_Prescaler =psc;
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM3,TIM_IT_Update ,ENABLE);
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //初始化外设NVIC寄存器

	TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
							 
}

void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)//是否发生中断
	{		
		PUL = !PUL;
		LED0 = !LED0;	
	}
	TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除TIMx的中断待处理位:TIM 中断源 
}

3.main.c

#include "GPIO.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"


 int main(void)
 {	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
	GPIO_Init();		  	//初始化连接的硬件接口
	ENA = 0; //脱机使能失效
	TIM3_Int_Init(99,7199);//72MHz / ((99+1)*(7199+1)) =100Hz
	 
  while(1)
	{
		;		   
	}
}

代码文件

CSDN:https://download.csdn.net/download/weixin_51649181/32713617
对于一些积分/C币不够的小伙伴对于一些积分/C币不够的小伙伴,链接就放这了:
https://pan.baidu.com/s/12mM-IK6k8j8O1BH9czQbDA
提取码:rv6t
如果你觉得好的话可以给我点个赞!

  • 117
    点赞
  • 166
    收藏
    觉得还不错? 一键收藏
  • 64
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 64
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值