搜档网
当前位置:搜档网 › T315-17 Graphic Elements - RevC-d1-CHT

T315-17 Graphic Elements - RevC-d1-CHT

虚拟声卡驱动程序VirtualAudioCable使用方法

一:安装软件 点击 选择是(Y) 选择I accept 选择Install 安装成功,点击“确定”按钮即完成安装。 二、软件的设置 点击桌面开始按钮所有程序---Virtual Audio Cable —Control panel 进入软件初始化 设置。 在Cables 中选择1(即首次设置一个虚拟通道),点击旁边的Set 按钮生成通道Cable1. 在参数设置区将Line 、Mic (可选可不选)、S/PDIF (可选可不选)三个选项后面的方框打钩,选中之后点击参数设置区内的设置按钮Set ,即完成了,对虚拟声卡通道1 的设置。 鼠标右键点击桌面右下角的喇叭------ 调整音频属性---- < 或者点击开始—控制面板--- 声音、 语音和音频设备--- 声音和音频设备>弹出: 选择语音 此时语音部分的设置为原系统默认的设备,保持不变。 选择音频: 改变声音播放、录音的选项内容:

如上图将声音播放、录音的默认设备全部改为Virtual Cable 1 。点击应用--- 确定即可。 三、打开录音机录音--- 录制电脑里播放出来的音频(不包含麦克风 里的声音) - 即“内录” 开始--- 所有程序—附件--- 娱乐--- 录音机 点击确定即可开始录音(注:此时可在电脑中打开相应的音频文件,开始录音) 此时音频波段显示有声音输入,但是电脑的耳机听不到正在播放的音频文件(属正常现象)。若想同时听到音频文件的内容点击桌面开始按钮所有程序---Virtual Audio Cable —Audio Repeater 。 修改为 点击Start 即可听到正在录制的音频文件。此时的录音即是通过虚拟声卡通道录制电脑里的声音的。 四、同时录电脑里播放的声音和麦克风收集的外部声音----- 即混录 <通过这种方法解决现有笔记本无“立体声混音”或“波形音”选项的问题> 在《三打开录音机录音--- 录制电脑里播放出来的音频(不包含麦克风里的声音)------------ 即“内录”》的同时,在打开一个irtual Audio Cable —Audio Repeater 窗口将其设置为: 即将外部麦克风收集的声音转移到虚拟声卡通道Cable1 中,同电脑里播放的声音一起被录音软件收录为音频文件。

电机控制线路图大全

电机控制线路图大全 Y-△(星三角)降压启动控制线路-接触器应用接线图 Y-△降压启动适用于正常工作时定子绕组作三角形连接的电动机。由于方法简便且经济,所以使用较普遍,但启动转矩只有全压启动的三分之…,故只适用于空载或轻载启动。 Y-△启动器有OX3-13、Qx3—30、、Qx3—55、QX3—125型等。OX3后丽的数字系指额定电压为380V时,启动器可控制电动机的最大功率值(以kW计)。 OX3—13型Y-△自动启动器的控制线路如图11—11所示。(https://www.sodocs.net/doc/4213328927.html,) 合上电源开关Qs后,按下启动按钮SB2,接触器KM和KMl线圈同时获电吸合,KM和KMl 主触头闭合,电动机接成Y降压启动,与此同时,时间继电器KT的线圈同时获电,I 星形—三角形降压起动控制线路

星形——三角形降压起动控制线路 星形——三角形( Y —△)降压起动是指电动机起动时,把定子绕组接成星形,以降低起动电压,减小起动电流;待电动机起动后,再把定子绕组改接成三角形,使电动机全压运行。 Y —△起动只能用于正常运行时为△形接法的电动机。 1.按钮、接触器控制 Y —△降压起动控制线路 图 2.19 ( a )为按钮、接触器控制 Y —△降压起动控制线路。线路的工作原理为:按下起动按钮 SB1 , KM1 、 KM2 得电吸合, KM1 自锁,电动机星形起动,待电动机转速接近额定转速时,按下 SB2 , KM2 断电、 KM3 得电并自锁,电动机转换成三角形全压运行。 2.时间继电器控制 Y —△降压起动控制线路 图 2.19 ( b )为时间继电器自动控制 Y —△降压起动控制线路,电路的工作原理为:按下起动按钮 SB1 , KM1 、 KM2 得电吸合,电动机星形起动,同时 KT 也得电,经延时后时间继电器 KT 常闭触头打开,使得 KM2 断电,常开触头闭合,使得 KM3 得电闭合并自锁,电动机由星形切换成三角形正常运行。 图2定子串电阻降压起动控制线路

编译hello设备驱动程序详细过程

编译hello world设备驱动程序详细过程 1、安装与你的开发板相同的内核版本的虚拟机,我的板子内核是2.6.8.1,虚拟机是2.6.9, 一般是虚拟机的内核只能比板子内核新,不能旧 #uanme –a [1](在任何目录下,输入此命令,查看虚拟机的内核版本,我的内核版本是2.6.9) 2、在虚拟机上设置共享目录,我的共享目录在linux下的/mnt/hgfs/share [2]share是自己命名的,我的物理机上,即Windows下的目录是G:/share, 3、在Windows下,把开发板的的交叉开发工具链[3],内核源码包[4],复制到物理机的共享目录下[5] 即Windows下的目录是G:/share, 4、#cp /mnt/hgfs/share/cross-3.3.2.tar.bz2 /usr/local/arm [6] 在Linux下,把交叉工具链,复制到/usr/local/arm目录下 5、#cd /usr/local/arm 6、#tar jxvf cross-3.3.2.tar.bz2 [7] 并在当前目录/usr/local/arm下解压它cross-2.95.3.tar.bz2和gec2410-linux-2.6.8.tar.bz2也是用同样的命令去解压 7、#export PATH=/usr/local/arm/3.3.2/bin:$PATH [8] 安装交叉工具链,在需要使用交叉编译时,只要在终端输入如下命令 #export PATH=/usr/local/arm/版本/bin:$PATH 即可,在需要更改不同版本的工具链时,重新启动一个终端,然后再一次输入上面的命令即可,使用哪个版本的交叉工具链,视你要编译的内核版本决定,编译2.4版本的内核,则用2.95.3版本的交叉工具链,而2.6版本内核的,则要用3.3.2版本的交叉工具链。 8、#cp gec2410-linux-2.6.8.tar.bz2 /root [9]把内核拷贝到/root目录下, 9、#cd /root 10、#tar gec2410-linux-2.6.8.tar.bz2 [10] 在/root解压开发板的内核源码压缩包gec2410-linux-2.6.8.tar.bz2,得到gec2410-linux-2.6.8.1文件夹 11、#cd /root/ gec2410-linux-2.6.8.1 12、#cp gec2410.cfg .config [11] gec2410.cfg文件是广嵌开发板提供的默认内核配置文件,在这里首先把内核配置成默认配置,然后在此基础上用make menuconfig进一步配置,但在这里,不进行进一步的配置,对于内核配置,还需要看更多的知识,在这里先存疑。 13、#make [12]在内核源代码的根目录gec2410-linux-2.6.8.1下用make命令编译内核,注意,先安装交叉工具链,再编译内核,因为这里编译的hello.ko驱动模块最终是下载到开发板上运行的,而不是在虚拟机的Linux系统运行的,如果是为了在虚拟机的Linux系统运行的,则不用安装交叉编译工具链arm-linux-gcc,而直接用gcc,用命令#arm-linux-gcc –v 可以查看当前已经安装的交叉编译工具链的版本。这里编译内核不是为了得到内核的映象文件zImage(虽然会得到内核的映象文件zImage),而是为了得到编译hello.o模块需要相关联,相依赖(depends on)的模块。 14、#cd /root 12、#mkdir hello [13]在/root目录下建立hello文件夹, 13、#cd hel 14 、#vi hello.c [12]编辑hello.c文件,内容是《Linux设备驱动程序》第三版22页的hello world程序。 15、#vi Makefile [13]在hello文件夹下编辑Makefile文件, 16、obj-m := module.o [14] 这是Makefile的内容,为obj-m := module.omodule.o视你编辑的.c文件而定,这里则要写成hello.o,写完后,保存退出。 17、cd /root/hello

虚拟设备驱动程序的设计与实现

虚拟设备驱动程序的设计与实现 由于Windows对系统底层操作采取了屏蔽的策略,因而对用户而言,系统变得 更为安全,但这却给众多的硬件或者系统软件开发人员带来了不小的困难,因为只要应用中涉及到底层的操作,开发人员就不得不深入到Windows的内核去编写属 于系统级的虚拟设备驱动程序。Win 98与Win 95设备驱动程序的机理不尽相同,Win 98不仅支持与Windows NT 5.0兼容的WDM(Win32 Driver Mode)模式驱动程序 ,而且还支持与Win 95兼容的虚拟设备驱动程序VxD(Virtual Device Driver)。下面介绍了基于Windows 9x平台的虚拟环境、虚拟设备驱动程序VxD的基本原理和 设计方法,并结合开发工具VToolsD给出了一个为可视电话音频卡配套的虚拟设备 驱动程序VxD的设计实例。 1.Windows 9x的虚拟环境 Windows 9x作为一个完整的32位多任务操作系统,它不像Window 3.x那样依 赖于MS-DOS,但为了保证软件的兼容性,Windows 9x除了支持Win16应用程序和 Win32应用程序之外,还得支持MS-DOS应用程序的运行。Windows 9x是通过虚拟机 VM(Virtual Machine)环境来确保其兼容和多任务特性的。 所谓Windows虚拟机(通常简称为Windows VM)就是指执行应用程序的虚拟环 境,它包括MS-DOS VM和System VM两种虚拟机环境。在每一个MS-DOS VM中都只运 行一个MS-DOS进程,而System VM能为所有的Windows应用程序和动态链接库DLL(Dynamic Link Libraries)提供运行环境。每个虚拟机都有独立的地址空间、寄存器状态、堆栈、局部描述符表、中断表状态和执行优先权。虽然Win16、Win32应用程序都运行在System VM环境下,但Win16应用程序共享同一地址空间, 而Win32应用程序却有自己独立的地址空间。 在编写应用程序时,编程人员经常忽略虚拟环境和实环境之间的差异,一般认为虚拟环境也就是实环境。但是,在编写虚拟设备驱动程序VxD时却不能这样做 ,因为VxD的工作是向应用程序代码提供一个与硬件接口的环境,为每一个客户虚 拟机管理虚设备的状态,透明地仲裁多个应用程序,同时对底层硬件进行访问。这就是所谓虚拟化的概念。 VxD在虚拟机管理器VMM(Virtual Machine Manager)的监控下运行,而VMM 实 际上是一个特殊的VxD。VMM执行与系统资源有关的工作,提供虚拟机环境(能产

伺服电机驱动控制器DOC

目录 一、伺服驱动概述 (1) 二、本产品特性 (2) 三、电路原理图及PCB版图 (4) 四、电路功能模块分析 (4) 五、焊接(附元件清单) (14)

一.伺服驱动概述 1. 伺服电机的概念 伺服电机是在伺服系统中控制机械元件运转的发动机,作为一种执行元件,把所收到的电信号转换成电动机轴上的角位移或角速度输出,是一种补助马达间接变速装置。伺服电机是可以连续旋转的电-机械转换器,直流伺服电机的输出转速与输入电压成正比,并能实现正反向速度控制。 2.伺服电机分类 普通直流伺服电动机 直流伺服电机低惯量直流伺服电动机 直流力矩电动机 3. 控制系统对伺服电动机的基本要求 宽广的调速范围 机械特性和调节特性均为线性 无“自转”现象 快速响应 控制功率小、重量轻、体积小等。 4. 直流伺服电机的基本特性 (1)机械特性在输入的电枢电压Ua保持不变时,电机的转速n随电磁转矩M变化而变化的规律,称直流电机的机械特性 (2)调节特性直流电机在一定的电磁转矩M(或负载转矩)下电机的稳态转速n随电枢的控制电压Ua变化而变化的规律,被称为直流电机的调节特性 (3)动态特性从原来的稳定状态到新的稳定状态,存在一个过渡过程,这就是直流电机的动态特性。 5. 直流伺服电机的驱动原理 伺服主要靠脉冲来定位,基本上可以这样理解,伺服电机接收到1个脉冲,就会旋转1个脉冲对应的角度,从而实现位移,因为,伺服电机本身具备发出脉冲的功能,所以伺服电机每旋转一个角度,都会发出对应数量的脉冲,这样,和伺服电机接受的脉冲形成了呼应,或者叫闭环,如此一来,系统就会知道发了多少脉冲给伺服电机,同时又收了多少脉冲回来,这样,就能够很精确的控制电机的转动,从而实现精确的定位,可以达到0.001mm 直流伺服电机分为有刷和无刷电机。有刷电机成本低,结构简单,启动转矩大,调速范围宽,控制容易,需要维护,但维护方便(换碳刷),产生电磁干扰,对环境有要求。因此它可以用于对成本敏感的普通工业和民用场合。无刷直流伺服电机电机体积小,重量轻,出力大,响应快,速度高,惯量小,转动平滑,力矩稳定。容易实现智能化,其电子换相方式灵活,可以方波换相或正弦波换相。电机免维护不存在碳刷损耗的情况,效率很高,运行温度低噪音小,电磁辐射很小,长寿命,可用于各种环境

电动车无刷控制器电路图(高清)

今以应用最广泛的以PIC16F72为智能控制中心,350W的整机电路为例,整机电路如图1: (原文件名:1.gif) 图1:350W整机电路图 整机电路看起来很复杂,我们将其简化成框图再看看: (原文件名:2.gif) 图2:电路框图

电路大体上可以分成五部分: 一、电源稳压,供应部分; 二、信号输入与预处理部分; 三、智能信号处理,控制部分; 四、驱动控制信号预处理部分; 五、功率驱动开关部分。 下面我们先来看看此电路最核心的部分:PIC16F72组成的单片机智能处理、控制部分,因为其他电路都是为其服务或被其控制,弄清楚这部分,其它电路就比 较容易明白。 (原文件名:3.gif)

图3:PIC16F72在控制器中的各引脚应用图 我们先来简单介绍一下PIC16F72的外部资源:该单片机有28个引脚,去掉电源、复位、振荡器等,共有22个可复用的IO口,其中第13脚是CCP1输出口,可输出最大分辨率达10BIT的可调PWM信号,另有AN0-AN4共5路AD模数转换输入口,可提供检测外部电路的电压,一个外部中断输入脚,可处理突发事件。内部软件资源我们在软件部分讲解,这里并不需要很关心。 各引脚应用如下: 1:MCLR复位/烧写高压输入两用口 2:模拟量输入口:放大后的电流信号输入口,单片机将此信号进行A-D转换后经过运算来控制PWM的输出,使电流不致过大而烧毁功率管。正常运转时电压应在0-1.5V左右 3:模拟量输入口:电源电压经分压后的输入口,单片机将此信号进行A-D转换后判断电池电压是否过低,如果低则切断输出以保护电池,避免电池因过放电而损坏。正常时电压应在3V以上 4:模拟量输入口:线性霍尔组成的手柄调速电压输入口,单片机根据此电压高低来控制输出给电机的总功率,从而达到调整速度的目的。 5:模拟/数字量输入口:刹车信号电压输入口。可以使用AD转换器判断,或根据电平高低判断,平时该脚为高电平,当有刹车信号输入时,该脚变成低电平,单片机收到该信号后切断给电机的供电,以减少不必要的损耗。 6:数字量输入口:1+1助力脉冲信号输入口,当骑行者踏动踏板使车前行时,该口会收到齿轮传感器发出的脉冲信号,该信号被单片机接收到后会给电机输出一定功率以帮助骑行者更轻松地往前走。 7:模拟/数字量输入口:由于电机的位置传感器排列方法不同,该口的电平高低决定适合于哪种电机,目前市场上常见的有所谓120°和60°排列的电机。有的控制器还可以根据该口的电压高低来控制起动时电流的大小,以适合不同的力度需求。 8:单片机电源地。 9:单片机外接振荡器输入脚。 10:单片机外接振荡器反馈输出脚。 11:数字输入口:功能开关1 12:数字输入口:功能开关2 13:数字输出口:PWM调制信号输出脚,速度或电流由其输出的脉冲占空比宽度控制。 14:数字输入口:功能开关3 15、16、17:数字输入口:电机转子位置传感器信号输入口,单片机根据其信号变化决定让电机的相应绕组通电,从而使电机始终向需要的方向转动。这个信

电动汽车电机控制器原理

电动汽车电机控制器 一、电机控制器的概述 根据GB/T 18488.1-2001《电动汽车用电机及其控制器技术条件》对电机控制器的定义,电机控制器就是控制主牵引电源与电机之间能量传输的装置、是由外界控制信号接口电路、电机控制电路和驱动电路组成。 电机、驱动器和电机控制器作为电动汽车的主要部件,在电动汽车整车系统中起着非常重要的作用,其相关领域的研究具有重要的理论意义和现实意义。 二、电机控制器的原理 图1汽车电机控制器原理图 电机控制器作为整个制动系统的控制中心,它由逆变器和控制器两部分组成。逆变器接收电池输送过来的直流电电能,逆变成三相交流电给汽车电机提供电源。控制器接受电机转速等信号反馈到仪表,当发生制动或者加速行为时,控制器控制变频器频率的升降,从而达到加速或者减速的目的。 三、电机控制器的分类 1、直流电机驱动系统 电机控制器一般采用脉宽调制(PWM)斩波控制方式,控制技术简单、成熟、成本低,但效率低、体积大等缺点。 2、交流感应电机驱动系统 电机控制器采用PWM方式实现高压直流到三相交流的电源变换,采用变频调速方式实现电机调速,采用矢量控制或直接转矩控制策略实现电机转矩控制的快速响应。

3、交流永磁电机驱动系统 包括正弦波永磁同步电机驱动系统和梯形波无刷直流电机驱动系统,其中正弦波永磁同步电机控制器采用PWM方式实现高压直流到三相交流的电源变换,采用变频调速方式实现电机调速;梯形波无刷直流电机控制通常采用“弱磁调速”方式实现电机的控制。由于正弦波永磁同步电机驱动系统低速转矩脉动小且高速恒功率区调速更稳定,因此比梯形波无刷直流电机驰动系统具有更好的应用前景。 4、开关磁阻电机驱动系统 开关磁阻电机驱动系统的电机控制一般采用模糊滑模控制方法。目前纯电动汽车所用电机均为永磁同步电机,交流永磁电机采用稀土永磁体励磁,与感应电机相比不需要励磁电路,具有效率高、功率密度大、控制精度高、转矩脉动小等特点。 四、电动控制器的相关术语 1、额定功率:在额定条件下的输出功率。 2、峰值功率:在规定的持续时间内,电机允许的最大输出功率。 3、额定转速:额定功率下电机的转速。 4、最高工作转速:相应于电动汽车最高设计车速的电机转速。 5、额定转矩:电机在额定功率和额定转速下的输出转矩。 6、峰值转矩:电机在规定的持续时间内允许输出的最大转矩。 7、电机及控制器整体效率:电机转轴输出功率除以控制器输入功率再乘以100%。 扩展阅读: WP4000变频功率分析仪应用于电动汽车电机试验 现行的电动汽车相关标准大全 如何选择电动汽车电池监测系统 hb

无刷电机控制器基本原理

无刷电机控制器基本原理 电动车采用的电机分有刷电机和无刷电机两种,由于无刷电机具有噪声低、寿命长的特点,因而在电动车中获得比较广泛应用。无刷电机的控制器要比有刷电机控制器复杂得多,在维修上有一定的难度,因此,本文从无刷控制器的原理入手介绍维修要点,以期对广大维修爱好者有所帮助。 基本原理 电动车无刷控制器主要由单片机主控电路、功率管前级驱动电路、电子换向器、霍尔信号检测电路、转把信号电路、欠电检测电路、限流/过流检测电路、刹车信号电路、限速电路、电源电路等部分组成,其原理框图如图1所示,下面介绍主要电路的工作原理。 1. 电子换向器 无刷电机与有刷电机的根本区别就在于无刷电机用电子换向器代替了有刷电机的机械换向器,因而控制方法也就大不相同,复杂程度明显提高。在无刷电机控制器中,用6个功率MOSFET管组成电子换向器,其结构如图2所示。图中MOSFET管VT1、VT4构成无刷电机A相绕组的桥臂,VT3、VT6 构成无刷电机B相绕组的桥臂,VT5、VT2构成无刷电机C相绕组的桥臂,在任何情况,同一桥臂的上下两管不能同时导通,否则要烧坏管子。 6只功率MOSFET管按一定要求顺次导通,就可实现无刷电机A、B、C 三相绕组的轮流通电,完成换相要求,电机正常运转。在电动车无刷电机控制器中,这6只功率管有二二通电方式和三三通电方式的运用,二二通电方式即每一瞬间有两只功率管同时通电,三三通电方式即每一瞬间有三只功率管同时通电。对于二二通电方式,功率管须按VT1、VT2;VT2、VT3;VT3、VT4;VT4、VT5;VT5、VT6;VT6、VT1;VT1、VT2??的通电顺序,电机才能正常运转。对于三三通电方式,功率管须按VT1、VT2、VT3;VT2、VT3、VT4;VT3、VT4、VT5;VT4、VT5、VT6;VT5、VT6、VT1; VT6、VT1、VT2;VT1、VT2 、VT3??的次序通电,电机才能正常运转。

《设备驱动程序开发技术》大作业

《设备驱动程序开发技术》 大作业 WDM驱动程序的开发流程和要点班级:计算机科学与技术1004

摘要 DWDM(Windows Driver Model)是Microsoft公司推出的一种符合Windows2k/XP下的内核模式驱动程序的分层体系结构的驱动程序模式。它源于 Windows NT的分层32位设备驱动程序模型,它支持更多的特性,如即插即用( PnP ,Plug and Play )、电源管理( PM ,Power Management )、Windows管理诊断( WMI ,Windows Management Instrumentation )和 NT 事件。它为Windows操作系统的设备驱动程序提供了统一的框架,在Windows平台上,WDM将成为主流的驱动模式。WDM是Windows98和Windows2000使用的新的驱动程序设计规范。使用WDM使得硬件驱动程序更加稳定,让操作系统对硬件更加有效地控制硬件。除了定义一个驱动程序与操作系统连接的标准接口以外,WDM也指明了驱动程序应该采用的更加模块化的设计。 关键词: WDM、驱动程序、操作系统

1 概述 WDM(Windows Driver Model)是Microsoft公司推出的一种符合Windows2k/XP下的内核模式驱动程序的分层体系结构的驱动程序模式。相对于以前的KDM、VXD来说,它的性能更高、系统之间移植更加方便。随着Microsoft的操作系统的不断升级,WDM已逐步取代了KDM、VXD,成为了Microsoft系统下驱动程序开发的主流。 WDM是通过一个128位的全局唯一标识符(GUID)实现驱动程序的识别。应用程序与WDM 驱动程序通信时,应用程序将每个用户请求形成I/O请求包(IRP)发送到驱动程序。驱动程序识别出IRP请求后指挥硬件执行相应操作。 2 WDM驱动模型 WDM模型为存在于Windows 98和Windows 2000操作系统中的设备驱动程序提供了一个参考框架。尽管对于最终用户来说这两个操作系统非常相似,但它们的内部工作却有很大不同。 Windows 2000概述 图1是以我的视点所看到的Windows 2000操作系统,该图着重了驱动程序开发者所关心的特征。软件要么执行在用户模式中,要么执行在内核模式中。当用户模式程序需要读取设备数据时,它就调用Win32 API函数,如ReadFile。Win32子系统模块(如KERNEL32.DLL)通过调用平台相关的系统服务接口实现该API,而平台相关的系统服务将调用内核模式支持例程。在ReadFile调用中,调用首先到达系统DLL(NTDLL.DLL)中的一个入口点,NtReadFile 函数。然后这个用户模式的NtReadFile函数接着调用系统服务接口,最后由系统服务接口调用内核模式中的服务例程,该例程同样名为NtReadFile。

虚拟块设备驱动程序设计与分析

如果只是为了应付考试,这个文档就太啰嗦了,不用看,不过还是可以帮助记忆,考试只会考其中加粗字体的几个函数中的一个,至于是哪个我不能断定,因此要记的还是比较多的,要是能理解就更好了,结合课本和下面的解释应该能大体上弄明白这个虚拟块设备驱动的 实现过程,毕竟设备驱动是内核的一部分,光看下面的解释也是还是很头晕的,不过坚持看下去还是有收获的,我也差不多花了半天时间,不过,要是打算……的话就可以直接跳过了。 #define MAJOR_NR 70 //我们创造的虚拟块设备的主设备号 #define DEVICE_NAME “bdemo”//我们创造的虚拟块设备的名字,当设备加载成功后可用lsmod命令查看到该设备模块名 #define blkdemo_devs 2 //虚拟块设备的个数 #define blkdemo_rahead 2 //读取块设备时预读的扇区个数 #define blkdemo_size 4 //每个虚拟块设备的大小,单位为KB #define blkdemo_blksize 1024 //设备每个数据块的大小,即block,单位为字节 #define blkdemo_hardsect 512 //设备每个扇区的大小,单位为字节 struct blkdemo_device { // 这里定义了我们将要创造的虚拟块设备的数据结构 int size; // 用来记录真实块设备的容量,即下面data指针所指向数据存储区的大小 int use_cnt; // 用来记录正在使用该块设备的程序的个数 int hardsect; // 用来保存该块设备每个扇区的大小,单位为字节,即设备的使用计数 u8 *data; // 该指针所指向的内存区域就是该块设备真正用来存储数据的区域,在该设备还未被加载函数初始化时,该指针为// 空,即系统还没有为该设备分配内存区域。 }; static int blkdemo_sizes[blkdemo_devs]; //用来保存我们创建的所有虚拟块设备的大小,单位为KB static int blkdemo_blksizes[blkdemo_devs]; //用来保存我们创建的所有虚拟块设备中每个数据块的大小,单位为字节static int blkdemo_hardsects[blkdemo_devs];//用来保存我们创建的所有虚拟块设备中每个扇区的大小,单位为字节 //上面的这三个数组将会在我们加载这些设备时被注册到内核的数据结构中(即让内核中与之相关的一些指针指向它们,让内核能够读取我们所创建的设备的一些重要信息 //对于一个新的设备,内核肯定不知道他为何物,要想让内核识别我们自己创造的设备,则必须将该设备的一些信息、使用这个设备的方//法等告诉内核,由于内核早已编译成型,至于如何去告诉内核就早已模式化。内核中有几个指针数组(书本page81)专门用来完成上面的部分任务: // blk_size[]; // blksize_size[]; // hardsect_size[]; // read_ahead[]; //这几个数组都为每一个主设备号留有一个位置,对于2.4的内核,主设备号和次设备号均用8位二进制来表示(即短整型的高八位和//低八位),因此这几个数组都包含有256个元素,每个元素都是与主设备号对应的一个指针,如果主设备号所对应的设备不存在,则该//指针置为空(NULL),其实其中很多指针都为空,因为一般电脑上都没有那么多不同类型的块设备,当然,对于我们所创造的这个块设//备而言,它与系统中所存在的其他块设备的类型都不同,要为其确定一个主设备号,这个没什么硬性的规定,只要找一个没被使用的主//设备号就可以了,这个程序中使用的是70(前面的MOJOR_NR宏)。上面我们定义了保存有虚拟块设备信息的数组,现在只要将他们的//首地址赋给这几个数组中下标70(主设备号)所对应的指针元素即可。这一过程是在后面的加载函数中完成的。 static int blksize = blkdemo_blksize; struct blkdemo_device blkdemo_dev[blkdemo_devs];//这里才真正创建了我们虚拟块设备对应的结构体变量(一个全局数组),//每个元素为对应一个虚拟块设备 虚拟块设备的打开函数(open()): int blkdemo_open(struct inode *inode, strcut file *filp) { //设备文件对应的节点(inode)结构中包含有对应的设备号 int num; num = DEVICE_NR(inode->i_rdev);//用DEVICE_NR宏可求出该节点所对应设备的次设备号,所以num即为次设备号if (!blkdemo_dev[num].use_cnt) { //如果该设备的使用计数为0,则说该设备没有被任何程序使用,当虚拟块设备没有被//任何程序使用时,内核先前为该设备所分配的存储区很可能已经被释放掉了,甚至对于可移动设备而言,有可能该设备都被拔掉了(当//然,我们的虚拟块设备是不可能的),因此,在打开该设备时要进行严格的检查,不然会导致设备打开出错而造成系统崩溃。 check_disk_change(inode->i_rdev);//首先检查该块设备是否发生了变化,比如已经被移除了(该设备不可能,所以//此处没有用if来判断,只是形式的调用了一下该函数。 if (!blkdemo_dev[num].data)//然后判断该设备的数据存储区域是否已经被释放掉了 return –ENOMEM; //如果是,则返回,告知系统该设备无法打开,-ENOMEM是一个内核中定义的宏,它代表的意思是//“error,no memory”。 }//如果上述情况均未发生,一切正常,则打开设备,对于这个虚拟的块设备,其实没有什么好打开的,不过还是意思一下:blkdemo_dev[num].use_cnt++; //将设备的使用计数加1,表示又多了个程序使用该设备。 MOD_INC_USE_COUNT; //并且将内核所管理的模块使用计数也加1,好让内核也知道多了一个程序使用该虚拟设备模块。模块使//用计数是内核管理模块时要用的,只有当一个设备的模块使用计数为0时才能卸载该模块,这个值也可以通过lsmod命令查看到return(0);//返回0,表示设备已成功打开 } 虚拟块设备的释放函数(release()): int blkdemo_release(struct inode *inode, struct file *filp) {//释放并不代表将此设备从内核中移除了,他是对调用它的程序而言的,只表示这个程序不再使用该设备了int num;

Linux设备驱动程序的概念、作用以及模块

Linux设备驱动程序的概念、作用以及模块 我们首先对linux系统整个框架要有个了解。Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G。 Linux 内核将这4G字节的空间分为两部分,分别是用户空间(0~3G)和内核空间(3G~4G)。其中,用户空间存放的是应用程序,而内核空间存放的是内核,设备驱动和硬件。 为什么需要存在设备驱动呢?我们知道,内核是操作系统基本的部分,而操作系统是不能够直接控制硬件的,这样我们就需要设备驱动作为操作系统和硬件设备间的粘合剂,相当于一个中间人吧,负责上下两边的沟通。驱动负责将操作系统的请求传输,转化为特定物理设备控制器能够理解的命令。 这样我们就知道,驱动需要完成两大功能: 1、为linux内核提供调用接口。 2、控制硬件。因为寄存器是控制硬件的操作,所以驱动程序控制硬件,也就是要通过读写硬件寄存器达到控制硬件的目的。 内核是为应用程序服务的,其本质其实是函数的集合,内核要实现的功能我们可以分为两部门:基本功能和扩展功能。其中,基本功能包括进程管理,线程管理等等,而扩展功能,可以根据用户的需求自行添加。 下面我们就来探讨一下怎样向内核添加一项功能呢? 1、我们首先想到,肯定需要写一个功能函数,假如我们命名为fun.c,那么函数写好后,必须要和linux源码一起编译,生成zImage内核镜像文件。 2、重新编译内核。 这样就得到了新的内核,这种添加的方式我们称为静态添加。大家发现,每次修改一次fun.c,都要重新编译一次内核,灰常的麻烦,所以引进了内核模块机制,只需要加载或卸载模块,就可以动态的增加或者删除内核的功能,不用每次都重新编译,是不是很方便?那么接下来我们会想到,这个模块怎么就能和内核连接在一起呢?其实很简单,fun.c文件除了要实现功能呢,还需要包含和内核的接口,内核也提供了模块的接口,只要这两个接口一致,模块就可以融入内核,成为内核的一部分。Linux驱动程序都是以模块的形式存在的,所以我们称之为驱动模块。 所以我们总结出添加模块的步骤是: 1、写功能函数fun.c。 怎么样编写模块的源码文件,我们以一个Hello模块实例分析。 #include #include //①模块的头文件,在对应内核下 的include目录中{ … //②功能函数hello.c(同普通} 的.c文件) Static int __int hellomudule_init(void) //③模块初始化函数 { Printk(“Hello world!\n”); Return 0; }

虚拟声卡驱动程序Virtual Audio Cable使用方法

一:安装软件 点击setup.exe 选择是(Y) 选择I accept 选择Install 安装成功,点击“确定”按钮即完成安装。

二、软件的设置 点击桌面开始按钮----所有程序---Virtual Audio Cable—Control panel进入软件初始化设置。 在Cables中选择1(即首次设置一个虚拟通道),点击旁边的Set按钮生成通道Cable1. 在参数设置区将Line、Mic(可选可不选)、S/PDIF(可选可不选)三个选项后面的方框打钩,选中之后点击参数设置区内的设置按钮Set,即完成了,对虚拟声卡通道1的设置。

鼠标右键点击桌面右下角的喇叭----调整音频属性----<或者点击开始—控制面板---声音、语音和音频设备---声音和音频设备>弹出: 选择语音 此时语音部分的设置为原系统默认的设备,保持不变。

选择音频: 改变声音播放、录音的选项内容: 如上图将声音播放、录音的默认设备全部改为Virtual Cable 1。点击应用---确定即可。

三、打开录音机录音---录制电脑里播放出来的音频(不包含麦克风里的声音)----即“内录” 开始---所有程序—附件---娱乐---录音机 点击确定即可开始录音(注:此时可在电脑中打开相应的音频文件,开始录音)

此时音频波段显示有声音输入,但是电脑的耳机听不到正在播放的音频文件(属正常现象)。若想同时听到音频文件的内容点击桌面开始按钮----所有程序---Virtual Audio Cable—Audio Repeater。 修改为 点击Start即可听到正在录制的音频文件。 此时的录音即是通过虚拟声卡通道录制电脑里的声音的。

驱动程序的句柄

设备驱动程序通知应用程序的几种方法 1 异步过程调用(APC) Win32应用程序使用CreateFile()函数动态加载设备驱动程序,然后定义一个回调函数backFunc(),并且将回调函数的地址&backFunc()作为参数,通过DeviceIoControl()传送给设备驱动程序。设备驱动程序获得回调函数的地址后,将它保存在一个全局变量(如callback)中,同时调用Get_Cur_Thread_Handle()函数获取它的应用程序线程的句柄,并且将该句柄保存在一个全局变量(如appthread)中。当条件成熟时,设备驱动程序调用_VWIN32_QueueUserApc()函数,向Win32应用程序发送消息。这个函数带有三个参数:第一个参数为回调函数的地址(已经注册);第二个参数为传递给回调函数的消息;第三个参数为调用者的线程句柄(已经注册)。Win32应用程序收到消息后,自动调用回调函数(实际是由设备驱动程序调用)。回调函数的输入参数是由设备驱动程序填入的,回调函数在这里主要是对消息进行处理。 2 事件方式(VxD) 首先,Win32应用程序创建一个事件的句柄,称其为Ring3句柄。由于虚拟设备驱动程序使用事件的Ring0句柄,因此,需要创建Ring0句柄。用LoadLibrary()函数加载未公开的动态链接库Kernel32.dll,获得动态链接库的句柄。然后,调用GetProcAddress(), 找到函数OpenVxDHandle()在动态链接库中的位置。接着,用OpenVxDHandle()函数将Ring3事件句柄转化为Ring0事件句柄。Win32应用程序用CreateFile()函数加载设备驱动程序。如果加载成功,则调用DeviceIoControl()函数将Ring0事件句柄传给VxD;同时,创建一个辅助线程等待信号变成有信号状态,本身则可去干其它的事情。当条件成熟时,VxD置Ring0事件为有信号状态(调用_VWIN32_SetWin32Event()函数),这马上触发对应的Ring3事件为有信号状态。一旦Ring3事件句柄为有信号状态,Win32应用程序的辅助线程就对这个消息进行相应的处理。 3 消息方式 Win32应用程序调用CreateFile()函数动态加载虚拟设备驱动程序。加载成功后,通过调用DeviceIoControl()函数将窗体句柄传送给VxD,VxD利用这个句柄向窗体发消息。当条件满足时,VxD调用SHELL_PostMessage()函数向Win32应用程序发送消息。要让该函数使用成功,必须用#define来自定义一个消息,并且也要照样在应用程序中定义它;还要在消息循环中使用ON_MESSAGE()来定义消息对应的消息处理函数,以便消息产生时,能够调用消息处理函数。SHELL_PostMessage()函数的第一个参数为Win32窗体句柄,第二个参数为消息ID号,第三、四个参数为发送给消息处理函数的参数,第五、六个参数为回调函数和传给它的参数。Win32应用程序收到消息后,对消息进行处理。

电动车无刷马达控制器硬件电路详解

电动车无刷马达控制器硬件电路详解 电动车无刷电机是目前最普及的电动车用动力源,无刷电机以其相对有刷电机长寿,免维护的特点得到广泛应用,然而由于其使用直流电而无换向用的电刷,其换向控制相对有刷电机要复杂许多,同时由于电动车负载极不稳定,又使用电池作电源,因此控制器自身的保护及对电机,电源的保护均对控制器提出更多要求。 自电动车用无刷电动机问世以来,其控制器发展分两个阶段:第一阶段为使用专用无刷电动机控制芯片为主组成的纯硬件电路控制器,这种电路较为简单,其中控制芯片的代表是摩托罗拉的MC33035,这个不是这里的主题,所以也不作深入介绍。第二阶段是以MCU为主的控制芯片。这是这篇文章介绍的重点,在MCR版本的设计中,揉和了模拟、数字、大功率MOSFET驱动等等许多重要应用,结合MCU智能化控制,是一个非常有启迪性的设计。 今以应用最广泛的以PIC16F72为智能控制中心,350W的整机电路为例,整机电路如图1: 图1:350W整机电路图 整机电路看起来很复杂,我们将其简化成框图再看看:

图2:电路框图 电路大体上可以分成五部分: 一、电源稳压,供应部分; 二、信号输入与预处理部分; 三、智能信号处理,控制部分; 四、驱动控制信号预处理部分; 五、功率驱动开关部分。 下面我们先来看看此电路最核心的部分:PIC16F72组成的单片机智能处理、控制部分,因为其他电路都是为其服务或被其控制,弄清楚这部分,其它电路就比较容易明白。 图3:PIC16F72在控制器中的各引脚应用图

我们先来简单介绍一下PIC16F72的外部资源:该单片机有28个引脚,去掉电源、复位、振荡器等,共有22个可复用的IO口,其中第13脚是CCP1输出口,可输出最大分辨率达10BIT的可调PWM信号,另有AN0‐AN4共5路AD模数转换输入口,可提供检测外部电路的电压,一个外部中断输入脚,可处理突发事件。内部软件资源我们在软件部分讲解,这里并不需要很关心。 各引脚应用如下: 1:MCLR复位/烧写高压输入两用口 2:模拟量输入口:放大后的电流信号输入口,单片机将此信号进行A‐D转换后经过运算来控制PWM的输出,使电流不致过大而烧毁功率管。正常运转时电压应在0‐1.5V左右 3:模拟量输入口:电源电压经分压后的输入口,单片机将此信号进行A‐D转换后判断电池电压是否过低,如果低则切断输出以保护电池,避免电池因过放电而损坏。正常时电压应在3V以上 4:模拟量输入口:线性霍尔组成的手柄调速电压输入口,单片机根据此电压高低来控制输出给电机的总功率,从而达到调整速度的目的。 5:模拟/数字量输入口:刹车信号电压输入口。可以使用AD转换器判断,或根据电平高低判断,平时该脚为高电平,当有刹车信号输入时,该脚变成低电平,单片机收到该信号后切断给电机的供电,以减少不必要的损耗。 6:数字量输入口:1+1助力脉冲信号输入口,当骑行者踏动踏板使车前行时,该口会收到齿轮传感器发出的脉冲信号,该信号被单片机接收到后会给电机输出一定功率以帮助骑行者更轻松地往前走。 7:模拟/数字量输入口:由于电机的位置传感器排列方法不同,该口的电平高低决定适合于哪种电机,目前市场上常见的有所谓120°和60°排列的电机。有的控制器还可以根据该口的电压高低来控制起动时电流的大小,以适合不同的力度需求。 8:单片机电源地。 9:单片机外接振荡器输入脚。 10:单片机外接振荡器反馈输出脚。 11:数字输入口:功能开关1 12:数字输入口:功能开关2 13:数字输出口:PWM调制信号输出脚,速度或电流由其输出的脉冲占空比宽度控制。 14:数字输入口:功能开关3 15、16、17:数字输入口:电机转子位置传感器信号输入口,单片机根据其信号变化决定让电机的相应绕组通电,从而使电机始终向需要的方向转动。这个信号上面讲过有120°和60°之分,这个角度实际上是这三个信号的电相位之差,120°就是和三相电一样,每个相位和前面的相位角相差120°。60°就是相差60°。 18:数字输出口:该口控制一个LED指示灯,大部分厂商都将该指示灯用作故障情况显示,当控制器有重大故障时该指示灯闪烁不同的次数表示不同的故障类型以方便生产、维修。 19:单片机电源地。 20:单片机电源正。上限是5.5V。 21:数字输入口:外部中断输入,当电流由于意外原因突然增大而不在控制范围时,该口有低电平脉冲输入。单片机收到此信号时产生中断,关闭电机的输出,从而保护重要器件不致损坏或故障不再扩大。 22:数字输出口:同步续流控制端,当电流比较大时,该口输出低电平,控制其后逻辑电路,使同步续流功能开启。该功能在后面详细讲解。 23‐‐28:数字输出口:是功率管的逻辑开关,单片机根据电机转子位置传感器的信号,由这里输出三相交流信号控制功率MOSFET开关的导通和关闭,使电机正常运转。

相关主题