/* $Revision: 1.0 $ $Date: 2012/07/11 09:05:06 $ */
/* daadvpci1710.c - xPC Target, non-inlined S-function driver for Advantech PCI-1710 D/A section */
/* Copyright 1996-2012 The MathWorks, Inc.
*/
#define S_FUNCTION_LEVEL 2
#undef S_FUNCTION_NAME
#define S_FUNCTION_NAME aoadvpci1710
#include <stddef.h>
#include <stdlib.h>
#include <math.h>
#include "simstruc.h"
#ifdef MATLAB_MEX_FILE
#include "mex.h"
#else
#include <windows.h>
#include "io_xpcimport.h"
#endif
/* Input Arguments */
#define NUM_PARAMS (3)
#define CHANNEL_ARG (ssGetSFcnParam(S,0))
#define RANGE_ARG (ssGetSFcnParam(S,1))
#define SAMPLE_TIME_PARAM (ssGetSFcnParam(S,2))
/* Convert S Function Parameters to Varibles */
#define BASE (0xD500)
#define SAMPLE_TIME ((real_T) mxGetPr(SAMPLE_TIME_PARAM)[0])
#define SAMPLE_OFFSET ((real_T) mxGetPr(SAMPLE_TIME_PARAM)[1])
static char_T msg[256];
#ifndef MATLAB_MEX_FILE
static void DA_Output(SimStruct *S, uint_T channel, real_T value, real_T range) /* 这个是子函数,作用是将用户的输入值(范围为0到10)对应转化为12位数字 */
{
real_T out;
out=4096*value/range; /* 数字量(比如2v)转化为对应【0,4096】的值 */
out=max(out,0);
out=min(out,4095);
out=floor(out+0.5); /* 转化对应值精度为+-0.5。floor为向下取整 */
rl32eOutpW((unsigned short)(BASE+10+2*channel),(unsigned short)out&0x0fff);
/* printf("%d ", data); */
}
#endif
static void mdlCheckParameters(SimStruct *S)
{
}
static void mdlInitializeSizes(SimStruct *S)
{
uint_T i;
#ifndef MATLAB_MEX_FILE
#include "io_xpcimport.c"
#endif
ssSetNumSFcnParams(S, NUM_PARAMS); /* 设置用户参数个数为4 */
if (ssGetNumSFcnParams(S) == ssGetSFcnParamsCount(S)) { /* 检查用户参数个数和用户参数前面板输入个数是否一致,如果一致,则检查参数是否有错误,有错误则退出。无错误执行下面程序 */
mdlCheckParameters(S);
if (ssGetErrorStatus(S) != NULL) {
return;
}
} else {
return; /* Parameter mismatch will be reported by Simulink */
}
ssSetNumContStates(S, 0);
ssSetNumDiscStates(S, 0);
if (!ssSetNumInputPorts(S, (mxGetNumberOfElements(CHANNEL_ARG)))) return; /*(mxGetNumberOfElements(CHANNEL_ARG))指获得输入通道中个数,这句话意思是如果输入通道个数为0,则退出*/
for (i=0;i<mxGetNumberOfElements(CHANNEL_ARG);i++) { /*初始化sizes结构:设置每个通道的宽度为1,设置有反馈,这对于D/A模块非常重要,表示输出由某一个端口的输入值直接控制。而A/D模块没有直馈通道,不用设置*/
ssSetInputPortWidth(S, i, 1);
ssSetInputPortDirectFeedThrough(S, i, 1);
}
if (!ssSetNumOutputPorts(S, 0)) return; /*设置如果输出通道不为0,则退出。因为D/A只有输入,没有输出*/
ssSetNumSampleTimes(S, 1); /*设置采样时间*/
ssSetSFcnParamNotTunable(S,0); /*设置参数在仿真期间不可改变*/
ssSetSFcnParamNotTunable(S,1);
ssSetSFcnParamNotTunable(S,2);
ssSetOptions(S, SS_OPTION_DISALLOW_CONSTANT_SAMPLE_TIME | SS_OPTION_EXCEPTION_FREE_CODE| SS_OPTION_PLACE_ASAP);
}
static void mdlInitializeSampleTimes(SimStruct *S) /*设置采样时间*/
{
ssSetSampleTime(S, 0, SAMPLE_TIME);
ssSetOffsetTime(S, 0, SAMPLE_OFFSET);
}
#define MDL_START
static void mdlStart(SimStruct *S)
{
#ifndef MATLAB_MEX_FILE
uint8_T i,temp = 0;
/* set channel range */
for (i=0;i<mxGetNumberOfElements(CHANNEL_ARG);i++)
{
switch ((int_T)mxGetPr(RANGE_ARG)[i])
{
case 5 : break;
case 10:
temp |= 1 << (2*(uint_T)mxGetPr(CHANNEL_ARG)[i]-2);
break;
}
}
/* printf("range regester value:%x\n",temp); */
/* printf("base address:%x\n",BASE); */
rl32eOutpB((unsigned short)(BASE+14),temp);
/* Set initial outputs to zero */
for (i=0;i<mxGetNumberOfElements(CHANNEL_ARG);i++) { /*调用子函数DA_Output,使D/A转换开始时输出0*/
DA_Output(S,(uint_T)mxGetPr(CHANNEL_ARG)[i]-1, 0.0, mxGetPr(RANGE_ARG)[i]);
}
#endif /* MATLAB_MEX_FILE */
}
static void mdlOutputs(SimStruct *S, int_T tid)
{
#ifndef MATLAB_MEX_FILE
InputRealPtrsType uPtrs;
uint_T i;
for (i=0;i<mxGetNumberOfElements(CHANNEL_ARG);i++) {
uPtrs = ssGetInputPortRealSignalPtrs(S,i); /*读进S函数输入值*/
DA_Output(S,(uint_T)mxGetPr(CHANNEL_ARG)[i]-1, *uPtrs[0], mxGetPr(RANGE_ARG)[i]); /*调用DA_Output函数,实行转换*/
}
#endif /* MATLAB_MEX_FILE */
}
static void mdlTerminate(SimStruct *S)
{
#ifndef MATLAB_MEX_FILE
uint_T i;
/* Set final outputs to zero 调用子函数DA_Output,使D/A转换开始时输出0。在mdlTerminate中通常只用在D/A设备中,(A/D,D/D设备通常将该设置体设置为空),将模拟输出设置为0*/
for (i=0;i < mxGetNumberOfElements(CHANNEL_ARG);i++) {
DA_Output(S, (uint_T)mxGetPr(CHANNEL_ARG)[i]-1, 0.0, mxGetPr(RANGE_ARG)[i]);
}
#endif /* MATLAB_MEX_FILE */
}
#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */
#include "simulink.c" /* MEX-file interface mechanism */
#else
#include "cg_sfun.h" /* Code generation registration function */
#endif
没有合适的资源?快使用搜索试试~ 我知道了~
DA_Advantech_PCI1710
共2个文件
mexw32:1个
c:1个
需积分: 12 16 下载量 185 浏览量
2018-05-22
10:54:17
上传
评论 1
收藏 8KB RAR 举报
温馨提示
C语言写的研华PCI-1710板卡的DA驱动,matlab编译后即可用于simulink s-function。 (Advantech PCI-1710 board DA driver written in C language driver, it can be used for simulink s-function after compilering in matlab.)
资源推荐
资源详情
资源评论
收起资源包目录
7075439DA_Advantech_PCI1710.rar (2个子文件)
DA_Advantech_PCI1710
aoadvpci1710.mexw32 13KB
aoadvpci1710.c 5KB
共 2 条
- 1
资源评论
qq_41542121
- 粉丝: 6
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功