NI-Motion如何控制一个电机,使其通过监测一个模拟数字转换器(ADC)通道来施加一个恒定的力矩。C语言的代码示例

这个流程图展示了程序从开始到结束的主要执行步骤,包括初始化、设置参数、循环控制、读取ADC值、更新电机位置、检查状态、处理错误等。:程序首先定义了一些变量,包括板卡ID、轴号、通信状态寄存器、轴状态、恒定力矩、ADC值以及错误处理相关的变量。:程序进入一个循环,不断地监测ADC通道的值,并根据这个值来调整电机的位置,以保持一个恒定的力矩。:如果计算出的恒定力矩与当前ADC值存在差异,程序将更新电机的目标位置,并启动电机移动。如果轴关闭了,程序将退出。:程序读取ADC通道1的值,并计算出需要更新的位置。
摘要由CSDN通过智能技术生成

程序的功能是控制一个电机,使其通过监测一个模拟数字转换器(ADC)通道来施加一个恒定的力矩。这个程序是为使用National Instruments的FlexMotion软件的硬件平台编写的。下面是程序的详细解读和执行逻辑:

  1. 初始化变量:程序首先定义了一些变量,包括板卡ID、轴号、通信状态寄存器、轴状态、恒定力矩、ADC值以及错误处理相关的变量。

  2. 设置电机参数:程序设置了电机的移动速度、加速度、减速度和急动(s-curve值),并将操作模式设置为相对位置模式。

  3. 循环控制:程序进入一个循环,不断地监测ADC通道的值,并根据这个值来调整电机的位置,以保持一个恒定的力矩。

  4. 读取ADC值:程序读取ADC通道1的值,并计算出需要更新的位置。

  5. 调整电机位置:如果计算出的恒定力矩与当前ADC值存在差异,程序将更新电机的目标位置,并启动电机移动。

  6. 检查状态:程序检查电机的移动完成状态、跟随错误和轴关闭状态。

  7. 错误处理:程序读取通信状态寄存器,检查是否有模态错误。如果有模态错误,程序将从错误堆栈中获取错误信息并显示。

  8. 循环继续或退出:如果轴没有关闭,程序将继续循环;如果轴关闭了,程序将退出。

///
// 需求:FlexMotion软件版本5或更高版本。
//
//		使用导入库:
//			<NI-Motion 安装位置>\FlexMotion\lib\Microsoft\FlexMS32.lib
//			对于MS编译器,以及
//			<NI-Motion 安装位置>\FlexMotion\lib\Borland\FlexBC32.lib
//			对于BC编译器
//
//		在您的项目包含目录中添加包含路径:
//			<NI-Motion 安装位置>\FlexMotion\Include
//			<NI-Motion 安装位置>\FlexMotion\Examples\C\Includes
//
//		将常见源代码添加到您的项目中:
//			<NI-Motion 安装位置>\FlexMotion\Examples\C\Includes\NIMCExample.c
//
//		其中 <NI-Motion 安装位置> 默认是
//			<驱动器>\Program Files\National Instruments\NI-Motion
//			对于32位Windows
//			<驱动器>\Program Files (x86)\National Instruments\NI-Motion
//			对于64位Windows
//
// 描述:
//		这个C示例演示了监测ADC通道并移动电机以施加恒定力矩的方法
//
///


// 包含///
#include "flexmotn.h"
#include "NIMCExample.h"
#include <stdio.h>
#include <stdlib.h>

//
// 主函数
void main(void)
{

	u8	boardID;					// 板卡识别号
	u8	axis;						// 轴号
	u16 csr	= 0;				// 通信状态寄存器
	u16 axisStatus;			// 轴状态
	i32 constant;				// 恒定力矩
	i16 adcValue;				// 读取的ADC值
	// 用于模态错误处理的变量
	u16 commandID;				// 函数的commandID
	u16 resourceID;			// 资源ID
	i32 errorCode;				// 错误代码


	///
	// 假设被移动的轴具有编码器
	// 映射为其主要反馈
	//-----------------------------------------------------------
	
	// 设置移动的速度(以计数/秒为单位)
	err = flex_load_velocity(boardID, axis, 10000, 0xFF);
	CheckError;

	// 设置移动的加速度(以计数/秒^2为单位)
	err = flex_load_acceleration(boardID, axis, NIMC_ACCELERATION, 100000, 0xFF);
	CheckError;

	// 设置移动的减速度(以计数/秒^2为单位)
	err = flex_load_acceleration(boardID, axis, NIMC_DECELERATION, 100000, 0xFF);
	CheckError;

	// 设置移动的急动(s-curve值)(以样本周期为单位)
	err = flex_load_scurve_time(boardID, axis, 100, 0xFF);
	CheckError;

	// 将操作模式设置为速度
	err = flex_set_op_mode(boardID, axis, NIMC_RELATIVE_POSITION);
	CheckError;

	do
{

	// 读取ADC通道1并计算要更新的位置
	err = flex_read_adc_rtn(boardID, NIMC_ADC1, &adcValue);
	CheckError;

	if( (constant - adcValue) != 0){

		err = flex_load_target_pos(boardID, axis, (constant - adcValue), 0xFF);
		CheckError;

		// 基于力矩差移动
		err =  flex_start(boardID, axis, 0);
		CheckError;


	}

	// 检查移动完成状态/跟随错误/轴关闭状态
	err = flex_read_axis_status_rtn(boardID, axis, &axisStatus);
	CheckError;

	// 读取通信状态寄存器并检查模态错误
	err = flex_read_csr_rtn(boardID, &csr);
	CheckError;

	// 检查模态错误
	if (csr & NIMC_MODAL_ERROR_MSG)
	{
		err = csr & NIMC_MODAL_ERROR_MSG;
		CheckError;
	}

	Sleep (50); //每10毫秒检查一次

} while (!(axisStatus & NIMC_AXIS_OFF_BIT)); //轴关闭时退出

	return;		// 退出应用程序


	/
	
	// 错误处理
	//
	nimcHandleError; //NIMCCATCHTHIS:

	// 检查是否有模态错误
	if (csr & NIMC_MODAL_ERROR_MSG){
		do{
			//从板卡上的错误堆栈中获取模态错误的命令ID、资源和错误代码
			flex_read_error_msg_rtn(boardID,&commandID,&resourceID,&errorCode);
			nimcDisplayError(errorCode,commandID,resourceID);

			//读取通信状态寄存器
			flex_read_csr_rtn(boardID,&csr);

		}while(csr & NIMC_MODAL_ERROR_MSG);
	}
	else		// 显示常规错误
		nimcDisplayError(err,0,0);
	return;		// 退出应用程序
}

这段代码是一个使用C语言编写的示例程序,用于演示如何通过监测ADC通道并移动电机来施加一个恒定的力矩。代码中包含了对FlexMotion软件库的调用,以及对错误处理的实现。

程序执行流程图:

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

openwin_top

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值