用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)
  {
  ;    
  }
}

 

完整代碼:https://pan.baidu.com/s/12mM-IK6k8j8O1BH9czQbDA
提取碼:rv6t

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM