标签目录:摩登3代理1980

摩登3娱乐登录地址_凌华科技PCI-9846高速数字化仪在谐波检测中的应用

凌华科技PCI-9846高速数字化仪作为数据采集工具,通过对谐波、间谐波和高频谐波的实验分析,验证谐波函数和采用PCI-9846作为分析采集工具的可行性和正确性。同时,PCI-9846高达20MHz宽动态范围输入信号处理能力,在处理电力系统的高频谐波中也得到了充分发挥。 1、应用背景 1.1电力系统谐波及划分 谐波干扰一般由非线性电压或电流特性的设备产生。电力系统的谐波问题早在20世纪20年代和30年代就引起了人们的注意,当时在德国,由于使用静止汞弧变流器而造成了电压、电流波形的畸变。目前,电力系统的谐波电压源和电流源可以分为以下三类设备:①磁芯设备,如变压器、电动机、发电机等;②电弧炉、弧焊机、高压放电管等;③电子设备和电力电子设备。 在实际的电网系统中,由于有非线性负荷的存在,当电流流过与所加电压不呈线性关系的负荷时,就形成非正弦电流。这种非正弦周期性波形可傅立叶级数分解为一个基频正弦波加上许多谐波频率的正弦波,谐波频率是基频的整倍数。电网中有时也存在间谐波、次谐波和高频谐波。谐波实际上是一种干扰量,使电网受到“污染”。 在电磁兼容EMC中(ElectroMagneticCompatibility)定义低频范围(0~9kHz)。谐波、间谐波、次谐波以及高频谐波划分如下表。 表1谐波与频率范围 1.2谐波危害 谐波的危害,是全面的、深层次的,比如: 1)谐波对电网中变压器、电容器组、线路和旋转电机的危害,主要是引起设备故障、附加损耗、发热以及降低设备的使用寿命。 2)谐波会造成保护系统和控制电路的误动作。谐波在电网中引起的谐振,会造成谐波电压升高,谐波电流增大,造成设备损坏和引起继电保护和控制电路的误动。如谐波在负序(基波)量的基础上产生的干扰,会影响各种以负序滤过器为启动元件的保护及自动装置系统。 3)谐波会造成测控仪表的不精确,不仅影响计量的准确性,而且对控制系统产生严重干扰。 4)谐波超过一定程度,不仅影响电子设备的正常工作,还会对其造成损坏。如,谐波会缩短白炽灯的寿命和引起荧光灯故障。 1.3谐波检测方法 谐波检测的精度和动态响应速度与检测方法密切相关,谐波检测方法的发展方向是高精度、高速度和高实时性,目前常见的谐波检测方法按原理可分为: 1)基于傅里叶变换的谐波检测方法,较多的是采用DFT或FFT获取各次谐波信号的幅值、频率和相位。在测量时间是信号周期的整数倍并满足采样定理的情况下,DFT和FFT检测精度高、实现简单、使用方便,但由于计算量大,实时性受限制,对非整数次谐波的检测存在频谱泄漏和栅栏现象等缺点,为了减小频谱泄漏,常用的方法是在谐波分析运算前增加窗函数。 2)采用人工神经网络的检测方法,目前已有多种采用人工神经网络的谐波检测方法提出。目前对人工神经元网络的研究很多是仿真性研究,其硬件实现的研究还是一个比较薄弱的环节,其实用价值还待进一步发展。 3)基于小波分析的谐波检测方法,小波分析作为时域分析的重要工具,克服了傅里叶分析在频域完全局部化而在时域完全无局部化的缺点,在频域和时域同时具有局部性,能算出某一特定时间的频率分布并将各种不同频率组成的频谱信号分解成不同频率的信号块。 4)基于瞬时无功功率的谐波检测方法,目前广泛应用在有源电力滤波器方案中,其实时性好,延时小,如在检测谐波电流时,因被检测对象电流中谐波的构成和采用滤波器的不同,会有不同的延时,但延时最多不超过一个电源周期。对于电网中典型三相整流桥谐波源,其检测的延时约为1/6周期,具有很好的实时性。 5)自适应谐波检测方法,自适应能力好,能较好跟踪检测且精度较高,但动态响应慢,目前针对自适应谐波检测方法的研究不仅在软件仿真方面,而且在硬件电路实现上日益深入。 6)模拟滤波器法,作为早期的谐波电流检测方法,由于难设计、误差大、对电网频率波动和电路元件参数敏感等,目前已很少使用。常用的模拟滤波器方法有,通过滤波器去除基波分量,得到谐波分量或使用带通滤波器得出基波分量,再与被检测电流相减后得到谐波电流分量。 2、面临问题 随着新能源的发展和大量新技术新产品在电力系统中的应用,精确测量谐波含量和科学分析谐波影响,不仅为谐波的进一步治理提供依据,而且也为电力系统的和谐发展提供保障。 下面简单介绍,光伏并网发电、风力发电、电气化铁路以及电动汽车充电站中的谐波状况,初步分析新能源和新技术的应用,使电力系统面临更严峻的谐波问题。 2.1光伏并网和风力发电的谐波影响 光伏发电的并网逆变器易产生谐波、三相电流不平衡;同时,输出功率不确定性易造成电网电压波动、闪变。在已并网的光伏示范工程中,10kV接入、400V接入以及220V接入电网系统,都检测到谐波电流总畸变率偏高的问题,且随着容量的增大,谐波电流对电网的影响将进一步加大。 风力发电的风电机组中变频器的有限开关频率使得风电机组输出电流发生畸变,除了一些符合变频器基本规律的谐波外,某些特定的谐波也经常出现,如当采用两种极对数的发电机时,发电机极数转换过程中会产生间谐波,当电网阻抗不平衡产生的非特征谐波,以及风电系统谐振效应引起的谐波等。 下图为某一220kV并网风电场一天的电流值曲线,线电压值曲线以及电压总谐波畸变率曲线。 1-a为某风电场一天的电流值曲线,横坐标为时间,纵坐标为电流值(A);1-b为某风电场一天的线电压值曲线图,横坐标为时间,纵坐标为线电压值(V);1-c为某风电场一天电压总谐波含有率曲线图,横坐标为时间,纵坐标为电压总谐波畸变率(%)。 1-a某风电场一天电流值曲线 1-b某风电场一天线电压值曲线图 1-c某风电场一天电压总谐波畸变率曲线图图1某一220kV并网风电场相关曲线 2.2 电气化铁路谐波影响 近年来,我国电气化铁路发展十分迅速。到2020年,全国铁路规划营业里程将达到12万公里以上,铁路电化率将达到60%以上。未来几年,将是铁路建设的高峰,电气化铁路建设进入历史上发展最快的时期。 通过对已运行电气化铁路的电能质量检测(主要是交直型机车电气化铁路),电气化铁路运行对电力系统的影响主要有以下几个方面: 1)注入系统的谐波电流普遍超标,而且3次谐波超标比较严重;造成了部分供电变电站的110kV母线电压THD值超标,同时随着谐波在系统中的流动,还使得部分35kV和10kV母线电压THD值超标,对电气设备的安全运行构成了隐患。 2)机车的不平衡负荷,对系统中一些不平衡保护也会带来一定的影响,可能触发零序启动限值,造成故障录波器的频繁启动,且随着电铁负荷的增加,其中的负序电流已造成一些电厂的负序保护的动作。 3)由于电铁机车负荷不规律且频繁的无功冲击,影响无功补偿设备的正常投运率,同时对相关母线的电压合格率也带来一定的影响。 而上述这些影响,仅限于目前电能质量测试仪器的测试结果,如对谐波的测试,电能质量测试仪器一般在50次谐波以下,更高次的高频谐波通常不加以检测。而电气化机车中,如目前使用得越来越广泛的交–直–交型机车,50次甚至更高次以上的高频谐波比其它类型的机车产生的多,这些高频谐波有可能和馈电系统变压器的漏抗及馈线等分布电容决定的固有谐率发生谐振,引起高次谐波的放大。这些高频谐波,不仅对电力系统有严重影响,而且对机车自身也构成危害,如:机车主回路、补机回路误动作,绝缘恶化;ATC回路、有线通信回路杂音干扰;电容器灯具等电力设备的烧损等。 下图是电力系统某一为交直型机车牵引站供电的110kV变电站一个月的电流值曲线和电压总谐波畸变率曲线。 2-a为系统变电站一个月的电流值曲线,横坐标为时间,纵坐标为电流值(A);2-b为系统变电站一个月的电压总谐波含有率曲线图,横坐标为时间,纵坐标为电压总谐波畸变率(%)。 2-a110kV系统变电站电流曲线图 2-b110kV系统变电站电压总谐波含有率曲线图 图2110kV系统变电站相关曲线 由所测数据可知,110kV的电压总谐波含有率存在超过国家标准含量的现象(国家标准为2%)。 交–直–交型机车的低次谐波有了较大的改善,下图是电力系统某一为交–直–交型机车牵引站供电的220kV系统变电站一个时段的电流值曲线和电压总谐波畸变率曲线。 3-a为系统变电站一个时段的电流值曲线,横坐标为时间,纵坐标为电流值(A); 3-b为系统变电站一个时段的电压总谐波含有率曲线图,横坐标为时间,纵坐标为电压总谐波畸变率(%)。 3-a220kV系统变电站电流曲线图 3-b220kV系统变电站电压总谐波畸变率曲线图图3220kV系统变电站相关曲线 根据所测数据,交-直-交机车的低次谐波得到很大的改善,为交-直-交型机车牵引站供电的220kV变电站电压谐波含有率基本满足国家标准要求(国家标准为2%)。但考虑目前谐波测试仪器一般仅测试50次谐波以下,更高次的高频谐波情况无法获知。 2.3电动汽车充放电站谐波影响 电动汽车作为节能、环保新型交通工具,发展迅速,随之而来的,投运的电动汽车充放电站也越来越多。动力电池充电站属于非线性负荷,接入系统后会使电流发生畸变产生谐波。 下表为某一电动汽车充放电站在稳定工作时,注入低压侧母线谐波电流含有率(三相统计值,取95%概率大值,所选数据为检测数据中的典型值)参见下表。 表2谐波电流含有率 注*:系统在不稳定状态时,3次谐波电流含有率变动较大。 检测结果显示,此电动汽车充放电站为6脉动不控整流负荷,其中次谐波为其特征谐波,。同时,含有少量非特征次谐波。 3、解决方案 3.1谐波分析理论 电网电压信号是不断波动的,其中除了基波和直流分量、整数次谐波,还有间谐波、次谐波以及高频谐波,即使采用跟踪锁相技术,也难以实现严格同步采样。本文选用基于傅里叶变换的谐波检测这一常用方法来获取各次谐波信号的幅值和频率。针对离散傅里叶变换处理后存在的频谱泄漏,包括长范围泄漏和短范围泄漏,通过选择适当的窗函数抑制长范围泄漏,同时根据所选的窗函数的形式对频率、幅值等进行插值修正,达到弥补短范围泄漏造成的误差。 电力系统谐波分析中常用基于余弦窗的组合窗,这类窗当选取时间是信号周期的整数倍时,窗频谱在各次整数倍谐波频率处幅值为零,即使系统信号频率在小范围波动,其泄漏也较小。常用的窗,如Hanning窗、Blackman窗等,主瓣宽度大,旁瓣幅值衰减快,频谱分辨力降低,频谱计算精度提高;而Haming窗等,旁瓣幅值一定时具有最小主瓣宽度,频谱分辨力提高,频谱精度降低,矩形窗具有最窄主瓣但其旁瓣幅值最大;还有折中的如Rife-Vincent(III)窗等。 余弦窗的窗函数表达式为: 当采样点数N=64时,矩形窗、Hanning窗、Hamming窗和Blackman窗在时域和频域的幅频特性如下图。 4-a矩形窗、Hanning窗幅频特性曲线 4-bHamming窗、Blackman窗幅频特性曲线图4常见窗函数在时域和频域的幅频特性 根据所需的精度,选择项数。谐波的幅值修正公式及思路可参见相关文献。 本文采用Blackman窗和文献[7]中两根谱线加权平均的方法修正幅值等方法,对采集的电压数据进行谐波分析。 3.2实验 实验使用的谐波源为FLUKE6100A,它用来校准一些检测仪器的电功率标准源。使用FLUKE6100A可以生成不规则的电能质量现象,如电压谐波,间谐波,波动谐波,闪变以及电压暂升和暂降。 数据采集系统为凌华科技PCI-9846高速数字化仪,ADLINK的PCI-9846板卡是高达40MS/s的采样率16位4通道数字化转换器,可采集高达20MHz宽动态范围输入信号。能很好地处理电力系统的高频谐波。 在Matlab中建立板卡采样设置函数和谐波分析函数,相关实验过程及结果如下。 1)谐波 (a)FLUKE6100A以主频50Hz,幅值1V,叠加3次谐波,幅值10%(与主频幅值相比);7次谐波,幅值5%;9次谐波,幅值1%。 主频50Hz时,PCI-9846采样谐波数据输出波形如下图。 图5主频50Hz谐波采样输出波形 通过谐波分析函数,各次谐波的频率及幅值如下表。 表3主频50Hz谐波频率幅值表 主频50Hz谐波分析输出波形参见下图。 图6主频50Hz谐波分析输出波形 (b)FLUKE6100A以主频51Hz,幅值1V,叠加3次谐波,幅值10%;7次谐波,幅值5%;9次谐波,幅值1%。 主频51Hz时,PCI-9846采样谐波数据输出波形如下图。 图7主频51Hz谐波采样输出波形 通过谐波分析函数,各次谐波的频率及幅值如下表。 表4主频51Hz谐波频率幅值表 主频51Hz谐波分析输出波形参见下图。 图8主频51Hz谐波分析输出波形 2)间谐波 (a)FLUKE6100A以主频50Hz,幅值1V,叠加85Hz间谐波,幅值10%;121Hz间 谐波,幅值10%。 主频50Hz时,PCI-9846采样间谐波数据输出波形如下图。 图9主频50Hz间谐波采样输出波形 通过谐波分析函数,间谐波的频率及幅值如下表。 表5主频50Hz间谐波频率幅值表 主频50Hz间谐波分析输出波形参见下图。 |图10主频50Hz间谐波分析输出波形 (b)FLUKE6100A以主频51Hz,幅值1V,叠加85Hz间谐波,幅值10%;121Hz间谐波,幅值10%。 主频51Hz时,PCI-9846采样间谐波数据输出波形如下图。 图11主频51Hz间谐波采样输出波形 通过谐波分析函数,间谐波的频率及幅值如下表。 表6主频51Hz间谐波频率幅值表 主频51Hz间谐波分析输出波形参见下图。 图12主频51Hz间谐波分析输出波形 3)高频谐波 (a)FLUKE6100A以主频50Hz,幅值1V,叠加82次谐波,幅值10%;95次谐波,幅值5%。 主频50Hz时,PCI-9846采样高频谐波数据输出波形如下图。 图13主频50Hz高频谐波采样输出波形 通过谐波分析函数,各次谐波的频率及幅值如下表。 表7主频50Hz高频谐波频率幅值表 主频50Hz高频谐波分析输出波形参见下图。 图14主频50Hz高频谐波分析输出波形 (b)FLUKE6100A以主频51Hz,幅值1V,叠加82次谐波,幅值10%;95次谐波,幅值5%。 主频51Hz时,PCI-9846采样高频谐波数据输出波形如下图。 图15主频51Hz高频谐波采样输出波形 通过谐波分析函数,各次谐波的频率及幅值如下表。 表8主频51Hz高频谐波频率幅值表 主频51Hz高频谐波分析输出波形参见下图。 图16主频51Hz高频谐波分析输出波形 由于PCI-9846高速数字化仪可采集高达20MHz宽动态范围的信号,且板上支持512MB的存储,方便同时分析电力系统中各种频率信号,包括各次谐波、间谐波、高频谐波以及次谐波,限于篇幅,不再赘述。 4、小结…

摩登3平台开户_虽然“缺芯少魂”,但AI芯片的战争才刚刚开始

芯片,目前在我国是一个高热度话题。尤其是在贸易战之后,每天有大量的报道充斥在我们周围:一边是我国芯片陷入“缺芯少魂”的绝境,一边又是我国AI芯片“赶超欧美”的欣喜。这些在对立面的报道大大增加了人们的疑惑,到底谁说的对,我国芯片行业目前真实的状态究竟是怎样? 其实,这两种看似对立的声音都是正确的,都是我国芯片行业目前真实的现状。只是有些人混淆了传统芯片与AI芯片的概念。 传统芯片,指的是中央处理器(CPU),它是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心(Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。 在传统芯片领域,美国一家独大,占全球市场份额的60%以上。美国的英特尔、AMD、高通、博通、英伟达等都是全球顶尖的芯片制造商。在这一方面,中国的确落后于美国,并且在短时间内极难追赶。“缺芯少魂”的说法也由此而来。 但在AI芯片领域,却呈现出一副截然不同的画面。 AI芯片并非广义的芯片 AI芯片并不是真正意义上的芯片,从某种意义上来说,能实现AI加速功能的半导体器件都可以被称为“AI芯片”。它可以被封装成芯片的形态,也可以被制成板卡的形态,所以AI芯片也被称为AI加速器或计算卡,是专门用于处理人工智能应用中的大量计算任务的模块(其他非计算任务仍由CPU负责)。 图:CPU的内部结构及工作原理      来源:百度百科 如图所示,以往CPU负责整个系统的基本计算和运行。但当整个系统都需要使用人工智能这项功能时,就需要消耗大量的算力。如果这时候仍由CPU的运算单元来提供算力,可能就会出现因为算力不足而“死机”的情况。 AI芯片就是为了完成这些额外计算任务而诞生的。 目前,根据芯片的架构,以及通用性和计算性能的差异,我们通常把AI芯片分为: GPU 、ASIC、FPGA、类脑芯片四大类。 GPU采用的是单指令、多数据处理结构,主要处理图像领域运算加速的任务。但GPU无法单独工作,必须由CPU进行控制调用才能工作。CPU可单独作用,处理复杂的逻辑运算和不同的数据类型,但当需要大量地处理类型统一的数据时,则可调用GPU进行并行计算。 ASIC芯片是供专门应用的集成电路芯片技术,在集成电路界被认为是一种为专门目的而设计的专用AI芯片。除了不能扩展以外,在功耗、可靠性、体积等方面都有优势,尤其在高性能、低功耗的移动端。 FPGA,即现场可编程门阵列。它是专用集成电路(ASIC)领域中的一种半定制电路,既解决了定制电路不足的问题,又克服了原有可编程器件门电路数有限的缺点,适用于多指令,单数据流的分析,常用于预测阶段,如云端。FPGA是用硬件实现软件算法,因此在实现复杂算法方面有一定的难度,缺点是价格比较高。 由于人脑结构精密且复杂,芯片想要模仿人脑的工作模式并不容易,所以目前类脑芯片只有个别传统芯片巨头在从事相关研发工作。 国产崛起,拉开战争序幕 纵观全球AI芯片格局,老牌芯片公司依然占据主导地位,但中国企业正在迅猛向前。 2018年,市场研究和咨询公司Compass Intelligence发布了年度全球AI芯片公司排名报告。根据报告显示,英伟达排名第一,英特尔、IBM、Google、苹果、AMD、ARM、高通、三星、恩智浦等公司位列2-10名。在Top24的榜单排行中,已有六家中国公司入围。分别是:第12位华为(海思)、第14位联发科(MediaTek)、第20位瑞芯微(Rockchip)排名第20位、第21位芯原(Verisilcon)、第23位寒武纪(Cambricon)排名第23位、第24位地平线(Horizon)。 由于CUDA开发平台的普及和较早研发GPU,英伟达的GPU是目前应用最广的通用AI硬件计算平台,它也牢牢地占据了榜单的第一名。 除了英伟达,其他老牌的芯片巨头也没“闲”着,特别是英特尔。通过收购Altera,英特尔获得了基于FPGA的AI方案,这让英特尔得以跻身行业第一梯队。 虽然中国企业暂时排名较后,但崛起的可能性无限。 如果从使用场景来看,AI芯片主要可分为两类:一个是在数据中心部署的云端,一个是在消费者端部署的终端。其中,云端主要以训练(Training)任务为主,终端以推理(Inference)任务为主。 训练任务即用大量标记过的数据来“训练”相应的系统,使之可以适应特定的功能。例如给系统海量的“人脸”的图片,系统会通过训练记住每张“人脸”的特点、细节、差异。 推理任务即用训练好的系统来完成任务。接上面的例子,就是你将一张图给之前训练过的系统,之后系统就会自动分辨出特定的“人脸”。 训练和推理在目前大多数的AI系统中,是相对独立的过程,两者对计算能力的要求也不尽相同。 完成训练任务,需要极高的计算性能,需要较高的精度,需要能处理海量的数据,需要有一定的通用性,以便完成各种各样的学习任务。所以拥有大量原始数据的中国芯片厂家,将会在此脱颖而出。 相对来说,推理任务对性能的要求并不高,对精度要求也要更低,在特定的场景下,对通用性要求也低,能完成特定任务即可。但因为推理的结果直接提供给终端用户,所以用户体验方面的优化更为重要。这也给了大量注重用户体验的中国企业新的超越机会。 在今年8月的人工智能大会上,华为的麒麟810、麒麟910、升腾310、升腾910;地平线“征程/旭日”系列、依图的“求索”;阿里旗下玄铁910、锐虎贲T710等AI芯片纷纷崭露头角。此外Thinkforce、翱捷和芯驰等后起之秀也在摩拳擦掌。 AI芯片的战争才刚刚开始。 作者:张伟超

摩登3娱乐怎么样?_C/C++中宏定义的经典运用

在C语言中宏定义是比较有用的技巧,在Linux源码中经常使用一些宏定义,比如宏container_of()等都是经典的宏定义表示方式。在C++不再主张使用宏定义,但是宏定义实际上却是是一个非常有用的手段。实质上宏定义能够搞定的实现采用其它的实现也是可以的,宏定义的作用是简单的替代作用,掌握这个是理解的关键,以前在没有代码阅读量的时候总是以为宏定义就是简单的定义一些常量什么的,实质上不然,宏定义完全可以写成函数的形式,但是宏定义和函数有一定的差别,函数的调用一般采用栈的方式实现,这时候存在局部变量,形参、实参等问题,如果不理解C语言的本质,很多时候非常容易搞错,但是宏定义则不然,宏定义没有调用的过程,宏的实现仅仅是一个替换过程,不用压栈出栈,宏实现的类似函数修改的就是当前区域中的变量,不是局部变量。这也是一些较深层次的问题,在刚学习C语言的时候很多人只要看见类似于函数的形式都认为是函数,实质上不一定,很有可能就是采用宏定义实现的类函数,这时候就可能导致所谓的形参实参问题发生较大的变化。关于宏的问题在面试笔试的过程中、写代码的过程中都是非常有用的部分,我就不再做介绍。 今天看了一遍博客《Reduce C-language coding errors with X macros》,感觉文章写得非常的好,也对自己写代码有了一定的帮助,所以就将该文章用我自己的语言,写出来和大家分享分享吧。 本文引用地址:http://www.eepw.com.cn/article/201612/324488.htm 在嵌入式实时操作系统中,经常将系统分成很多层次,很多个模块,每一个模块都有自己的初始化过程,这时候我们一般采用的形式如下所示: typedef void(*p_func_t)(void); enum { STATE_0, STATE_1, STATE_2, … STATE_M, NUM_STATES }; p_func_t inital_table[NUM_STATES] { func_0, func_1, func_2, … func_M, }; 这种实现方法是比较常见的实现方式,但是这种方法的缺点是所有的初始化过程是按照一定的顺序的,而且不能随机的初始化,因此如果在编码的过程中将状态号与初始化函数对应错误,将出现比较难以发现的错误,这种错误经常出现,当然有些编译器以及支持随机的初始化过程,但是并不具有通用性,而且这种实现方式代码比较多,能不能采用宏定义的方式简化代码量呢?当然是可以的,采用类似于函数的宏定义就可以实现,具体的实现如下: typedef void(*p_func_t)(void); #define STATE_TABLE ENTRY(STATE_0,func_0) ENTRY(STATE_1,func_1) ENTRY(STATE_2,func_2) ENTRY(STATE_3,func_3) ENTRY(STATE_4,func_4) enum{ #define ENTRY(a,b) a, STATE_TABLE #undef ENTRY NUM_STATES }; p_func_t inital_table[NUM_STATES] = { #define ENTRY(a,b) b, STATE_TABLE #undef ENTRY }; 上面这种实现方式的优点是运用了宏定义简少代码量。我做一个简要的分析,首先采用宏定义定义了一组ENYRT,其中包含两个参数,分别是状态号STATE_N,和状态对应的初始化函数,这种实现方式能够避免上面所谓的状态号与函数对应错误的问题,因为在宏定义的过程中一般都会认真的确定各种接口,对应好了只需要定义相关的函数就可以啦。在enum中采用了#define和#undef来限定这一组宏定义的作用范围,在个作用域中,ENTRY(a,b)是表示“a,”,需要注意不能忽略a后的,因为这就是在enum中定义变量后要添加的符号,我想大家应该知道enum{a,b,c,d}每一个成员后面都包含”,”的特性的。也就是说在这作用域中,ENTRY(a,b)被替换为”a,”,那么这时候STATE_TABLE就被替换为STATE_0,STATE_1等,然后和NUM_STATES就组成了第一个例程中的enum结构。而在p_func_t jumptable[NUM_STATES]仍然采用了了STATE_TABLE,由于采用了#define和#undef限定了宏的作用范围,这时的ENTRY(a,b)将被替代为“b,”,也就是func_0,func_1等,这样也就完成了函数指针数组的初始化过程,这样的初始化能够减少状态号与初始化函数对应出错的情况。 这样的实现也可以认为是宏定义的巧妙运用,但是这种方法还是存在一些问题,因为采用#define 和#undef这种方法很可能导致错误的产生,因为很有可能不能很好的把握这个限定作用域的使用方法,这时候可以采用一种新的类似函数的实现方法,可以让STATE_TABLE带一个参数,也就是采用类似命令的形式定义相关的内容: typedef void(*p_func_t)(void); /*以下产生几个常用的命令*/ /*enum产生*/ #define EXPAND_AS_ENUM(a,b) a, /*初始化表产生*/ #define EXPAND_AS_INITTABLE(a,b) b, /*声明各个函数*/ #define EXPAND_AS_FUNCDEC(a,b) void b(void); /*将STATE_TABLE的参数就是具体的命令*/ #define STATE_TABLE(ENTRY) ENTRY(STATE_0,func_0) ENTRY(STATE_1,func_1) ENTRY(STATE_2,func_2) ENTRY(STATE_3,func_3) ENTRY(STATE_4,func_4) /*定义enum*/ enum{ STATE_TABLE(EXPAND_AS_ENUM) NUM_STATES }; /*声明各个函数*/ STATE_TABLE(EXPAND_AS_FUNCDEC) /*初始化表*/ p_func_t inital_table[NUM_STATES] = { STATE_TABLE(EXPAND_AS_INITTABLE) }; 以上实现方法能够较好的避免#define和#undef的限定作用域问题,这实际上采用ENTRY作为参数传递给STATE_TABLE,然后ENTRY可用来实现不同的指令,这些指令的定义也是一系列的宏定义,这种实现架构能够比较好的避免缺少声明等问题。同时也较少了错误的产生可能。 上一页 1 2 下一页

摩登3注册网站_基于CC2430和DS18B20的无线测温系统设计

目前,很多场合的测温系统采用的还是有线测温设备,由温度传感器、分线器、测温机和监控机等组成,各部件之间采用电缆连接进行数据传输。这种系统布线复杂、维护困难、成本高,可采用无线方案解决这些问题。无线测温系统是一种集温度信号采集、大容量存储、无线射频发送、LED(或LCD)动态显示、控制与通信等功能于一体的新型系统。 本文从低功耗、小体积、使用简单等方面考虑,基于射频SoCCC2430和数字温度传感器DS18B20设计了一个无线测温系统,整个系统由多个无线节点和1个基站组成。无线节点工作在各个测温地点,进行温度数据采集和无线发送。基站与多个节点进行无线通信,并通过数码管将数据显示出来,同时可以通过RS-232串口将数据发送给PC。 CC2430简介 CC2430是TI/ChipconAs公司最新推出的符合2.4GIEEE802.15.4标准的射频收发器.利用此芯片开发的无线通信设备支持数据传输率高达250kbit/s可以实现多点对多点的快速组网。CC2430的主要性能参数如下:   (1)工作频带范围:2.400~2.4835GHz;  (2)采用IEEE802.15.4规范要求的直接序列扩频方式;   (3)数据速率达250kbit/s码片速率达2MChip/s;   (4)采用o-QPSK调制方式;   (5)超低电流消耗(RX:19.7mA,TX:17.4mA)高接收灵敏度(-99dBm);   (6)抗邻频道干扰能力强(39dB);   (7)内部集成有VCO、LNA、PA以及电源整流器 采用低电压供电(2.1~3.6V);   (8)输出功率编程可控;   (9)IEEE802.15.4MAC层硬件可支持自动帧格式生成、同步插入与检测、16bitCRC校验、电源检测、完全自动MAC层安全保护(CTR,CBC-MAC,CCM);   (10)与控制微处理器的接口配置容易(4总线SPI接口);   (11)采用QLP-48封装,外形尺寸只有77mm。CC2430只需要极少的外围元器件,其典型应用电路如图2所示。它的外围电路包括晶振时钟电路、射频输入/输出匹配电路和微控制器接口电路3个部分。                         芯片本振信号既可由外部有源晶体提供,有晶振1为基于CC2430芯片的ZigBee在智能交通系统中的应用32MHz,晶振2为32.768kHz。射频输入/输出匹配电路主要用来匹配芯片的输入输出阻抗,使其输入输出阻抗为60Ω,同时为芯片内部的PA及LNA提供直流偏置。 CC2430可以通过4线SPI总线(SI、SO、SCLK、CSn)设置芯片的工作模式 并实现读/写缓存数据 读/写状态寄存器等。通过控制FIFO和FIFOP管脚接口的状态可设置发射/接收缓存器。注意:在SPI总接口上进行的地址和数据传输大多是MSB优先的。   CC2420片内有33个16比特状态设置寄存器,在每个寄存器的读/写周期中,SI总线上共有24比特数据,分别为:1比特RAM/寄存器选择位(0:寄存器,1:RAM),1比特读/写控制位(0:写,1:读),6比特地址选择位、16比特数据位。在数据传输过程中CSn必须始终保持低电平。另外,通过CCA管脚状态的设置可以控制清除通道估计,通过SFD管脚状态的设置可以控制时钟/定时信息的输入。这些接口必须与微处理器的相应管脚相连来实现系统射频功能的控制与管理。CC2430先将要传输的数据流进行变换,每个字节被分组为两个符号,每个符号包括4个比特LSB优先传输。每个被分组的符号用32码片的伪随机序列表示,共有16个不同的32码片伪随机序列。经过DSSS扩频变换后,码片速率达到2Mchips/s,此码片序列再经过O-QPSK调制,每个码片被调制为半个周期的正弦波。码片流通过I/Q通道交替传输,两通道延时为半个码片周期。   CC2430为IEEE802.15.4的数据帧格式提供硬件支持。其MAC层的帧格式为 头帧+数据帧+校验帧;PHY层的帧格式为,同步帧+PHY头帧+MAC帧,帧头序列的长度可以通过寄存器的设置来改变。可以采用16位CRC校验来提高数据传输的可靠性。发送或接收的数据帧被送入RAM中的128字节的缓存区进行相应的帧打包和拆包操作。 DS18B20概述 DS18B20是美国DALLAS公司的“单总线”数字温度传感器,它具有结构简单、体积小、功耗低、无须外接元件、用户可自行设定预警上下限温度等特点。“单总线”结构独特而且经济,采用一根I/O数据线既可供电又可传输数据,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。 3引脚封装的DS18B20形如一只三极管,其内部结构如图2所示。主要由四部分组成:64位光刻ROM、温度传感器、非易失性的温度报警触发器和配置寄存器。此外,还有电源检测模块、存储和控制逻辑器、中间结果缓存器和8位循环冗余校验码(CRC)发生器。 ROM中的64位序列号是出厂前被光刻好的,可以看作该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。DS18B20内部的RAM由9个字节的高速缓存器和E2PROM组成,数据先写入高速缓存器,经校验后再传送给E2PROM。通过DS18B20功能命令对RAM进行操作。 DS18B20的测量温度范围为-55℃~125℃,在-10℃~85℃范围内,精度为0.5℃,可编程设定9~12位的分辨率,默认值为12位,转换12位温度信号所需时间为750ms(最大)。检测温度由2字节组成,字节1的高5位S代表符号位,字节0的低4位是小数部分,中间7位是整数部分。 无线测温系统组成及硬件设计 无线测温系统主要可分为基站和无线节点两大部分。每套系统一般只有1个基站,包括微控制器及射频收发单元、显示单元、报警单元、电源模块及接口单元,主要硬件连接。 接口单元是为了方便射频模块和PC的通信,通常可采用RS-232接口、USB接口、以太网接口等,其中,RS-232接口是目前PC与通信工业中应用最广泛的一种串行接口。本文使用RS-232接口,采用MAX3221芯片实现RS-232电平与TTL电平之间的转换。MAX3221是MAXIM公司生产的一种RS-232接口芯片,使用单一电源电压供电,电源电压在3.0~5.5V范围内都可以正常工作。 基站接收到数据后,将温度信息通过数码管(或液晶显示屏)显示出来,根据需要,还可以通过RS-232接口与PC进行通信。为简化系统,本设计直接用CC2430的I0口驱动数码管,但是I0口不具备数据保持能力,需要外接一定大小的上拉电阻,显示方法采用扫描法。采用一个蜂鸣器作为报警装置,当温度超过设定范围时,鸣叫报警。射频天线采用单鞭天线。 无线节点分布在温度采集点,由数字温度传感器DS18B20、射频CC2430、天线及电池组成。在实际应用中,可以有多个无线节点,它们与基站之间通过射频进行无线通信。DS18B20有寄生电源和外部电源两种供电方式,本文采用外部供电方式,VDD引脚直接连接外部电源。DS18B20在空闲时,其D1脚由上拉电阻置为高电平。无线节点的天线根据实际需要可选用单鞭天线,陶瓷天线或PCB印制天线 基于CC2430和DS18B20的无线测温系统工作原理及ZigBee网络   在系统中的工作架构无线温度信号控制系统的管理模式就是集中管理,分级控制,充分利用现有设施,按实际现状先进行单个用户的自适应协调,然后是主干线的协调控制,实现分布式协调的分级控制,最终达到区域控制的系统最优。        基于CC2430和DS18B20的无线测温的系统,系统具有以下几个特点:   (1)整个控制系统的各个模块具有高集成度、高可靠性和低功耗、低成本、体积小等优点,维护保养十分方便,只需更换相应节点即可,避免了传统控制线路本身带来许多麻烦,从而大大减少了设备购置成本,建设安装成本和系统维护成本。   (2)卓越的物理性能,整个网络所使用的无线频率是国际通用的免费频段(2.4~2.48GHzISM),传输的方式是抗干扰能力强的直序扩频方式(DSSS),特别适合在干扰较大的环境中使用。   (3)网络的自组织、自愈能力强,ZigBee的自组织功能:无需人工干预,网络节点能够感知其他节点的存在,并确定连接关系,组成结构化的网络;ZigBee自愈功能:增加或者删除一个节点,节点位置发生变动,节点发生故障等,网络都能够自我修复,并对网络拓扑结构进行相应地调整,无需人工干预,保证整个系统仍然能正常工作。 结束语   通过系统的设计和对于CC2430芯片的使用,感觉到ZigBee无线温度传感网络应用前景非常广阔,CC2430芯片是真正意义上的SOC芯片,使得我们开发ZigBee无线传感网络会更加方便,产品开发周期会大大缩短。 蜂鸣器相关文章:蜂鸣器原理

摩登3咨询:_三菱PLC与CC-Link配置与应用

CC-Link通信原理简介 本文引用地址:http://www.eepw.com.cn/article/201609/303858.htm CC-Link的底层通讯协议遵循RS485。 一般情况下,CC-Link主要采用广播-轮询的方式进行通讯。具体的方式是:主站将刷新数据(RY/RWw)发送到所有从站,与此同时轮询从站1;从站 1对主站的轮询作出响应(RX/RWr),同时将该响应告知其它从站;然后主站轮询从站2(此时并不发送刷新数据),从站2给出响应,并将该响应告知其它从站;依此类推,循环往复。广播-轮询时的数据传输帧格式请参照图2,该方式的数据传输率非常高。 除了广播-轮询方式以外,CC-Link也支持主站与本地站、智能设备站之间的瞬时通讯。从主站向从站的瞬时通讯量为150字节/数据包,由从站向主站的瞬时通讯量为34字节/数据包。瞬时传输时的数据传输帧格式请参照图2,由此可见瞬时传输不会对广播轮询的循环扫描时间造成影响。 CC所有主站和从站之间的通讯进程以及协议都由通讯用LSI-MFP(Mitsubishi Field Network Processor)控制,其硬件的设计结构决定了CC-Link的高速稳定的通讯。 CC-Link网络设置与编程 在基于CC-Link现场总线的应用过程中,最为重要的一部分便是对系统进行通信初始化设置。目前CC-Link通信初始化设置的方法一般有三种,1)采用的是最基本的方法,即通过编程来设置通信初始化参数。2)使用CC-Link通信配置的组态软件GX-Configurator for CC-Link,采用通信初试化设置的方法。该组态软件可以对A系列和QnA系列的PLC进行组态,实现通信参数的设置,整个组态的过程十分简单,但遗憾的是,目前该方法还不支持Q系列的PLC。3)通过CC-Link网络参数来实现通信参数设定。这是Q系列的PLC新增的功能,而A系列和QnA系列PLC并不具备这项功能。整个设置的过程相当方便。只要在GPPW软件的网络配置菜单中,设置相应的网络参数,远程I/O信号就可自动刷新到CPU内存,还能自动设置CC-Link远程元件的初始参数。如果整个CC-Link现场总线系统是由Q系列和64个远程I/O模块构成的,甚至不须设置网络参数即可自动完成通信设置的初试化。 对Q型PLC来说,利用网络参数设置的方法是最为简单有效的,只要按规定填写一定量的参数之后就能够很好的取代繁冗复杂的顺控程序。在发生错误或是需要修改参数时,同组态软件一样,也能很快地完成,减少设置时间。然而它的不足之处,在于设置过程中跳过了很多重要的细节,从而无法真正掌握PLC的内部的运作过程,比较抽象。例如在填写了众多参数之后,虽然各站的数据链路能正常执行,但是却无法理解这些参数之间是如何联系的,如何作用的,如何使得各站的数据链接得以正常完成。在实际CC-Link的应用中,通过网络参数来进行通信初始化设置的方法不失为一种最为优越的方法,方便、可靠、功能全面这三点就已经很好的满足了系统的需求,缩短了CC-Link现场总线在应用于各种不同的工控场合时设计和调试的时间,降低了工作的难度,更方便了以后的故障检修和维护。遗憾的是它只适用于小Q系列PLC。

C/C++中宏定义的经典运用

在C语言中宏定义是比较有用的技巧,在Linux源码中经常使用一些宏定义,比如宏container_of()等都是经典的宏定义表示方式。在C++不再主张使用宏定义,但是宏定义实际上却是是一个非常有用的手段。实质上宏定义能够搞定的实现采用其它的实现也是可以的,宏定义的作用是简单的替代作用,掌握这个是理解的关键,以前在没有代码阅读量的时候总是以为宏定义就是简单的定义一些常量什么的,实质上不然,宏定义完全可以写成函数的形式,但是宏定义和函数有一定的差别,函数的调用一般采用栈的方式实现,这时候存在局部变量,形参、实参等问题,如果不理解C语言的本质,很多时候非常容易搞错,但是宏定义则不然,宏定义没有调用的过程,宏的实现仅仅是一个替换过程,不用压栈出栈,宏实现的类似函数修改的就是当前区域中的变量,不是局部变量。这也是一些较深层次的问题,在刚学习C语言的时候很多人只要看见类似于函数的形式都认为是函数,实质上不一定,很有可能就是采用宏定义实现的类函数,这时候就可能导致所谓的形参实参问题发生较大的变化。关于宏的问题在面试笔试的过程中、写代码的过程中都是非常有用的部分,我就不再做介绍。 今天看了一遍博客《Reduce C-language coding errors with X macros》,感觉文章写得非常的好,也对自己写代码有了一定的帮助,所以就将该文章用我自己的语言,写出来和大家分享分享吧。 本文引用地址:http://www.eepw.com.cn/article/201612/324488.htm 在嵌入式实时操作系统中,经常将系统分成很多层次,很多个模块,每一个模块都有自己的初始化过程,这时候我们一般采用的形式如下所示: typedef void(*p_func_t)(void); enum { STATE_0, STATE_1, STATE_2, … STATE_M, NUM_STATES }; p_func_t inital_table[NUM_STATES] { func_0, func_1, func_2, … func_M, }; 这种实现方法是比较常见的实现方式,但是这种方法的缺点是所有的初始化过程是按照一定的顺序的,而且不能随机的初始化,因此如果在编码的过程中将状态号与初始化函数对应错误,将出现比较难以发现的错误,这种错误经常出现,当然有些编译器以及支持随机的初始化过程,但是并不具有通用性,而且这种实现方式代码比较多,能不能采用宏定义的方式简化代码量呢?当然是可以的,采用类似于函数的宏定义就可以实现,具体的实现如下: typedef void(*p_func_t)(void); #define STATE_TABLE ENTRY(STATE_0,func_0) ENTRY(STATE_1,func_1) ENTRY(STATE_2,func_2) ENTRY(STATE_3,func_3) ENTRY(STATE_4,func_4) enum{ #define ENTRY(a,b) a, STATE_TABLE #undef ENTRY NUM_STATES }; p_func_t inital_table[NUM_STATES] = { #define ENTRY(a,b) b, STATE_TABLE #undef ENTRY }; 上面这种实现方式的优点是运用了宏定义简少代码量。我做一个简要的分析,首先采用宏定义定义了一组ENYRT,其中包含两个参数,分别是状态号STATE_N,和状态对应的初始化函数,这种实现方式能够避免上面所谓的状态号与函数对应错误的问题,因为在宏定义的过程中一般都会认真的确定各种接口,对应好了只需要定义相关的函数就可以啦。在enum中采用了#define和#undef来限定这一组宏定义的作用范围,在个作用域中,ENTRY(a,b)是表示“a,”,需要注意不能忽略a后的,因为这就是在enum中定义变量后要添加的符号,我想大家应该知道enum{a,b,c,d}每一个成员后面都包含”,”的特性的。也就是说在这作用域中,ENTRY(a,b)被替换为”a,”,那么这时候STATE_TABLE就被替换为STATE_0,STATE_1等,然后和NUM_STATES就组成了第一个例程中的enum结构。而在p_func_t jumptable[NUM_STATES]仍然采用了了STATE_TABLE,由于采用了#define和#undef限定了宏的作用范围,这时的ENTRY(a,b)将被替代为“b,”,也就是func_0,func_1等,这样也就完成了函数指针数组的初始化过程,这样的初始化能够减少状态号与初始化函数对应出错的情况。 这样的实现也可以认为是宏定义的巧妙运用,但是这种方法还是存在一些问题,因为采用#define 和#undef这种方法很可能导致错误的产生,因为很有可能不能很好的把握这个限定作用域的使用方法,这时候可以采用一种新的类似函数的实现方法,可以让STATE_TABLE带一个参数,也就是采用类似命令的形式定义相关的内容: typedef void(*p_func_t)(void); /*以下产生几个常用的命令*/ /*enum产生*/ #define EXPAND_AS_ENUM(a,b) a, /*初始化表产生*/ #define EXPAND_AS_INITTABLE(a,b) b, /*声明各个函数*/ #define EXPAND_AS_FUNCDEC(a,b) void b(void); /*将STATE_TABLE的参数就是具体的命令*/ #define STATE_TABLE(ENTRY) ENTRY(STATE_0,func_0) ENTRY(STATE_1,func_1) ENTRY(STATE_2,func_2) ENTRY(STATE_3,func_3) ENTRY(STATE_4,func_4) /*定义enum*/ enum{ STATE_TABLE(EXPAND_AS_ENUM) NUM_STATES }; /*声明各个函数*/ STATE_TABLE(EXPAND_AS_FUNCDEC) /*初始化表*/ p_func_t inital_table[NUM_STATES] = { STATE_TABLE(EXPAND_AS_INITTABLE) }; 以上实现方法能够较好的避免#define和#undef的限定作用域问题,这实际上采用ENTRY作为参数传递给STATE_TABLE,然后ENTRY可用来实现不同的指令,这些指令的定义也是一系列的宏定义,这种实现架构能够比较好的避免缺少声明等问题。同时也较少了错误的产生可能。 上一页1 2 下一页