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

[复制链接]
1747|17
 楼主| 慢动作 发表于 2023-3-23 00:30 | 显示全部楼层 |阅读模式
前言

最近接手了实验室里的一个项目,需要使用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的满量程输出电流。
原理图
13820641b2d4d3ee60.png
————————————————
版权声明:本文为CSDN博主「不会武功不懂江湖」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43903002/article/details/125513995
 楼主| 慢动作 发表于 2023-3-23 00:31 | 显示全部楼层
引脚说明
16237641b2d63d763c.png
67266641b2d71e647d.png

DIR–方向控制
STEP–MUC的PWM
ENABLE–3.3V(使能电机),–0V(关闭)
nSLEEP–3.3V(取消休眠),–3V(休眠)
 楼主| 慢动作 发表于 2023-3-23 00:32 | 显示全部楼层
关于M0和M1就是用来设置细分参数
8236641b2d8f78793.png
45680641b2d9aafcb9.png
 楼主| 慢动作 发表于 2023-3-23 00:32 | 显示全部楼层
关于DECAY0和DECAY1用于设置衰减模式,建议设置成(0.0)或(0,1)
2525641b2dac532a8.png
 楼主| 慢动作 发表于 2023-3-23 00:32 | 显示全部楼层
代码

脉冲数决定电机的行程,脉冲频率决定电机的转速,通过查找资料得知,可以通过两个定时器设置主从定时器模式来实现,或者是采用一个定时器,直接定时器中断里改输出电平去模拟脉冲输出,但电机没做闭环容易丢步,我采用的是主从定时器模式来实现。
 楼主| 慢动作 发表于 2023-3-23 00:33 | 显示全部楼层
由主定时器输出方波信号,从定时器对主定时器输出的脉冲进行计数,溢出时触发从定时器的中断服务函数。以此达到控制步进电机转动的圈数的目的,主从定时器模式需要按照下表来设置
90574641b2dc92b833.png
 楼主| 慢动作 发表于 2023-3-23 00:33 | 显示全部楼层
程序:
stepmotor.h
  1. #ifndef __stepmotor_H
  2. #define __stepmotor_H

  3. #include "main.h"

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

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

  6. void PWM_Output_B(u32 PulseNum_B,u8 DIR);                       

  7. void TIM3_IRQHandler(void);//从定时器中断
  8. #endif
 楼主| 慢动作 发表于 2023-3-23 00:33 | 显示全部楼层
  1. # include "stepmotor.h"

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

  3. void STEP_MOTOR_PWM_Configuration(u16 arr,u16 pre) //主定时器设置
  4. {
  5.         GPIO_InitTypeDef GPIO_InitStructure;
  6.         TIM_TimeBaseInitTypeDef        TIM_TimeBaseStructure;
  7.         TIM_OCInitTypeDef TIM_OCInitStructure;
  8. //        TIM_BDTRInitTypeDef     TIM_BDTRInitStructure;
  9.        
  10.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE, ENABLE);
  11.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  12.        
  13.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_TIM2); //
  14.        
  15.        
  16.         // PWM PA3
  17.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3;                 //
  18.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  19.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  20.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //复用推挽输出
  21.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
  22.         GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化 PB14
  23.         TIM_TimeBaseStructure.TIM_Period= arr-1;                               
  24.         TIM_TimeBaseStructure.TIM_Prescaler= pre-1;                       
  25.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  26.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;               
  27.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  28.         TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);         //TIM2
  29.          
  30.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                               
  31.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;       
  32.         TIM_OCInitStructure.TIM_Pulse = arr/2;
  33.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;               
  34.                                                
  35.         TIM_OC4Init(TIM2, &TIM_OCInitStructure);
  36.        
  37.         TIM_SelectMasterSlaveMode( TIM2, TIM_MasterSlaveMode_Enable);                // 定时器主从模式使能
  38.         TIM_SelectOutputTrigger( TIM2, TIM_TRGOSource_Update);
  39.        
  40.         TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);

  41.         TIM_ARRPreloadConfig(TIM2,ENABLE);               

  42. void TIM3_Config(u32 PulseNum_B )//从定时器设置
  43. {
  44.         TIM_TimeBaseInitTypeDef        TIM_TimeBaseStructure;
  45.         NVIC_InitTypeDef        NVIC_InitStructure;
  46.        
  47.         RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE);
  48.        
  49.         TIM_TimeBaseStructure.TIM_Period = PulseNum_B;
  50.         TIM_TimeBaseStructure.TIM_Prescaler = 0;
  51.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  52.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  53.         TIM_TimeBaseInit( TIM3, &TIM_TimeBaseStructure);
  54.        
  55.        
  56.         TIM_SelectInputTrigger( TIM3, TIM_TS_ITR1);                        // TIM2-主,TIM3-从
  57.         TIM_SelectSlaveMode( TIM3, TIM_SlaveMode_Gated);
  58.         TIM_ITConfig( TIM3, TIM_IT_Update, ENABLE);

  59.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
  60.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  61.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  62.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  63.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  64.         NVIC_Init( &NVIC_InitStructure);
  65. }
  66. void PWM_Output_B( u32 PulseNum_B,u8 DIR)                        // TIM2-主,TIM3-从
  67. {
  68.         if(DIR == 0)
  69.                         GPIO_SetBits(GPIOC, GPIO_Pin_4);//  C4--DIR
  70.         else
  71.                         GPIO_ResetBits(GPIOC, GPIO_Pin_4);//  C4--DIR

  72.                
  73.         TIM3_Config(PulseNum_B);
  74.         TIM_Cmd( TIM3, ENABLE);
  75.         TIM_ClearITPendingBit( TIM3, TIM_IT_Update);
  76.         TIM_ITConfig( TIM3, TIM_IT_Update, ENABLE);
  77.         STEP_MOTOR_PWM_Configuration( 1000,84);                //F429:通用定时器是 84MHz, 故84MHz / 84 = 1MHz
  78.         TIM_Cmd( TIM2, ENABLE);
  79.         void TIM3_IRQHandler(void)
  80. {
  81.         if (TIM_GetITStatus( TIM3, TIM_IT_Update) != RESET)
  82.         {
  83.                 TIM_ClearITPendingBit( TIM3, TIM_IT_Update);                        // 清除中断标志位
  84.                 TIM_Cmd( TIM2, DISABLE);                        // 关闭定时器2
  85.                 TIM_Cmd( TIM3, DISABLE);                        // 关闭定时器3
  86.                 TIM_ITConfig( TIM3, TIM_IT_Update, DISABLE);
  87.         }
  88. }
  89. }
 楼主| 慢动作 发表于 2023-3-23 00:33 | 显示全部楼层
main.c
  1. #include "stm32f4xx.h"
  2. #include "usart.h"
  3. #include "delay.h"
  4. #include "main.h"

  5. float motor_t;

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

  21.         while(1)
  22.         {
  23.                 LOOP();
  24.                                        
  25.         }
  26.        
  27. }
 楼主| 慢动作 发表于 2023-3-23 00:34 | 显示全部楼层
在初始化程序中调用一次PWM_Output_B()即可。
AloneKaven 发表于 2023-3-23 22:56 | 显示全部楼层
衰减模式为啥建议设置成(0.0)?
万图 发表于 2024-4-22 07:28 | 显示全部楼层

就是因为它的作用就是在电子产品设备受到雷击浪涌与ESD静电放电或者其他瞬态电压时
Uriah 发表于 2024-4-22 08:31 | 显示全部楼层

这方便一般可以使用底涂的方式来改善
Bblythe 发表于 2024-4-22 11:30 | 显示全部楼层

在电子电路中电容一端接电阻
Pulitzer 发表于 2024-4-22 14:29 | 显示全部楼层

电流若是偏大就会直接导致器件烧毁
Wordsworth 发表于 2024-4-22 17:28 | 显示全部楼层

从而达到对电子设备进行静电保护
Clyde011 发表于 2024-4-22 18:31 | 显示全部楼层

齐纳二极管的缺点是不如TVS快
您需要登录后才可以回帖 登录 | 注册

本版积分规则

82

主题

1071

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部