210 Ejemplo 2: generación de impulsos de motor paso a paso con puerto IO

1. El propósito del experimento

Utilice el puerto IO para simular la salida de pulsos y el control de dirección del
motor paso a paso: 1. Hay dos motores paso a paso;

Cada motor paso a paso necesita dos cables para controlar,
** Control de dirección: ** Un cable controla DIR, dirección, DIR = 0, rotación hacia adelante, DIR = 1, marcha atrás;
** control de distancia y velocidad: ** Control PUL de una línea raíz pulso, venir con pulso, caminar un ángulo de paso, generalmente 1.8 grados, ver la configuración del interruptor DIP del conductor, ver la información detallada del conductor; cuanto mayor es la frecuencia del pulso, más rápida es la velocidad.
Por lo tanto, al controlar el número de PUL, puede controlar la distancia y el ángulo; controlar la frecuencia de PUL puede controlar la velocidad del motor paso a paso;
aquí, debido a que los requisitos de velocidad no son altos, usamos retardo para controlar, en lugar de temporizadores para generar pulsos.
Si hay un puerto IO para controlar el PUL, entonces se puede escribir así
para avanzar 100 pulsos y luego retroceder 100 pulsos; cuántos mm son 100 pulsos, de acuerdo con la relación de transmisión real y así sucesivamente.

dir=1;//正方向
for(i=0;i<100;i++)
{
    
    
	pul=1;
	delayms(1);
	pul=0;
	delayms(1);
}
dir=0;  //改变方向
for(i=0;i<100;i++)
{
    
    
	pul=1;
	delayms(1);
	pul=0;
	delayms(1);
}

Hagamos una transformación y escribamos una función para darnos cuenta de que el primer motor paso a paso puede especificar el movimiento de dirección y distancia;

//头文件和c文件要设置端口和端口模式。
void MoveStepper1(unsigned char seldir,unsigned int pulnum,unsigned int selvel)
{
    
    

//判断方向
	if(seldir==1)
	DIR0=1;
	else if(seldir==0)
	DIR=0;
	//走脉冲数
	for(;pulnum>0;pulnum--)
	{
    
    
		PUL0=1;
		msleep(selvel);
		PUL0=0;
		msleep(selvel)
	}
	
}

En pin_config.h, configure el mapeo de puertos;
en main, c, configure el modo de puerto y utilícelo donde sea necesario

MoveStepper1 (0,100,1);
// El primer parámetro es la dirección, que puede ser 0 o 1;
// El segundo parámetro es el número de pulsos, mayor que 0;
// El tercer parámetro es la velocidad en milisegundos,

El ejemplo anterior es el número de impulsos, que realmente se necesita para ir milímetros, lo que vamos a modificarlo;
en main.c, los define macro una relación de, por ejemplo, si 1000 impulsos son de 1 mm; a continuación, la relación es de 1000; en
principal .C:

#define KPULMM 1000
//头文件和c文件要设置端口和端口模式。
void MoveStepper1(unsigned char seldir,unsigned int mm0,unsigned int selvel)
{
    
    
unsigned int pul0=0;
//判断方向
	if(seldir==1)
	DIR0=1;
	else if(seldir==0)
	DIR=0;
//将毫米转换成脉冲
pul0=mm0*KPULMM;//假如mm0=10,那么计算得到pul0=10*1000=10000个脉冲
	//走脉冲数
	for(;pulnum>0;pulnum--)
	{
    
    
		PUL0=1;
		msleep(selvel);
		PUL0=0;
		msleep(selvel)
	}
	
}

Lo anterior es la explicación principal.

Requisitos de la competencia:

En la placa de desarrollo 210, debido a que no hay demasiados puertos IO, usamos el botón de marcación y el botón BOO0 como control del motor. No necesitamos este botón. Usaremos la pantalla táctil de la pantalla serial para realizar el botón función.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Dos motores paso a paso
DIR0 ------- (hardware IO) IO1 -------------------- mapeo de software
PUL0 -------- IO2
DIR1- -------- IO3
PUL1 --------- IO16
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
En main.c;
configure el mapeo de puertos de estos puertos del motor paso a paso;
configure el modo de puerto del motor paso a paso y
luego habilítelo en 1 o 0.
pin_config.h

/**
* @par  Copyright (C): 2016-2022, Shenzhen Yahboom Tech
* @file         pin_config.c
* @author       Gengyue
* @version      V1.0
* @date         2020.05.27
* @brief        硬件引脚与软件GPIO的宏定义
* @details      
* @par History  见如下说明
*                 
* version:	由于K210使用fpioa现场可编程IO阵列,允许用户将255个内部功能映射到芯片外围的48个自由IO上
*           所以把硬件IO和软件GPIO功能抽出来单独设置,这样更容易理解。
*/
#ifndef _PIN_CONFIG_H_
#define _PIN_CONFIG_H_
/*****************************HEAR-FILE************************************/
#include "fpioa.h"

/*****************************HARDWARE-PIN*********************************/
// 硬件IO口,与原理图对应
#define PIN_LED_0             (0)   //LED灯
#define PIN_LED_1             (17)

#define PIN_LJT_0             (18)  //垃圾桶LJT
#define PIN_LJT_1             (19)
#define PIN_LJT_2             (20)
#define PIN_LJT_3             (21)
#define PIN_LJT_4             (22)
#define PIN_LJT_5             (23)

#define PIN_DIR_0             (1)  //传送步进电机0方向  IO12是普通IO
#define PIN_PUL_0             (2)   //传送步进电机0脉冲输出  普通IO
#define PIN_DIR_1             (3)   //传送步进电机1方向   
#define PIN_PUL_1             (16)   //传送步进电机1脉冲输出

/*****************************SOFTWARE-GPIO********************************/
// 软件GPIO口,与程序对应
#define LED0_GPIONUM          (0)
#define LED1_GPIONUM          (1)

#define LJT0_GPIONUM          (2)
#define LJT1_GPIONUM          (3)
#define LJT2_GPIONUM          (4)
#define LJT3_GPIONUM          (5)
#define LJT4_GPIONUM          (6)
#define LJT5_GPIONUM          (7)

#define StepDir0_GPIONUM       (8)
#define StepPul0_GPIONUM       (9)
#define StepDir1_GPIONUM       (10)
#define StepPul1_GPIONUM       (11)
/*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口
#define FUNC_LED0             (FUNC_GPIO0 + LED0_GPIONUM)
#define FUNC_LED1             (FUNC_GPIO0 + LED1_GPIONUM)
//IO口18--23对应HS高速口,看芯片手册的引脚定义表
#define FUNC_LJT0             (FUNC_GPIOHS0 + LJT0_GPIONUM)
#define FUNC_LJT1             (FUNC_GPIOHS0 + LJT1_GPIONUM)
#define FUNC_LJT2             (FUNC_GPIOHS0 + LJT2_GPIONUM)
#define FUNC_LJT3             (FUNC_GPIOHS0 + LJT3_GPIONUM)
#define FUNC_LJT4             (FUNC_GPIOHS0 + LJT4_GPIONUM)
#define FUNC_LJT5             (FUNC_GPIOHS0 + LJT5_GPIONUM)

#define FUNC_DIR0             (FUNC_GPIOHS0 + StepDir0_GPIONUM)
#define FUNC_PUL0             (FUNC_GPIOHS0 + StepPul0_GPIONUM)
#define FUNC_DIR1             (FUNC_GPIOHS0 + StepDir1_GPIONUM)
#define FUNC_PUL1             (FUNC_GPIOHS0 + StepPul1_GPIONUM)
#endif /* _PIN_CONFIG_H_ */

C Principal

//IO18---IO23,普通IO口,输入状态,判断是不是0,是0,说明垃圾满
#include <stdio.h>
#include <unistd.h>
#include "gpio.h"
#include "gpiohs.h"
#include "pin_config.h"
#include "sleep.h"
#include "sysctl.h"
#include "plic.h"
//cmake .. -DPROJ=keypad -G "MinGW Makefiles" 

#define xmmpul 2   //1000个脉冲,是1mm,测试可以修改
/**
* Function       hardware_init
* @author        Gengyue
* @date          2020.05.27
* @brief         硬件初始化,绑定GPIO口
* @param[in]     void
* @param[out]    void
* @retval        void
* @par History   无
*/
void hardware_init(void)
{
    
    
    fpioa_set_function(PIN_LED_0, FUNC_LED0);
    fpioa_set_function(PIN_LED_1, FUNC_LED1);

    fpioa_set_function(PIN_LJT_0, FUNC_LJT0);
    fpioa_set_function(PIN_LJT_1, FUNC_LJT1);
    fpioa_set_function(PIN_LJT_2, FUNC_LJT2);
    fpioa_set_function(PIN_LJT_3, FUNC_LJT3);
    fpioa_set_function(PIN_LJT_4, FUNC_LJT4);
    fpioa_set_function(PIN_LJT_5, FUNC_LJT5);

  fpioa_set_function(PIN_DIR_0, FUNC_DIR0);
    fpioa_set_function(PIN_PUL_0, FUNC_PUL0);
    fpioa_set_function(PIN_DIR_1, FUNC_DIR1);
     fpioa_set_function(PIN_PUL_1, FUNC_PUL1);

}
//步进电机运动函数,因为电机的步距角不一样
void movestepper0(int seldir ,uint32_t mm0; int vms)  //1mm----pul个脉冲
{
    
    
    uint64_t i;
    //和51单片机不一样,这个是GPIO_PV_HIGH代表高电平
    gpio_pin_value_t valuetemp = GPIO_PV_HIGH;

    gpio_pin_value_t valuehigh = GPIO_PV_HIGH;
    gpio_pin_value_t valuelow = GPIO_PV_LOW;
    //判断方向
    if(seldir==1)
    {
    
    
        valuetemp = GPIO_PV_HIGH;
    } 
    else if(seldir==0)
    {
    
    
        valuetemp = GPIO_PV_LOW;
    }
    //设置方向
   //用的是高速IO端口模式,所以是gpiohs
    gpiohs_set_pin(StepDir0_GPIONUM, valuetemp);  
    //根据mm,计算脉冲数
    for(i=0;i<mm0*xmmpul;i++)
    {
    
    
        gpiohs_set_pin(StepPul0_GPIONUM, valuehigh);
        msleep(vms);//
    
        gpiohs_set_pin(StepPul0_GPIONUM, valuelow);
        msleep(vms);//

    }

}
/**
* Function       main
* @author        Gengyue
* @date          2020.05.27
* @brief         主函数,程序的入口
* @param[in]     void
* @param[out]    void
* @retval        0
* @par History   无
*/
int main(void)
{
    
    
    int i=0;
    hardware_init();// 硬件引脚初始化

    gpio_init();    // 使能GPIO的时钟
    // 设置LED0和LED1的GPIO模式为输出
    gpio_set_drive_mode(LED0_GPIONUM, GPIO_DM_OUTPUT);
    gpio_set_drive_mode(LED1_GPIONUM, GPIO_DM_OUTPUT);  
    // 先关闭LED0和LED1
    gpio_pin_value_t value = GPIO_PV_HIGH;
    gpio_set_pin(LED0_GPIONUM, value);
    gpio_set_pin(LED1_GPIONUM, value);
    // 设置垃圾桶的传感器的GPIO模式为上拉输入
    gpiohs_set_drive_mode(LJT0_GPIONUM, GPIO_DM_INPUT_PULL_UP);
    gpiohs_set_drive_mode(LJT1_GPIONUM, GPIO_DM_INPUT_PULL_UP);
    gpiohs_set_drive_mode(LJT2_GPIONUM, GPIO_DM_INPUT_PULL_UP);
    gpiohs_set_drive_mode(LJT3_GPIONUM, GPIO_DM_INPUT_PULL_UP);
    gpiohs_set_drive_mode(LJT4_GPIONUM, GPIO_DM_INPUT_PULL_UP);
    gpiohs_set_drive_mode(LJT5_GPIONUM, GPIO_DM_INPUT_PULL_UP);
    //设置步进电机的方向和脉冲引脚是输出模式
    gpiohs_set_drive_mode(StepDir0_GPIONUM, GPIO_DM_OUTPUT);
    gpiohs_set_drive_mode(StepPul0_GPIONUM, GPIO_DM_OUTPUT);
    gpiohs_set_drive_mode(StepDir1_GPIONUM, GPIO_DM_OUTPUT);
    gpiohs_set_drive_mode(StepPul1_GPIONUM, GPIO_DM_OUTPUT);

    while (1)
    {
    
    
       //查询几个GPIO垃圾桶,返回传感器..参考keypad的案例代码
       gpio_pin_value_t state_LJT0 =  gpiohs_get_pin(LJT0_GPIONUM);
       gpio_pin_value_t state_LJT1 =  gpiohs_get_pin(LJT1_GPIONUM);
       gpio_pin_value_t state_LJT2 =  gpiohs_get_pin(LJT2_GPIONUM);
       gpio_pin_value_t state_LJT3 =  gpiohs_get_pin(LJT3_GPIONUM);
       gpio_pin_value_t state_LJT4 =  gpiohs_get_pin(LJT4_GPIONUM);
       gpio_pin_value_t state_LJT5 =  gpiohs_get_pin(LJT5_GPIONUM);
       //gpio_pin_value_t value = GPIO_PV_HIGH; GPIO_PV_LOW
       //LED 低电平亮,高电平不亮
       if(!state_LJT0)
              {
    
    
              //    gpio_set_pin(LED0_GPIONUM, GPIO_PV_LOW);
                  gpio_set_pin(LED1_GPIONUM, GPIO_PV_LOW);
              }
        if(!state_LJT1)
              {
    
    
                //  gpio_set_pin(LED0_GPIONUM, GPIO_PV_LOW);
                  gpio_set_pin(LED1_GPIONUM, GPIO_PV_HIGH);
              }
        if(!state_LJT2)
              {
    
    
                  //gpio_set_pin(LED0_GPIONUM, GPIO_PV_HIGH);
                  gpio_set_pin(LED1_GPIONUM, GPIO_PV_LOW);
              }
        if(!state_LJT3)
              {
    
    
                 // gpio_set_pin(LED0_GPIONUM, GPIO_PV_HIGH);
                  gpio_set_pin(LED1_GPIONUM, GPIO_PV_HIGH);
              }

         //步进电机测试,正方向,两个电机都走100000个脉冲
        gpiohs_set_pin(StepDir0_GPIONUM, GPIO_PV_HIGH);  
        gpiohs_set_pin(StepDir1_GPIONUM, GPIO_PV_HIGH);
        for(i=0;i<100000;i++)
       {
    
    
        gpiohs_set_pin(StepPul0_GPIONUM, GPIO_PV_HIGH);    
        gpiohs_set_pin(StepPul1_GPIONUM, GPIO_PV_HIGH);
        msleep(1);//5000
        gpiohs_set_pin(StepPul0_GPIONUM, GPIO_PV_LOW); 
        gpiohs_set_pin(StepPul1_GPIONUM, GPIO_PV_LOW);
        msleep(1);//5000
       }
       sleep(10);  
         //步进电机测试,反方向,两个电机都走100000个脉冲
        gpiohs_set_pin(StepDir0_GPIONUM, GPIO_PV_LOW);
        gpiohs_set_pin(StepDir1_GPIONUM, GPIO_PV_LOW);
        //步进电机测试,正方向,两个电机都走100000个脉冲
        for(i=0;i<100000;i++)
       {
    
    
        gpiohs_set_pin(StepPul0_GPIONUM, GPIO_PV_HIGH);    
        gpiohs_set_pin(StepPul1_GPIONUM, GPIO_PV_HIGH);
        msleep(1);//5000
        gpiohs_set_pin(StepPul0_GPIONUM, GPIO_PV_LOW);
        gpiohs_set_pin(StepPul1_GPIONUM, GPIO_PV_LOW);
        msleep(1);//5000
       }
       sleep(10);  
        movestepper0(0,100; 1)  //0方向,100个mm,速度是1ms
        sleep(10);
        movestepper0(1,100; 1)  //0方向,100个mm,速度是1ms
        sleep(10);  

    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/lmf666/article/details/111185566
Recomendado
Clasificación