五五开卡殿 发表于 2024-7-6 23:22:40

angmall 发表于 2024-6-20 08:33
在使用步进电机控制时,如果你已经确认步进电机的步数是200步每转,并且驱动器也设置正确,那么问题可能出 ...

感谢大哥程序调通了大佬帮忙看看如果要加上正转反转控制参数要怎么改程序

//--包含你要使用的头文件--//
#include <STC8A8K64D4.H>
#include <uart.H>
#include <delay.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

#define STEPS_PER_MM 200// 200步/毫米

// 定义步进电机引脚
sbit STEP = P2^6;
sbit DIR = P2^7;
sbit LED = P2^2;
void mm(uint distance_mm) ;
void pwm_pulse(uint num_pulses);
/7oid Uart1_Init(void);        //9600bps@24.000MHz

void main()
{
        P2M0 |= 0xc4;
        P2M1 &= ~0xc4;
        Uart1_Init();
        delay_X_us(100);
        LED = 0;
        delay_X_us(100);
        LED = 1;
       
        while(1)
        {
                if(RI)        //检测串口1接收中断
        {}
        }
}

void Uart1_Isr(void) interrupt 4
{
        uchar DAT;
       
        DAT = SBUF;//读数据
        RI = 0;               //串口中断标志位清零
        switch(DAT)    //判断串口接收的数据
      {
      case '1':LED=0;mm(1);break; / ++开灯判断
      case '0':LED=1;mm(1);break; //x--;关灯判断                  
      default :break;                        
                }
}

// 产生PWM脉冲
void pwm_pulse(uint num_pulses)
{
       uint i;
        for (i = 0; i < num_pulses; i++)
{
        STEP = 1;
        delay_X_us(400);// 调整延时时间以改变PWM频率
        STEP = 0;
        delay_X_us(400);// 调整延时时间以改变PWM频率
}
}

// 输入距离控制函数
void mm(uint distance_mm)
{
        uint steps = distance_mm * STEPS_PER_MM;
// 产生PWM脉冲
        pwm_pulse(steps);
}

angmall 发表于 2024-7-7 09:11:24

五五开卡殿 发表于 2024-7-6 23:22
感谢大哥程序调通了大佬帮忙看看如果要加上正转反转控制参数要怎么改程序

//--包含你要使用的头文件-- ...

要在程序中添加正转和反转控制,可以通过修改步进电机的方向引脚(DIR)来实现。在你的代码中,需要扩展现有的UART控制指令,以便能够接收并处理正转和反转的指令。


### 修改后的代码示例


//--包含你要使用的头文件--//
#include <STC8A8K64D4.H>
#include <uart.H>
#include <delay.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

#define STEPS_PER_MM 200 // 200步/毫米

// 定义步进电机引脚
sbit STEP = P2^6;
sbit DIR = P2^7;
sbit LED = P2^2;

void mm(uint distance_mm, uchar direction);
void pwm_pulse(uint num_pulses);
void Uart1_Init(void); // 9600bps@24.000MHz

void main()
{
    P2M0 |= 0xC4;
    P2M1 &= ~0xC4;
    Uart1_Init();
    delay_X_us(100);
    LED = 0;
    delay_X_us(100);
    LED = 1;

    while (1)
    {
      if (RI) // 检测串口1接收中断
      {}
    }
}

void Uart1_Isr(void) interrupt 4
{
    uchar DAT;

    DAT = SBUF; // 读数据
    RI = 0;    // 串口中断标志位清零
    switch (DAT) // 判断串口接收的数据
    {
    case '1':
      LED = 0;
      mm(1, 1); // 正转
      break;
    case '0':
      LED = 1;
      mm(1, 0); // 反转
      break;
    default:
      break;
    }
}

// 产生PWM脉冲
void pwm_pulse(uint num_pulses)
{
    uint i;
    for (i = 0; i < num_pulses; i++)
    {
      STEP = 1;
      delay_X_us(400); // 调整延时时间以改变PWM频率
      STEP = 0;
      delay_X_us(400); // 调整延时时间以改变PWM频率
    }
}

// 输入距离控制函数
void mm(uint distance_mm, uchar direction)
{
    uint steps = distance_mm * STEPS_PER_MM;

    // 设置方向
    if (direction)
    {
      DIR = 1; // 正转
    }
    else
    {
      DIR = 0; // 反转
    }

    // 产生PWM脉冲
    pwm_pulse(steps);
}


### 代码说明


1. **方向控制的添加**:
    - 在函数 `mm(uint distance_mm, uchar direction)` 中,增加了 `direction` 参数,用于控制正转(1)或反转(0)。
    - 通过设置 `DIR` 引脚的电平,控制步进电机的转动方向。`DIR = 1` 表示正转,`DIR = 0` 表示反转。


2. **UART中断处理函数的修改**:
    - 在 `Uart1_Isr` 中,根据接收到的指令调用 `mm` 函数,添加了方向参数。
    - 例如,接收到 `'1'` 时,调用 `mm(1, 1)` 实现正转;接收到 `'0'` 时,调用 `mm(1, 0)` 实现反转。


3. **步进电机控制函数的修改**:
    - 在 `mm` 函数中,根据传入的 `direction` 参数,设置 `DIR` 引脚的电平,然后产生相应的PWM脉冲以控制步进电机移动指定的距离。


通过上述修改,你的程序可以控制步进电机的正转和反转,并能通过UART接收指令来动态调整电机的转动方向。




五五开卡殿 发表于 2024-7-12 19:12:27

angmall 发表于 2024-7-7 09:11
要在程序中添加正转和反转控制,可以通过修改步进电机的方向引脚(DIR)来实现。在你的代码中,需要扩展 ...

感谢大佬 验证成功了

页: 1 [2]
查看完整版本: 控制步进电机到指定的位置, 大学生毕业设计