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