码迷,mamicode.com
首页 > Windows程序 > 详细

C#写电机驱动程序

时间:2015-11-07 23:20:46      阅读:335      评论:0      收藏:0      [点我收藏+]

标签:

前几天实验室做关于电机驱动的实验,用C#写的控制程序

程序如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using System.Windows.Forms;
10 using Sys;              //添加新的命名空间,PCI8620的命名空间
11 namespace WindowsFormsApplication3
12 {
13 public partial class Form1 : Form
14 {
15 IntPtr hDevice;
16 short DA;
17 double a;
18 byte[] ret = new byte[16];     //
19 public Form1()
20 {
21 InitializeComponent();
22 }
23 
24 private void button1_Click(object sender, EventArgs e)
25 {
26 hDevice = PCI8620.PCI8620_CreateDevice(0);
27 button1.Enabled = false;             //button1和button2的互锁
28 button2.Enabled = true;              //button1和button2的互锁
29 timer1.Enabled = true;
30 }
31 
32 private void button2_Click(object sender, EventArgs e)
33 {
34 PCI8620.PCI8620_ReleaseDevice(hDevice);
35 button1.Enabled = true;
36 button2.Enabled = false;
37 }
38 
39 private void button3_Click(object sender, EventArgs e)
40 {
41 PCI8620.PCI8620_WriteDeviceDA(hDevice, 0x04, DA, 0);
42 }
43 
44 private void button4_Click(object sender, EventArgs e)
45 {
46 PCI8620.PCI8620_WriteDeviceDA(hDevice, 0x04, 2048, 0);
47 }
48 
49 private void textBox1_TextChanged(object sender, EventArgs e)
50 {
51 a = Convert.ToDouble(textBox1.Text);
52 DA = (short)(a / 20.00 * 4096 + 2048.00);
53 }
54 
55 private void timer1_Tick(object sender, EventArgs e)
56 {
57 PCI8620.PCI8620_GetDeviceDI(hDevice, ret);
58 if(ret[7]==0)             //当电机驱动的直线行程模块到达左端的时候,有传感器把DA采集信号反馈到程序中,程序作出判断变向向右运动
59 {
60 a = Math.Abs(a);
61 DA = (short)(a / 20.00 * 4096 + 2048.00);
62 PCI8620.PCI8620_WriteDeviceDA(hDevice, 0x04, DA, 0);      //0x04在PCI8620中代表-10——10v的电压
63 }
64 if(ret[9]==0)           //同上,这是行程模模块到达右端的时候
65 {
66 a = -Math.Abs(a);
67 DA = (short)(a / 20.00 * 4096 + 2048.00);
68 PCI8620.PCI8620_WriteDeviceDA(hDevice, 0x04, DA, 0);
69 }
70 }
71 }
72 }

技术分享

把PCI8620.cs添加到程序中

打开PCI8620板卡后程序才会取得对电机的控制指令,关闭后不再控制电机

在这里输入电压应该在-10-10之间,在程序中定义了0x04,,

PCI8620.cs程序如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices ;

namespace Sys
{
    public partial class PCI8620
    {
        //#################### AD硬件参数PCI8620_PARA_AD定义 #####################
        // 用于AD采样的实际硬件参数
        public struct PCI8620_PARA_AD  
        {
            public Int32 ADMode;            // AD模式选择(连续/分组方式)
            public Int32 FirstChannel;      // 首通道[0,15]
            public Int32 LastChannel;       // 末通道[0,15],要求末通道必须大于或等于首通道
            public Int32 Frequency;         // 采集频率,单位为Hz, [31, 250000]
            public Int32 GroupInterval;     // 分组时的组间间隔(单位:微秒)[1, 419430]
            public Int32 LoopsOfGroup;        // 组内循环次数[1, 65535]
            public Int32 Gains;                // 增益设置
            public Int32 InputRange;        // 模拟量输入量程范围
            public Int32 TriggerMode;       // 触发模式选择
            public Int32 TriggerSource;        // 触发源选择
            public Int32 TrigLevelVolt;        // 触发电平(0~10000mV)
            public Int32 TriggerType;        // 触发类型
            public Int32 TriggerDir;        // 触发方向选择(正向/负向触发)
            public Int32 ClockSource;        // 时钟源选择(内/外时钟源)
            public Int32 bClockOutput;      // 允许时钟输出
            public Int32 GroundingMode;        // 接地模式
        }

        //***********************************************************
        // AD硬件参数PCI8620_PARA_AD中的ADMode所使用工作模式选项
        public const Int32 PCI8620_ADMODE_SEQUENCE        = 0x00; // 连续采样
        public const Int32 PCI8620_ADMODE_GROUP            = 0x01; // 分组采样

        //***********************************************************
        // AD硬件参数PCI8620_PARA_AD中的InputRange模拟量输入范围所使用的选项
        public const Int32 PCI8620_INPUT_N10000_P10000mV= 0x00; // ±10000mV
        public const Int32 PCI8620_INPUT_N5000_P5000mV    = 0x01; // ±5000mV
        public const Int32 PCI8620_INPUT_N2500_P2500mV    = 0x02; // ±2500mV
        public const Int32 PCI8620_INPUT_0_P10000mV        = 0x03; // 0~10000mV

        //***********************************************************
        // AD参数PCI8620_PARA_AD中的Gains使用的硬件增益选项
        public const Int32 PCI8620_GAINS_1MULT            = 0x00; // 1倍增益
        public const Int32 PCI8620_GAINS_2MULT            = 0x01; // 2倍增益
        public const Int32 PCI8620_GAINS_4MULT            = 0x02; // 4倍增益
        public const Int32 PCI8620_GAINS_8MULT            = 0x03; // 8倍增益

        //***********************************************************
        // AD硬件参数PCI8620_PARA_AD中的TriggerMode成员变量所使用触发模式选项
        public const Int32 PCI8620_TRIGMODE_SOFT        = 0x00; // 软件触发(属于内触发)
        public const Int32 PCI8620_TRIGMODE_POST        = 0x01; // 硬件触发(属于外触发)

        //***********************************************************
        // AD硬件参数PCI8620_PARA_AD中的TriggerSource触发源信号所使用的选项
        public const Int32 PCI8620_TRIGSRC_ATR            = 0x00; // 选择外部ATR作为触发源
        public const Int32 PCI8620_TRIGSRC_DTR            = 0x01; // 选择外部DTR作为触发源

        // AD硬件参数PCI8620_PARA_AD中的TriggerType触发类型所使用的选项
        public const Int32 PCI8620_TRIGTYPE_EDGE        = 0x00; // 边沿触发
        public const Int32 PCI8620_TRIGTYPE_PULSE        = 0x01; // 电平触发

        //***********************************************************
        // AD硬件参数PCI8620_PARA_AD中的TriggerDir触发方向所使用的选项
        public const Int32 PCI8620_TRIGDIR_NEGATIVE        = 0x00; // 负向触发(低电平/下降沿触发)
        public const Int32 PCI8620_TRIGDIR_POSITIVE        = 0x01; // 正向触发(高电平/上升沿触发)
        public const Int32 PCI8620_TRIGDIR_POSIT_NEGAT    = 0x02; // 正负向触发(高/低电平或上升/下降沿襦发)

        //***********************************************************
        // AD硬件参数PCI8620_PARA_AD中的ClockSource时钟源所使用的选项
        public const Int32 PCI8620_CLOCKSRC_IN            = 0x00; // 内部时钟
        public const Int32 PCI8620_CLOCKSRC_OUT            = 0x01; // 外部时钟

        // AD硬件参数PCI8620_PARA_AD中的bClockOutput成员变量所使用内部和外部时钟源选项
        public const Int32 PCI8620_CLOCKOUT_DISABLE        = 0x00; // 禁止本卡上的自带时钟向外输出
        public const Int32 PCI8620_CLOCKOUT_ENABLE        = 0x01; // 允许本卡上的自带时钟向外输出

        //***********************************************************
        // AD参数(PCI8620_PARA_AD)中的GroundingMode使用的模拟信号接地方式选项
        public const Int32 PCI8620_GNDMODE_SE            = 0x00;    // 单端方式(SE:Single end)
        public const Int32 PCI8620_GNDMODE_DI            = 0x01;    // 双端方式(DI:Differential)

        //*************************************************************************************
        // 用于AD采样的实际硬件参数
        public struct PCI8620_STATUS_AD     
        {
            public Int32  bNotEmpty;            // 板载FIFO存储器的非空标志,=TRUE非空, = FALSE 空
            public Int32  bHalf;                // 板载FIFO存储器的半满标志,=TRUE半满以上, = FALSE 半满以下
            public Int32  bOverflow;            // 板载FIFO存储器的溢出标志,= TRUE已发生溢出, = FALSE 未发生溢出
        }

        public const Int32 PCI8620_MAX_SEGMENT_COUNT = 64;
        public struct PCI8620_STATUS_DMA
        {
            public Int32 iCurSegmentID;            // 当前段缓冲ID,表示DMA正在传输的缓冲区段
            public Int32 bSegmentSts0;
            public Int32 bSegmentSts1;
            public Int32 bSegmentSts2;
            public Int32 bSegmentSts3;
            public Int32 bSegmentSts4;
            public Int32 bSegmentSts5;
            public Int32 bSegmentSts6;
            public Int32 bSegmentSts7;
            public Int32 bSegmentSts8;
            public Int32 bSegmentSts9;
            public Int32 bSegmentSts10;
            public Int32 bSegmentSts11;
            public Int32 bSegmentSts12;
            public Int32 bSegmentSts13;
            public Int32 bSegmentSts14;
            public Int32 bSegmentSts15;
            public Int32 bSegmentSts16;
            public Int32 bSegmentSts17;
            public Int32 bSegmentSts18;
            public Int32 bSegmentSts19;
            public Int32 bSegmentSts20;
            public Int32 bSegmentSts21;
            public Int32 bSegmentSts22;
            public Int32 bSegmentSts23;
            public Int32 bSegmentSts24;
            public Int32 bSegmentSts25;
            public Int32 bSegmentSts26;
            public Int32 bSegmentSts27;
            public Int32 bSegmentSts28;
            public Int32 bSegmentSts29;
            public Int32 bSegmentSts30;
            public Int32 bSegmentSts31;
            public Int32 bSegmentSts32;
            public Int32 bSegmentSts33;
            public Int32 bSegmentSts34;
            public Int32 bSegmentSts35;
            public Int32 bSegmentSts36;
            public Int32 bSegmentSts37;
            public Int32 bSegmentSts38;
            public Int32 bSegmentSts39;
            public Int32 bSegmentSts40;
            public Int32 bSegmentSts41;
            public Int32 bSegmentSts42;
            public Int32 bSegmentSts43;
            public Int32 bSegmentSts44;
            public Int32 bSegmentSts45;
            public Int32 bSegmentSts46;
            public Int32 bSegmentSts47;
            public Int32 bSegmentSts48;
            public Int32 bSegmentSts49;
            public Int32 bSegmentSts50;
            public Int32 bSegmentSts51;
            public Int32 bSegmentSts52;
            public Int32 bSegmentSts53;
            public Int32 bSegmentSts54;
            public Int32 bSegmentSts55;
            public Int32 bSegmentSts56;
            public Int32 bSegmentSts57;
            public Int32 bSegmentSts58;
            public Int32 bSegmentSts59;
            public Int32 bSegmentSts60;
            public Int32 bSegmentSts61;
            public Int32 bSegmentSts62;
            public Int32 bSegmentSts63;
            public Int32 bBufferOverflow;        // 返回溢出状态
        } 

        //***********************************************************
        // DA输出函数WriteDeviceDA的模拟量输出范围参数OutputRange所使用的选项
        public const Int32 PCI8620_OUTPUT_0_P5000mV            = 0x00;        // 0~5000mV
        public const Int32 PCI8620_OUTPUT_0_P10000mV        = 0x01;        // 0~10000mV
        public const Int32 PCI8620_OUTPUT_0_P10800mV        = 0x02;        // 0~10800mV
        public const Int32 PCI8620_OUTPUT_N5000_P5000mV        = 0x03;        // ±5000mV
        public const Int32 PCI8620_OUTPUT_N10000_P10000mV    = 0x04;        // ±10000mV
        public const Int32 PCI8620_OUTPUT_N10800_P10800mV    = 0x05;        // ±10800mV

        //***********************************************************
        // 用于计数器CNT的参数
        // 硬件参数ControlMode控制字模式选项
        public const Int32 PCI8620_GATEMODE_POSITIVE_0    = 0x00;        // COUNTER:GATE高电平时计数,低电平时停止计数,计数时重新写入初值,按初值计数
                                                            // 计数结束产生中断:写入初值开始计数时OUT开始为0,当计数到0时OUT为1

        public const Int32 PCI8620_GATEMODE_RISING_1    = 0x01;        // COUNTER:GATE上边沿触发计数,计数中出现GATE上升沿重新装入初值计数
                                                            // 可编程单拍脉冲:当写入初值时OUT为1,当开始计数时OUT为0,当计数到0时OUT再次为1

        public const Int32 PCI8620_GATEMODE_POSITIVE_2    = 0x02;        // COUNTER:GATE高电平时计数,低电平时停止计数,计数时重新写入初值,按初值计数
                                                            // 频率发生器:计数期间OUT为1,计数到0后输出一个周期的0,并重新装入计数值计数

        public const Int32 PCI8620_GATEMODE_POSITIVE_3    = 0x03;        // COUNTER:GATE高电平时计数,低电平时停止计数,计数时重新写入初值,按初值计数
                                                            // 方波发生器:计数期间OUT为1,计数到0后输出一个周期的0,并重新装入计数值计数

        public const Int32 PCI8620_GATEMODE_POSITIVE_4    = 0x04;        // COUNTER:GATE高电平时计数,低电平时停止计数,计数时重新写入初值,按初值计数
                                                            // 软件触发选通:写入初值OUT为1, 计数结束OUT输出一个周期低电平信号

        public const Int32 PCI8620_GATEMODE_RISING_5    = 0x05;        // COUNTER:GATE上边沿触发计数,计数中出现GATE上升沿重新装入初值计数
                                                            // 硬件触发选通:写入初值OUT为1, 计数结束OUT输出一个周期低电平信号

        //***********************************************************
        // CreateFileObject所用的文件操作方式控制字(可通过或指令实现多种方式并操作)
        public const Int32 PCI8620_modeRead                    = 0x0000;    // 只读文件方式
        public const Int32 PCI8620_modeWrite                = 0x0001;    // 只写文件方式
        public const Int32 PCI8620_modeReadWrite            = 0x0002;    // 既读又写文件方式
        public const Int32 PCI8620_modeCreate                = 0x1000;    // 如果文件不存可以创建该文件,如果存在,则重建此文件,并清0
        public const Int32 PCI8620_typeText                    = 0x4000;    // 以文本方式操作文件

  
        //######################## 常规通用函数 #################################
        // 适用于本设备的最基本操作
        [DllImport("PCI8620_64.DLL")]
        public static extern IntPtr  PCI8620_CreateDevice(Int32 DeviceID );            // 创建设备对象

        [DllImport("PCI8620_64.DLL")]
        public static extern IntPtr  PCI8620_CreateDeviceEx(Int32 DevicePhysID );   // 用物理号创建设备对象

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_GetDeviceCount(IntPtr hDevice);            // 取得设备总台数

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_GetDeviceCurrentID(IntPtr hDevice,        // 取得当前设备相应的ID号
                                                        ref Int32 DeviceLgcID, 
                                                        ref Int32 DevicePhysID);

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_ListDeviceDlg(IntPtr hDevice);            // 列表系统当中的所有的该PCI设备

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_ReleaseDevice(IntPtr hDevice);            // 关闭设备,禁止传输,且释放资源

        //####################### AD数据读取函数 #################################
        // 适于大多数普通用户,这些接口最简单、最快捷、最可靠,让用户不必知道设备
        // 低层复杂的硬件控制协议和繁多的软件控制编程,仅用下面的初始化设备和读取
        // AD数据两个函数便能轻松高效地实现高速、连续的数据采集
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_InitDeviceProAD(                                        // 初始化设备,当返回TRUE后,设备即刻开始传输.
                                                                IntPtr hDevice,                        // 设备对象
                                                                ref PCI8620_PARA_AD pADPara);        // 硬件参数, 它仅在此函数中决定硬件状态

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_StartDeviceProAD(                                        // 在初始化之后,启动设备
                                                                IntPtr hDevice);                    // 设备对象句柄


        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_ReadDeviceProAD_Npt(                                    // 用非空标志读取设备上的AD数据
                                                                IntPtr hDevice,                        // 设备句柄
                                                                UInt32[] ADBuffer,                // 将用于接受数据的用户缓冲区                                
                                                                UInt32 nReadSizeWords,                // 读入的数据长度
                                                                ref Int32 nRetSizeWords);            // 是否检测FIFO溢出状态(默认为不检测)

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_GetDevStatusProAD(
                                                                IntPtr hDevice,                        // 设备句柄
                                                                ref PCI8620_STATUS_AD pADStatus);    // AD状态
        ///////////////////////////////////////////////////////////////////////
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_ReadDeviceProAD_Half(                                    // FIFO半满读AD数据
                                                                IntPtr hDevice,                        // 设备句柄
                                                                UInt32[] ADBuffer,                // 将用于接受数据的用户缓冲区(该区必须开辟65536个字的空间)
                                                                Int32 nReadSizeWords,
                                                                ref Int32 nRetSizeWords);

        [DllImport("PCI8620_64.DLL")]                    
        public static extern Int32  PCI8620_StopDeviceProAD(                                        // 在启动设备之后,暂停设备
                                                                IntPtr hDevice);                    // 设备对象句柄

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_ReleaseDeviceProAD(                                        // 关闭AD设备,禁止传输,且释放资源
                                                                IntPtr hDevice);                    // 设备句柄

        //##################### AD数据读取函数(DMA方式)(上层用户函数) ###########################
        // AD直接内存(DMA)方式函数
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_InitDeviceDmaAD(                                        // 初始化设备,当返回TRUE后,设备即准备就绪.
                                                                IntPtr hDevice,                        // 设备对象,它由CreateDevice函数创建
                                                                IntPtr hDmaEvent,                    // DMA事件句柄,它由CreateSystemEvent创建
                                                                UInt32[,] ADBuffer,                    // 用户缓冲区,最好为两维数组
                                                                Int32 nReadSizeWords,                // 每次DMA时,用户从指定缓冲应读取的实际长度(要小于或等于nSegmentSizeWords)
                                                                Int32 nSegmentCount,                // 缓冲分段的数量,取值范围为2-64
                                                                Int32 nSegmentSizeWords,            // 缓冲区分段的段长(必须等于FIFO半满长度)
                                                                ref PCI8620_PARA_AD pADPara);        // 硬件参数, 它仅在此函数中决定硬件状态

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_StartDeviceDmaAD(IntPtr hDevice);                    // 设备对象句柄,它由CreateDevice函数创建

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_GetDevStatusDmaAD(                                        // 在AD采样过程中取得DMA的有关状态,返回值表示函数是否成功
                                                                IntPtr hDevice,                        // 设备句柄,它由CreateDevice函数创建
                                                                ref PCI8620_STATUS_DMA pDMAStatus); // 获得的DMA工作状态

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_SetDevStatusDmaAD(                                        // 在AD采样过程中设置DMA的有关状态,返回值表示函数是否成功
                                                                IntPtr hDevice,                        // 设备句柄,它由CreateDevice函数创建
                                                                Int32 iClrBufferID);                // 要清除的缓冲区ID,将其置为0

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_StopDeviceDmaAD(                                        // 在启动设备之后,暂停设备
                                                                IntPtr hDevice);                    // 设备对象句柄,它由CreateDevice函数创建

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_ReleaseDeviceDmaAD(                                        // 关闭AD设备,禁止传输,且释放资源
                                                                IntPtr hDevice);                    // 设备句柄,它由CreateDevice函数创建
     

           
        //################# AD的硬件参数操作函数 ########################
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_SaveParaAD(IntPtr hDevice,ref PCI8620_PARA_AD pADPara);

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_LoadParaAD(IntPtr hDevice, ref PCI8620_PARA_AD pADPara);

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_ResetParaAD(IntPtr hDevice, ref PCI8620_PARA_AD pADPara);

        //####################### DA数据输出函数 #################################
        // 适于大多数普通用户,这些接口最简单、最快捷、最可靠,让用户不必知道设备
        // 低层复杂的硬件控制协议和繁多的软件控制编程,仅用下面一个函数便能轻
        // 松实现高速、连续的DA数据输出

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_WriteDeviceDA(                                // 写DA数据
                                                            IntPtr hDevice,                // 设备对象句柄,它由CreateDevice函数创建
                                                            Int32 OutputRange,            // 输出量程,具体定义请参考上面的常量定义部分
                                                            Int16 nDAData,                // 输出的DA原始数据[0, 4095]
                                                            Int32 nDAChannel);            // DA输出通道[0, 3]    


        //####################### 计数器与定时器操作函数 #########################
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_SetDeviceCNT(                            // 设置计数器的初值
                                                            IntPtr hDevice,            // 设备对象句柄,它由CreateDevice函数创建
                                                            UInt32 ContrlMode,        // 计数器控制模式
                                                            UInt32 CNTVal,            // 计数初值, COUNTER: 计数初值,TIMER:延时初始脉冲宽度(16位)
                                                            UInt32 ulChannel);        // 宽度初值, COUNTER: 无效, TIMER:输出脉冲宽度(16位)

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_GetDeviceCNT(                            // 取得各路计数器的当前计数值
                                                            IntPtr hDevice,            // 设备对象句柄,它由CreateDevice函数创建
                                                            ref UInt32  pCNTVal,    // 返回计数值
                                                            UInt32 ulChannel);  // 返回宽度值

        
        //####################### 数字I/O输入输出函数 #################################
        // 用户可以使用WriteRegisterULong和ReadRegisterULong等函数直接控制寄存器进行I/O
        // 输入输出,但使用下面两个函数更省事,它不需要您关心寄存器分配和位操作等,而只
        // 需象VB等语言的属性操作那么简单地实现各开关量通道的控制。
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_SetDeviceDO(                    // 输出开关量状态
                                                            IntPtr hDevice, // 设备句柄                                        
                                                            Byte[] bDOSts);    // 开关状态

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_GetDeviceDI(                    // 取得开关量状态     
                                                            IntPtr hDevice,    // 设备句柄                                        
                                                            Byte[] bDISts);    // 开关状态    


        //################# 内存映射寄存器直接操作及读写函数 ########################
        // 适用于用户对本设备更直接、更特殊、更低层、更复杂的控制。比如根据特殊的
        // 控制对象需要特殊的控制流程和控制效率时,则用户可以使用这些接口予以实现。
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_GetDeviceBar(                            // 取得指定的指定设备寄存器组BAR地址
                                                            IntPtr hDevice,            // 设备对象句柄,它由CreateDevice函数创建
                                                            UInt32[] pulPCIBar);    // 返回PCI BAR所有地址,具体PCI BAR中有多少可用地址请看硬件说明书

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_GetDevVersion(                            // 取得指定的指定设备ID号的映射寄存器的线性基地址,返回设备总数
                                                            IntPtr hDevice,            // 设备对象句柄
                                                            ref UInt32 pulFmwVersion,    // 固件版本
                                                            ref UInt32 pulDriverVersion);    //  驱动版本


        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_WriteRegisterByte(                        // 往设备的映射寄存器空间指定端口写入单节字数据
                                                            IntPtr hDevice,            // 设备对象
                                                            UInt32 LinearAddr,        // 指定映射寄存器的线性基地址
                                                            UInt32 OffsetBytes,        // 相对于基地址的偏移位置
                                                            Byte Value);            // 往指定地址写入单字节数据(其地址由线性基地址和偏移位置决定)
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_WriteRegisterWord(                        // 写双字节数据(其余同上)
                                                            IntPtr hDevice, 
                                                            UInt32 LinearAddr, 
                                                            UInt32 OffsetBytes,  
                                                            UInt16 Value);
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_WriteRegisterULong(                // 写四节字数据(其余同上)
                                                            IntPtr hDevice, 
                                                            UInt32 LinearAddr, 
                                                            UInt32 OffsetBytes,  
                                                            UInt32 Value);
        [DllImport("PCI8620_64.DLL")]
        public static extern Byte  PCI8620_ReadRegisterByte(                // 读入单字节数据(其余同上)
                                                            IntPtr hDevice, 
                                                            UInt32 LinearAddr, 
                                                            UInt32 OffsetBytes);
        [DllImport("PCI8620_64.DLL")]
        public static extern UInt16  PCI8620_ReadRegisterWord(                // 读入双字节数据(其余同上)
                                                            IntPtr hDevice, 
                                                            UInt32 LinearAddr, 
                                                            UInt32 OffsetBytes);
        [DllImport("PCI8620_64.DLL")]
        public static extern UInt32  PCI8620_ReadRegisterULong(                // 读入四字节数据(其余同上)
                                                            IntPtr hDevice, 
                                                            UInt32 LinearAddr, 
                                                            UInt32 OffsetBytes);

        //################# I/O端口直接操作及读写函数 ########################
        // 适用于用户对本设备更直接、更特殊、更低层、更复杂的控制。比如根据特殊的
        // 控制对象需要特殊的控制流程和控制效率时,则用户可以使用这些接口予以实现。
        // 但这些函数主要适用于传统设备,如ISA总线、并口、串口等设备,不能用于本PCI设备
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_WritePortByte(IntPtr hDevice, UInt32 nPort, Byte Value);

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_WritePortWord(IntPtr hDevice, UInt32 nPort, UInt16 Value);

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_WritePortULong(IntPtr hDevice, UInt32 nPort, UInt32 Value);

        [DllImport("PCI8620_64.DLL")]
        public static extern Byte    PCI8620_ReadPortByte(IntPtr hDevice, UInt32 nPort);

        [DllImport("PCI8620_64.DLL")]
        public static extern UInt16  PCI8620_ReadPortWord(IntPtr hDevice, UInt32 nPort);

        [DllImport("PCI8620_64.DLL")]
        public static extern UInt32  PCI8620_ReadPortULong(IntPtr hDevice, UInt32 nPort);

   

        //############################ 线程操作函数 ################################
        [DllImport("PCI8620_64.DLL")]
        public static extern IntPtr PCI8620_CreateSystemEvent();     // 创建内核系统事件对象
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_ReleaseSystemEvent(IntPtr hEvent); // 释放内核事件对象
   



    }
}

 

C#写电机驱动程序

标签:

原文地址:http://www.cnblogs.com/dabai-zhu/p/4946295.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!