NI-Motion如何控制运动控制器上轴速度,通过读取模拟数字转换器(ADC)的值来动态调整速度C语言示例代码

这个C程序是一个用于控制运动控制器上轴速度的示例,它通过读取模拟数字转换器(ADC)的值来动态调整速度。程序的主要功能和执行逻辑如下:

  1. 初始化和配置:程序首先定义了一些变量,包括板卡ID、轴号、通信状态寄存器、常数乘数以及错误处理相关的变量。

  2. 设置板卡和轴:程序设置了板卡ID和轴号,并定义了一个常数,用于将ADC值转换为速度。

  3. 板上变量初始化:程序初始化了两个板上变量,一个是用于存储常数的变量1,另一个是用于存储计算结果的变量4。

  4. 程序存储:程序开始存储一个板上程序,设置了轴的操作模式为速度,并插入了一个标签,用于后续的跳转。

  5. 读取ADC值:程序读取ADC通道的值,并将其存储在变量2中。

  6. 计算速度:程序将变量2中的ADC值与常数相乘,得到一个新的速度值,并将这个值存储在变量3中。

  7. 条件设置和跳转:程序通过一个减法操作设置了一个条件,用于后续的跳转判断。如果变量3和变量4的值相等(即条件为零),程序将跳转到标签1。

  8. 设置和启动移动:程序使用变量3中的速度值设置轴的速度,并启动移动。

  9. 保存和循环:程序将变量3的值保存到变量4中,以便在下一个周期使用,并无条件跳转回标签1,形成一个循环。

  10. 错误处理:在整个过程中,程序会检查是否有错误发生。如果有模态错误,程序会从错误堆栈中获取错误信息并显示。如果有其他错误,程序会显示常规错误信息。

///
// 要求: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"  // 包含FlexMotion库
#include "NIMCExample.h"  // 包含NIMC示例代码
#include <stdio.h>  // 包含标准输入输出库
#include <stdlib.h>  // 包含标准库

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

	u8	boardID;					// 板卡识别号
	u8	axis;						// 轴号
	u16 csr	= 0;				// 通信状态寄存器
	i32 constant;				// 常数乘数

	// 模态错误处理的变量
	u16 commandID;				// 函数的commandID
	u16 resourceID;			// 资源ID
	i32 errorCode;				// 错误代码

	///
	// 设置板卡ID
	boardID= 1;
	// 设置轴号
	axis = 1;
	// 将ADC读取值乘以该常数以计算所需的速度
	constant = 10;
	

	// 将板上变量4初始化为0
	err = flex_load_var(boardID, 0, 4);
	CheckError;

	// 将板上变量1初始化为常数乘数
	err = flex_load_var(boardID, constant, 1);
	CheckError;

	// 开始板上程序存储 - 程序编号1
	err = flex_begin_store(boardID, 1);

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

	// 插入标签编号1
	err = flex_insert_program_label(boardID, 1);
	CheckError;

	// 读取ADC通道并将ADC值存储在变量2中
	err = flex_read_adc(boardID, NIMC_ADC1, 2);
	CheckError;

	// 将变量2(即ADC值)与变量1(即常数)相乘
	// 将结果保存在变量3中
	err = flex_mult_vars(boardID, 1, 2, 3);
	CheckError;

	// 从变量4中减去变量3的值
	// 我们对结果不感兴趣 - 只是想
	// 在板上设置条件。
	err = flex_sub_vars(boardID, 3, 4, 0);
	CheckError;

	// 由于上述减法设置了条件
	// 为“等于零”,这意味着变量
	// 3和4的值是相同的
	err =  flex_jump_label_on_condition (boardID, 0, NIMC_CONDITION_EQUAL, 0,  0, NIMC_MATCH_ALL, 1/*标签编号*/);


	// 通过从变量3加载值(即adc值*常数)
	// 设置移动的速度(以计数/秒为单位)
	err = flex_load_velocity(boardID, axis
  • 16
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

openwin_top

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

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

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

打赏作者

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

抵扣说明:

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

余额充值