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


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


一、硬件部分
1.使用的硬件
板子用的是正点原子的STM32F103 mini板,驱动器是DM420(DM420驱动器资料),用开关电源供电,电机就是普通的42步进电机,步距角为1.8°,虽然按照图片来看它是个蠕动泵。如下图
【用STM32定时器中断产生PWM控制步进电机】
2.硬件连接
PUL+——PB0,脉冲输入
DIR+——PB1,方向使能
ENA+——PB2,脱机使能,共阴极接法的话,输入低电平,让它无效。
这里连接驱动器采用共阴极接法,如图

3.总硬件连接图
用STM32定时器中断产生PWM控制步进电机
文章图片


二、控制步进电机转动
想让它转,简单的说就是高电平,低电平循环输入,产生脉冲,让它转动。
其转速与产生脉冲频率有关:
arr:自动重装载寄存器的值
psc:定时器频率
α为步距角(1.8°),x为驱动器细分倍数(设置为2,也就是说转动一圈需要400个脉冲,每个脉冲转动0.9度)
脉冲频率 = Fck_int(72MHZ) / ((arr+1)*(psc+1))
转速(r/min)= 脉冲频率 * 60 / ((360/α)*x)

假如我将arr设置为10-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)) =100Hzwhile(1) { ; }
}


如果想要完整代码,可以下方评论区留下邮箱,我看到就会发。

    推荐阅读