程序的功能是控制一个电机,使其通过监测一个模拟数字转换器(ADC)通道来施加一个恒定的力矩。这个程序是为使用National Instruments的FlexMotion软件的硬件平台编写的。下面是程序的详细解读和执行逻辑:
-
初始化变量:程序首先定义了一些变量,包括板卡ID、轴号、通信状态寄存器、轴状态、恒定力矩、ADC值以及错误处理相关的变量。
-
设置电机参数:程序设置了电机的移动速度、加速度、减速度和急动(s-curve值),并将操作模式设置为相对位置模式。
-
循环控制:程序进入一个循环,不断地监测ADC通道的值,并根据这个值来调整电机的位置,以保持一个恒定的力矩。
-
读取ADC值:程序读取ADC通道1的值,并计算出需要更新的位置。
-
调整电机位置:如果计算出的恒定力矩与当前ADC值存在差异,程序将更新电机的目标位置,并启动电机移动。
-
检查状态:程序检查电机的移动完成状态、跟随错误和轴关闭状态。
-
错误处理:程序读取通信状态寄存器,检查是否有模态错误。如果有模态错误,程序将从错误堆栈中获取错误信息并显示。
-
循环继续或退出:如果轴没有关闭,程序将继续循环;如果轴关闭了,程序将退出。
///
// 需求: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软件库的调用,以及对错误处理的实现。
程序执行流程图: