打印
[STM32F4]

基于TI DRV8424驱动步进电机实现调速和行程控制

[复制链接]
917|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言

最近接手了实验室里的一个项目,需要使用TI 的DRV8424驱动芯片来驱动一个两相四线步进电机,要实现可以控制速度和电机行程,于是琢磨了几天,成功调试出来了,MCU是STM32F429。
一、步进电机
1.基础知识

步进电机是一种把电脉冲信号转换位角位移或线位移的电动机,就是说当电机收到一个脉冲电机就旋转一个角度,这个角度叫做步距角,而电机的转速只取绝于脉冲信号的频率
步进电机按照磁激励进行分类可分为: 永磁式,反应式,混合式。
按照相数分:二相(二相四线),三/四/五相(四相五线)
二、步进电机驱动器
1.驱动器的用途

由于单片机输出的PWM信号无法直接驱动步进电机,所以需要一个驱动器来将单片机的输出信号放大以实现驱动步进电机,步进电机主要是细分驱动,将步距角以电流分配的方式来进行细分化。
步进电机静态指标有: 1.相数,2.步距角,3.拍数,4.定位转矩,通常二相的步距角为1.8°。三相为1.2°。
动态指标:1.步距角精度,2.最大空载起动频率,2.最大空载运行频率。

使用特权

评论回复
沙发
慢动作|  楼主 | 2023-3-23 00:31 | 只看该作者
2.TI DRV8424 步进电机驱动芯片

因为这次所步进电机的功率和体积都很小,所以采用了TI的DRV8424芯片,其具有集成电流感应,1/256微步进,STEP/DIR接口和智能调优技术,可以通过PWM来实现调速,工作电压为4.5V至33V,最高可驱动2.5A的满量程输出电流。
原理图

————————————————
版权声明:本文为CSDN博主「不会武功不懂江湖」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43903002/article/details/125513995

使用特权

评论回复
板凳
慢动作|  楼主 | 2023-3-23 00:31 | 只看该作者
引脚说明



DIR–方向控制
STEP–MUC的PWM
ENABLE–3.3V(使能电机),–0V(关闭)
nSLEEP–3.3V(取消休眠),–3V(休眠)

使用特权

评论回复
地板
慢动作|  楼主 | 2023-3-23 00:32 | 只看该作者
关于M0和M1就是用来设置细分参数

使用特权

评论回复
5
慢动作|  楼主 | 2023-3-23 00:32 | 只看该作者
关于DECAY0和DECAY1用于设置衰减模式,建议设置成(0.0)或(0,1)

使用特权

评论回复
6
慢动作|  楼主 | 2023-3-23 00:32 | 只看该作者
代码

脉冲数决定电机的行程,脉冲频率决定电机的转速,通过查找资料得知,可以通过两个定时器设置主从定时器模式来实现,或者是采用一个定时器,直接定时器中断里改输出电平去模拟脉冲输出,但电机没做闭环容易丢步,我采用的是主从定时器模式来实现。

使用特权

评论回复
7
慢动作|  楼主 | 2023-3-23 00:33 | 只看该作者
由主定时器输出方波信号,从定时器对主定时器输出的脉冲进行计数,溢出时触发从定时器的中断服务函数。以此达到控制步进电机转动的圈数的目的,主从定时器模式需要按照下表来设置

使用特权

评论回复
8
慢动作|  楼主 | 2023-3-23 00:33 | 只看该作者
程序:
stepmotor.h
#ifndef __stepmotor_H
#define __stepmotor_H

#include "main.h"

void STEP_MOTOR_PWM_Configuration(u16 arr,u16 pre);//主定时器

void TIM3_Config(u32 PulseNum_B );//从定时器

void PWM_Output_B(u32 PulseNum_B,u8 DIR);                       

void TIM3_IRQHandler(void);//从定时器中断
#endif

使用特权

评论回复
9
慢动作|  楼主 | 2023-3-23 00:33 | 只看该作者
# include "stepmotor.h"

// 主定时器TIM2,从定时器TIM3 ,ITR1.

void STEP_MOTOR_PWM_Configuration(u16 arr,u16 pre) //主定时器设置
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef        TIM_TimeBaseStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
//        TIM_BDTRInitTypeDef     TIM_BDTRInitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
       
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_TIM2); //
       
       
        // PWM PA3
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3;                 //
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //复用推挽输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
        GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化 PB14
        TIM_TimeBaseStructure.TIM_Period= arr-1;                               
        TIM_TimeBaseStructure.TIM_Prescaler= pre-1;                       
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;               
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);         //TIM2
         
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                               
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;       
        TIM_OCInitStructure.TIM_Pulse = arr/2;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;               
                                               
        TIM_OC4Init(TIM2, &TIM_OCInitStructure);
       
        TIM_SelectMasterSlaveMode( TIM2, TIM_MasterSlaveMode_Enable);                // 定时器主从模式使能
        TIM_SelectOutputTrigger( TIM2, TIM_TRGOSource_Update);
       
        TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);

        TIM_ARRPreloadConfig(TIM2,ENABLE);               

void TIM3_Config(u32 PulseNum_B )//从定时器设置
{
        TIM_TimeBaseInitTypeDef        TIM_TimeBaseStructure;
        NVIC_InitTypeDef        NVIC_InitStructure;
       
        RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE);
       
        TIM_TimeBaseStructure.TIM_Period = PulseNum_B;
        TIM_TimeBaseStructure.TIM_Prescaler = 0;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit( TIM3, &TIM_TimeBaseStructure);
       
       
        TIM_SelectInputTrigger( TIM3, TIM_TS_ITR1);                        // TIM2-主,TIM3-从
        TIM_SelectSlaveMode( TIM3, TIM_SlaveMode_Gated);
        TIM_ITConfig( TIM3, TIM_IT_Update, ENABLE);

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init( &NVIC_InitStructure);
}
void PWM_Output_B( u32 PulseNum_B,u8 DIR)                        // TIM2-主,TIM3-从
{
        if(DIR == 0)
                        GPIO_SetBits(GPIOC, GPIO_Pin_4);//  C4--DIR
        else
                        GPIO_ResetBits(GPIOC, GPIO_Pin_4);//  C4--DIR

               
        TIM3_Config(PulseNum_B);
        TIM_Cmd( TIM3, ENABLE);
        TIM_ClearITPendingBit( TIM3, TIM_IT_Update);
        TIM_ITConfig( TIM3, TIM_IT_Update, ENABLE);
        STEP_MOTOR_PWM_Configuration( 1000,84);                //F429:通用定时器是 84MHz, 故84MHz / 84 = 1MHz
        TIM_Cmd( TIM2, ENABLE);
        void TIM3_IRQHandler(void)
{
        if (TIM_GetITStatus( TIM3, TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit( TIM3, TIM_IT_Update);                        // 清除中断标志位
                TIM_Cmd( TIM2, DISABLE);                        // 关闭定时器2
                TIM_Cmd( TIM3, DISABLE);                        // 关闭定时器3
                TIM_ITConfig( TIM3, TIM_IT_Update, DISABLE);
        }
}
}

使用特权

评论回复
10
慢动作|  楼主 | 2023-3-23 00:33 | 只看该作者
main.c
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "main.h"

float motor_t;

int main(void)
{       
         SystemInit();
        start_up();
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
        TIM7_Init(TIM7_ARR,TIM7_PRE); /* 主计时时钟初始化 */
          usart2_Config(100000);
        Can_Init();
        PID_Init();       
          LED_Init();
        PWM_Configuration(40,84);// 50kHz=20 , 25KHz=40 //直流无刷电机
        ENCODER_Configuration(12800); //编码器
       
        PWM_Output_B(10000,0); //步进电机  DIR:0-正向,1-反向,
       

        while(1)
        {
                LOOP();
                                       
        }
       
}

使用特权

评论回复
11
慢动作|  楼主 | 2023-3-23 00:34 | 只看该作者
在初始化程序中调用一次PWM_Output_B()即可。

使用特权

评论回复
12
AloneKaven| | 2023-3-23 22:56 | 只看该作者
衰减模式为啥建议设置成(0.0)?

使用特权

评论回复
13
万图| | 2024-4-22 07:28 | 只看该作者

就是因为它的作用就是在电子产品设备受到雷击浪涌与ESD静电放电或者其他瞬态电压时

使用特权

评论回复
14
Uriah| | 2024-4-22 08:31 | 只看该作者

这方便一般可以使用底涂的方式来改善

使用特权

评论回复
15
Bblythe| | 2024-4-22 11:30 | 只看该作者

在电子电路中电容一端接电阻

使用特权

评论回复
16
Pulitzer| | 2024-4-22 14:29 | 只看该作者

电流若是偏大就会直接导致器件烧毁

使用特权

评论回复
17
Wordsworth| | 2024-4-22 17:28 | 只看该作者

从而达到对电子设备进行静电保护

使用特权

评论回复
18
Clyde011| | 2024-4-22 18:31 | 只看该作者

齐纳二极管的缺点是不如TVS快

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

695

帖子

0

粉丝