210例2:IOポートステッピングモーターのパルス生成

1.実験の目的

IOポートを使用して、
ステッピングモーターのパルス出力と方向制御をシミュレートします。1。2つのステッピングモーターがあります。

各ステッピングモーターは、制御するために2本のワイヤーを必要とします。
**方向制御:** 1本のワイヤーがDIR、方向、DIR = 0、正回転、DIR = 1、逆方向を
制御します。**距離と速度の制御:** 1本のルートラインPUL制御パルス、パルスが付属し、ステップ角、通常1.8度を歩き、ドライバーのDIPスイッチ設定を参照し、ドライバーの詳細情報を参照します。パルス周波数が高いほど、速度が速くなります。
したがって、PULの数を制御することで、距離と角度を制御できます。PULの周波数を制御すると、ステッピングモーターの速度を制御できます。
ここでは、速度要件が高くないため、タイマーの代わりに遅延を使用して制御します。パルスを生成します。
PULを制御するIOポートがある場合は、この
ように100パルス進み、次に100パルス戻るように書くことができます。実際の伝送比などに応じて、mmは100パルスになります。

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);
}

最初のステッピングモーターが方向と距離の動きを指定できることを実現するために、変換を行って関数を作成しましょう。

//头文件和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)
	}
	
}

pin_config.hで、ポートマッピングを設定します。main、
cで、ポートモードを設定し、必要に応じて使用します。

MoveStepper1(0,100,1);
//最初のパラメーターは方向であり、0または1にすることができます;
// 2番目のパラメーターは0より大きいパルス数です;
// 3番目のパラメーターはミリ秒単位の速度です。

我々はそれを修正するように、上記の例では、パルスの数であり、我々は、実際に、ミリメートルを移動する必要があり、
main.cの中で、マクロ定義の比率を、例えば、1000個のパルスが1ミリメートルである場合、次に比が1000で、で
主.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)
	}
	
}

以上が主な説明です。

競争要件:

210開発ボードでは、IOポートが少なすぎるため、モーター制御としてダイヤルボタンとBOO0ボタンを使用します。このボタンは必要ありません。シリアル画面のタッチスクリーンを使用してボタンを実現します。関数。
ここに画像の説明を挿入
ここに画像の説明を挿入

2つのステッピングモーター
DIR0 -------(ハードウェアIO)IO1 --------------------ソフトウェアマッピング
PUL0 -------- IO2
DIR1- -------- IO3
PUL1 --------- IO16
ここに画像の説明を挿入

ここに画像の説明を挿入
main.cで、
これらのステッピングモーターポートのポートマッピングを
設定します。ステッピングモーターのポートモードを設定し
てから、1または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_ */

main.c

//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;
}

おすすめ

転載: blog.csdn.net/lmf666/article/details/111185566