步进电机控制原理与方法

步进电机控制实践

活到老学到老,这几天对步进电机控制进行实践操作,包括硬件与软件。住要目的实践体验步进电机转动性能,转速控制。特别低转速。软件编程。

零:硬件连接:

一:步进电机控制原理:

步进电机工作原理的间单介绍。两相步进电机总共两个挠组,电机有四条线连接到驱动

器,将两个挠组在同一时刻通上相反方向的脉冲电流,步进电机向前走一步。 我手头上的电机参数,最小步距为1.8度。最高电压24V,最大电流1.5A. 这里我们只需知道步进电机控制原理与方法,步进电机内部挠组结构,磁电原理不进行深入讨论与说明。

意思也就是说,每出一个脉冲驱动,电机可以走1.8度。走一转需要 360度/1.8度=200个脉冲。 这个是个基础数据。 也是1:1没有分步。 步进电机驱动器为了更精准的控制步进距离,还有分步。 通常粗糙控制器有 1/2步,4/1步,1/8步,1/16步, 1/32步;更精密驱动芯片,例如TI 微步步进电机驱动芯片DRV8424, DRV8425  ,分步就有1/2步,4/1步,1/8步,1/16步, 1/32步,1/64步,1/128步,1/256步。最高精度可以做到1/256步。可用打印机这些精密的设备上面。

  我从拼多多上面花了45元买了一个步进电机驱动模块,型号:TB6600。 输入电压9-24V, 最小分步1,最大 1/32步。 可以通过三位拨码开关设置 1:1步,1/2步,1/4步,1/8步,1/16步,1/32步。从控制信号输入端可以用PWM脉冲信号控制步进电机的转速,扭距,用高低电平控制转动的方向。

现在我们计算一下PWM如何通过频率控制步进电机转速。

我们电机最小步距是1.8度。 驱动器分步我们选1/32步。 为了方便计算说明,把分步后的最小步距用Smin表示,

  Smin=1.8/32=0.05625度。

转一圈360度需要步数用ST表示:

ST=360度/Smin=360/0.05625=6400步。

根据步进电机原理一个脉冲,走一步,如果走一圈需要6400个脉冲。假设我们需要1秒钟转一圈,那我们只需要单片机一秒钟发送6400个脉冲就可以了。为了后面单片机PWM周期设定,这里我们把周期值也计算出来,用TPWM表示:

TPWM=1/ST=1/6400=156.25us.

根据以上原理,我们要通过PWM控制步进电机前进步长,转速,我们需要知道几个参数。

第一:步进电机最小步距:

第二:驱动器的分步数。

第三;步进距离,也就是转动圈数。

总结以上内容,合并以上所有计算公式最后得出一公式。PWM的周期值。

  TPWM=1/【360/(Smin/分步数)】

  TPWM=1/[360/(1.8/32)]=0.00015625秒

电机转动圈数通常用1分钟转多少圈来表示。

如果把圈数转动时间换成分钟。那么先计算出一秒钟转动圈数。比如:1分钟转300圈。

那么就是300/60=5圈。所需要总脉冲数就 5X(360/(1.8/32))=32000. 然后再算TPWM=1/32000=31.25微秒。

把公式按分钟变换一下: 一分钟转动圈数用N表示。

TPWM=1/[(N/60)*360/(1.8/32)]

TPWM=1/[(300/60)*360/(1.8/32)]= 31.25微秒

根据以上步进电机控制原理。问题变的很间单,我们只要根据TPWM数据用单片PWM

功能发出需要的脉冲数量就可以了,

二:设计目标:

   根据步进电机的控制原理与反法,用32位单片机ZB32L032的PWM功能输出周期31。25us的PWM波,使电机转速在300转一份钟。当正转300转后,立刻反转300转。然后再正转300转。转速显示在四位LED屏上。前面第一位数表示转动方向,用F表示正转,R表示反转,后面三位数表示转速。

   用32位单片机ZB32L032的31脚PA10口输出PWM波。

30脚PA09输出正反转控制信号,高电平控制正转,低电平控制反转。

29脚PA08输出使能信号,高电平打开驱动器,低电平关闭驱动器并进入低功耗待机状态。

   PWM波使用ZB32L032的高级定时器1,使能PWM功能,从31脚PA10口输出PWM波,开启中断功能,在中断函数里面进行计数。计算器到达6400次,表示步进电机转了一圈。192000次表示300圈,此时从单片机30脚PA09输出低电平,控制电机反转,当反转300圈后,再从单片机30脚PA09输出高电平,使步进电机正转。

   使用单片机ZB32L032的基本定时器11,定时1ms用于对LED屏显示屏进行动态扫描。扫描每位LED屏约1ms,4位LED屏约需要4ms, 扫描整整屏约250HZ.

三:软件流程:

四:部分主要代码:

int main(void){

//  uint32_t    PrescalerValue = 0;

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

    HAL_Init();

    /* Configure the system clock to HIRC 24MHz*/

    _SystemClock_Config();

    /**

     *  Enable GPIO clock for configuring.

     */

    gpio_init();

//    PrescalerValue = (uint32_t)(HAL_RCC_GetPCLKFreq() / CONFIG_TIMx_FREQ);//0.00015625

    pwm_init();

    timer11_init();

    P_pww->pwm_counter=0;

    step_motor_direction(RIGHT_DIR_MOTOR);

    while(1){

          HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET);

       if(P_pww->pwm_counter<1920000){

        step_motor_direction(RIGHT_DIR_MOTOR);

        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_6);

        HAL_Delay(50);

          }

       else if((P_pww->pwm_counter>1920000)&&(P_pww->pwm_counter<3840000)){

          HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_6);

          step_motor_direction(LEFT_DIR_MOTOR);

          HAL_Delay(200); 

           }

       else{

         P_pww->pwm_counter=0; 

       }

       key_working();

       led_displayer_run();

    }

}

void Error_Handler(void){

  while(1){

      }

}

 #include "pwm.h"

TIM_HandleTypeDef           g_hTIMx = {0};

void pwm_init(void){

//    TIM_HandleTypeDef           g_hTIMx = {0};

    TIM_OC_InitTypeDef          g_hTIMxOC = {0};

     GPIO_InitTypeDef  GPIO_InitStruct = {0};

     __HAL_RCC_TIM1_CLK_ENABLE();

    

    GPIO_InitStruct.Pin             =GPIO_PIN_10;

    GPIO_InitStruct.Mode            =GPIO_MODE_AF;

    GPIO_InitStruct.Debounce.Enable = GPIO_DEBOUNCE_ENABLE;

    GPIO_InitStruct.SlewRate        = GPIO_SLEW_RATE_HIGH;

    GPIO_InitStruct.DrvStrength     = GPIO_DRV_STRENGTH_HIGH;

    GPIO_InitStruct.Pull            = GPIO_PUSHPULL;

    GPIO_InitStruct.Alternate=GPIO_AF_MODE_2;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

   

   

   

    g_hTIMx.Instance               = TIM1;

    g_hTIMx.Init.Period            =31;//52;//78;//9433;//1561; //156-1;                             // TIM1A_ARR Period

    g_hTIMx.Init.Prescaler         = 64;                             // TIMx Frequency(CK_CNT) = fCK_PSC/(PSC[15:0]+1) = TIMx_FREQ

    g_hTIMx.Init.ClockDivision     = 0;                               // CKD(Clock division)

    g_hTIMx.Init.CounterMode       = TIM_COUNTERMODE_UP;              // Edge alignment mode ,counter up

    g_hTIMx.Init.RepetitionCounter = 0;                               // TIM1A_RCR

    g_hTIMx.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;   // Enable Auto-reload

    HAL_TIM_PWM_Init(&g_hTIMx);

    g_hTIMxOC.OCMode     =TIM_OCMODE_PWM1;// TIM_OCMODE_PWM1;                         // PWM mode1 TIM1A_CCMR1

    g_hTIMxOC.Pulse      =10;//5500;                                 // This value is used to determine the duty cycle,and the default duty cycle is 50%

    g_hTIMxOC.OCPolarity = TIM_OCPOLARITY_LOW;                      // Output polarity, OC1 is valid at low level

//    HAL_TIM_PWM_ConfigChannel(&g_hTIMx, &g_hTIMxOC, TIM_CHANNEL_1); // Configure TIM1A Channel1

    HAL_TIM_PWM_ConfigChannel(&g_hTIMx, &g_hTIMxOC, TIM_CHANNEL_2); // Configure TIM1A Channel2

//    HAL_TIM_PWM_ConfigChannel(&g_hTIMx, &g_hTIMxOC, TIM_CHANNEL_3); // Configure TIM1A Channel3

//    HAL_TIM_PWM_ConfigChannel(&g_hTIMx, &g_hTIMxOC, TIM_CHANNEL_4); // Configure TIM1A Channel4

    HAL_NVIC_SetPriority(TIM1_IRQn,0);

    HAL_NVIC_EnableIRQ(TIM1_IRQn);

    HAL_TIM_PWM_Start_IT(&g_hTIMx,TIM_CHANNEL_2);

//    HAL_TIM_PWM_Start(&g_hTIMx, TIM_CHANNEL_1); //Open PWM Channel1

//    HAL_TIM_PWM_Start(&g_hTIMx, TIM_CHANNEL_2); //Open PWM Channel2

//    HAL_TIM_PWM_Start(&g_hTIMx, TIM_CHANNEL_3); //Open PWM Channel3

//    HAL_TIM_PWM_Start(&g_hTIMx, TIM_CHANNEL_4); //Open PWM Channel4

//    return;

    

}

五:错误点:

  1:步进电机接线错误,原因是步进电机标签标示错误,按照标签颜色接入驱动器,MCU

开PWM波,电机步转,只有电流声,滴滴答答的噪声。之后用万用表确认。线路接错。正确的是红黑一挠组,蓝绿为一挠组。按正确重新接入驱动器,电机能正常运行。

2:软件启动死机,经调试时发现只要进系统时钟初始函数就卡死。后发现库文件少了“zb32l03x_it.c”. 这个文件比较隐蔽,建工程项目时没有加进来。

六:更新内容:

昨天下午把4位LED屏得软件写完了。然后把转数显示在LED屏上。 今天早上把把计算速度算法也写好,这个算法是自动计算PWM得周期,电机转速..只需要输入每分钟的转速就可以电机转起来。利用这个算法测试了1:1, 1/2,1/4, 1/8,1/16, 1/32得细分步长,测试结果,步进电机在不同思分下,基本在每秒钟3-9圈之间。 太低转速或者太高转速,出现效率低,噪声大,或者只有电流声,抖动声,转不起来。最佳转速在一分钟300-500转。电流最小,噪声最小,效率是最高。可能也跟我买得这个电机也有关系。 以下是算法与测试参数结果: 测试结果就是后面注释。
void motor_base_data(float number_circle){
  float circle_each_second;
  float circle_pulse;
  float step_number;
  float setup_number_circle;
//  step_number=200;//3-6.6 circle each second 300-400
//  step_number=400; //5-6.6 circle each second 400-450
//  step_number=800; //6.6-9.1 circle each second 400-550
//  step_number=1600;  //6.6-8.3 circle each second 400-500
//  step_number=3200;  //6.6-9.1 circle each second 400-550
  step_number=6400; //5-8.3 circle each second 400-550
  setup_number_circle=number_circle;
  circle_each_second=setup_number_circle/60;   
  circle_pulse=circle_each_second*step_number; 
 P_pww->pwm_Period=(uint16_t) (1000000/circle_pulse);
 P_pww->pwm_duty=P_pww->pwm_Period/2;
 motor_P->motor_circle_plues=(uint16_t) (circle_pulse);  
}

4位LED屏显是代码如下:

#include "led_displayer.h"

void dp_display(unsigned char on_off){
   if(on_off){
      HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_SET); 
      }  
  else{
      HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET); 
    }          
}

void numbers_0_9(unsigned char number){
    unsigned char displayer_data;
    displayer_data=number;
   switch(displayer_data){
       case ALL_TRUN_ON:{
         HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_SET);
         HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);     
         HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_SET); 
         break;
        }
      case ALL_TRUN_OFF:{
         HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
         HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_RESET);     
         HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET); 
         break;
        }
     case CHARACTER_F:{
         HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET); 
//         HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_RESET); 
//         HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_RESET); 
//         HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_SET);
         HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);     
//         HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_SET); 
         break;
        }
     case CHARACTER_R:{
         HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET); 
//         HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_SET);
         HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);     
//         HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_SET); 
         break;
        }
      case NO_DISPLAY:{
         HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
         HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_RESET);     
          break;          
                  }
      case NUMBER_0:{
         HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_SET);
         HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET); 
//         HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_RESET);     
//         HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET); 
         break;
        }
      case NUMBER_1:{
//         HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET); 
//         HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_RESET); 
//         HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
//         HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_RESET); 
//         HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_RESET);     
//         HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET); 
         break;
        } 
     case NUMBER_2:{
         HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET); 
//         HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_SET);
//         HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);     
//         HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET); 
         break;
        }   
      case NUMBER_3:{
         HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_SET); 
//         HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
//         HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);     
//         HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET); 
         break;
        }
      case NUMBER_4:{
//         HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET); 
//         HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_RESET); 
//         HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
         HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);     
//         HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET); 
         break;
        }
      case NUMBER_5:{
         HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET); 
//         HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_SET); 
//         HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
         HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);     
//         HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET); 
         break;
        }
      case NUMBER_6:{
         HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET); 
//         HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_RESET); 
         HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_SET);
         HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);     
//         HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET); 
         break;
        }
      case NUMBER_7:{
         HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET); 
//         HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_RESET); 
//         HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
//         HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_RESET); 
//         HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_RESET);     
//         HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET); 
         break;
        }
      case NUMBER_8:{
         HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_SET);
         HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);     
//         HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET); 
         break;
        }
      case NUMBER_9:{
         HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_SET); 
//         HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
         HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET); 
         HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);     
//         HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET); 
         break;
        }
      
      
      default:{
         break;
        } 
    }      
 dp_display(FAIL);        
}


void number_dig_1(void){
    HAL_GPIO_WritePin(DIG_1_PORT,DIG_1_GPIO,GPIO_PIN_RESET); 
    HAL_GPIO_WritePin(DIG_2_PORT,DIG_2_GPIO,GPIO_PIN_SET); 
    HAL_GPIO_WritePin(DIG_3_PORT,DIG_3_GPIO,GPIO_PIN_SET); 
    HAL_GPIO_WritePin(DIG_4_PORT,DIG_4_GPIO,GPIO_PIN_SET); 
    numbers_0_9(LED_P->led_display_data1);  
}

void number_dig_2(void){
    HAL_GPIO_WritePin(DIG_1_PORT,DIG_1_GPIO,GPIO_PIN_SET); 
    HAL_GPIO_WritePin(DIG_2_PORT,DIG_2_GPIO,GPIO_PIN_RESET); 
    HAL_GPIO_WritePin(DIG_3_PORT,DIG_3_GPIO,GPIO_PIN_SET); 
    HAL_GPIO_WritePin(DIG_4_PORT,DIG_4_GPIO,GPIO_PIN_SET); 
    numbers_0_9(LED_P->led_display_data2);  
}

void number_dig_3(void){
    HAL_GPIO_WritePin(DIG_1_PORT,DIG_1_GPIO,GPIO_PIN_SET); 
    HAL_GPIO_WritePin(DIG_2_PORT,DIG_2_GPIO,GPIO_PIN_SET); 
    HAL_GPIO_WritePin(DIG_3_PORT,DIG_3_GPIO,GPIO_PIN_RESET); 
    HAL_GPIO_WritePin(DIG_4_PORT,DIG_4_GPIO,GPIO_PIN_SET); 
    numbers_0_9(LED_P->led_display_data3);  
}

void number_dig_4(void){
    HAL_GPIO_WritePin(DIG_1_PORT,DIG_1_GPIO,GPIO_PIN_SET); 
    HAL_GPIO_WritePin(DIG_2_PORT,DIG_2_GPIO,GPIO_PIN_SET); 
    HAL_GPIO_WritePin(DIG_3_PORT,DIG_3_GPIO,GPIO_PIN_SET); 
    HAL_GPIO_WritePin(DIG_4_PORT,DIG_4_GPIO,GPIO_PIN_RESET); 
    numbers_0_9(LED_P->led_display_data4);  
}


void RESET_LED_PLAN(void){
//    HAL_GPIO_WritePin(DIG_1_PORT,DIG_1_GPIO,GPIO_PIN_RESET); 
//    HAL_GPIO_WritePin(DIG_2_PORT,DIG_2_GPIO,GPIO_PIN_RESET); 
//    HAL_GPIO_WritePin(DIG_3_PORT,DIG_3_GPIO,GPIO_PIN_RESET); 
//    HAL_GPIO_WritePin(DIG_4_PORT,DIG_4_GPIO,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_RESET); 
    HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_RESET); 
    HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_RESET); 
    HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_RESET); 
    HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_RESET); 
    HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_RESET);     
    HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET); 
   
}

void hex_to_dec(void){
  uint32_t temp;  
  uint32_t display_data;
  display_data=LED_P->led_data_update; 
  LED_P->led_display_data2=display_data/100;
  temp=display_data/10;  
  LED_P->led_display_data3=temp%10;
  LED_P->led_display_data4=display_data%10;  
    
}


void led_displayer_run(void){
  if(LED_P->led_displayer_updata_flag==TRUE){
     LED_P->led_displayer_updata_flag=FAIL;
     LED_P->led_disp_dig++;
     hex_to_dec();
     if(motor_P->motor_run_directiion==MOTOR_TRUN_RIGHT){
         LED_P->led_display_data1=CHARACTER_F;
        }
     if(motor_P->motor_run_directiion==MOTOR_TRUN_LEFT){
         LED_P->led_display_data1=CHARACTER_R;
        }
     
     if(LED_P->led_display_data2==RESET){
        LED_P->led_display_data2=NO_DISPLAY;
       if(LED_P->led_display_data3==RESET){
          LED_P->led_display_data3=NO_DISPLAY; 
          }         
        }
    
//     if((LED_P->led_display_data2==RESET)&&(LED_P->led_display_data3==RESET)){
//        LED_P->led_display_data2=NO_DISPLAY; 
//        LED_P->led_display_data3=NO_DISPLAY;
//        }
    
//     LED_P->led_display_data4=8;
//     LED_P->led_data_updata_1s++; 
//    if(LED_P->led_data_updata_1s>=1000){
//      LED_P->led_data_updata_1s=RESET;
//      LED_P->led_data_update++;//=NUMBER_4;//ALL_TRUN_ON;
//      if(LED_P->led_data_update==10){
//        LED_P->led_data_update=RESET;  
//       }
//     
//     }
      
      RESET_LED_PLAN();
 switch(LED_P->led_disp_dig){
     case LED_DIG_1:{
         number_dig_1();       
        break;
         } 
     case LED_DIG_2:{
         number_dig_2();
        break;
         }  
     case LED_DIG_3:{
         number_dig_3();
        break;
         } 
     case LED_DIG_4:{
         number_dig_4();
        LED_P->led_disp_dig=RESET; 
        break;
         }      
     default:{
        LED_P->led_disp_dig=RESET;
        break;
      } 
    }   
 }    
}
 

之前我设计目标到这里就结束了:不过现在我改变想法。准备自己设计一块步进电机的PCB,增加串口功能。增加更多按键功能。 用户可以通过显示屏与按键或者串口设置电机转速,转动方向。细分步长,驱动最大电流等。  用户可以不用编程就能轻易把步进电机按自己需要参数转起来。 使用户更方便。

动态请看搏客视频:

六:总结:

   本次实践实现了设计目标,实现了步进电机在不同的频率的控制下,实现不同转速。在不同占空比下实现了不同扭力。通过调节PWM频率步进电机从1分钟一转到 1分钟300转的运行。同时LED数码屏实时显示转速。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值