Aguilera

  • 2019-02-19
  • 发表了主题帖: 指令集架构、arm内核、SoC、处理器、CPU、GPU等的关系

      ARM内核如:ARM7、ARM9、ARM11(v6)、到cortex-A7、A8、A9、A12、A15(v7-A/R)、到cortex-A53、A57(V8)、A72、A73。缓存(cache)就是在内核中的[4]。这些内核又名公版架构,即ARM推出的通用的架构。        SoC芯片如:高通(Qualcomm)的骁龙(Snapdragon)820、821,835;麒麟950(4XCortex-A72+4XCortex-A53)、960(4*Cortex-A73+4*Cortex-A53);联发科的HelioX20、X25、X30;三星的Exynos8890、7420、5433等。还有如STM32(基于ARM cortex M3内核)        再次,现在我们口中所说的处理器,已经不是过去那种单指cpu的年代了,确切的说应该是指SoC。SoC(System on Chip): 称为系统级芯片,也称为片上系统,意指它是一个产品,是一个有专有目标的集成电路,其中包含完整系统并嵌入软件的全部内容。官方定义为将微处理器、模拟IP核、数字IP核和存储器(或者片外存储接口)集成在单一芯片上。——简单的比喻一下,如果把CPU看成人体的大脑,那么SoC就是我们人的身体总成(还要包括各种器官、组织)。即GPU、总线、显示加速器、ISP、视频编解码器、音频处理器、Memory控制器、传感器处理单元,以及DDR、Flash、显示接口、Camera接口、射频RF、USB等对外接口。要把这些元器件集成在一起,构成一个整体。而且还要保证各个元器件之间能够协调、稳定的运行,这样的设计技术所投入的研发费用并不是每个厂商能够接受的[2]。        ARM公司本身并不参与终端处理器芯片的制造和销售,而是通过向其它芯片厂商授权设计方案,来获取收益。——举个例子,如果处理器相当于一栋完整的建筑, ARM就像是建筑的框架,至于最后建造出来的房子长什么样,舒适度如何,就是由处理器厂商自己决定了。但是采用相同架构的处理器,性能基本上已经锁定在一定的范围之内,不会有本质的区别。所以,看处理器的性能要先看微架构[3]。        ARM公司提供两类CPU授权:核心指令集授权,以及现成的CPU内核设计方案授权[2][3]。业内多数手机处理器厂商选择直接购买ARM CPU内核设计方案,然后与其它组件(比如GPU、多媒体处理、调制解调器等等)整合,制造出完整的SoC片上系统。这些现成的CPU都是基于ARM Cortex A5、A8、A9,甚至A15微架构的。或是基于现有的架构进行二次定制修改的,比如三星的蜂鸟Hummingbird核心等都是在Cortex-A8的基础上修改的。2011年,三星正式推出Exynos4 Dual 4210芯片(Dual代表双核)和对应的新旗舰手机Galaxy SII,同时也将“蜂鸟”改名为Exynos3 Single 3110(single代表单核),这正是之后Exynos家族的开端。2016年第一季度,三星发布了Exynos8 Octa 8890(Octa代表8核),它有一个非常重大的意义在于——这是三星第一款拥有自研架构的ARM芯片[22]。注意,经过我的调研,所谓的自研架构,也可以称为自研微架构,其实就是自己研究出来类似于cortex-A53,A73等类似的这些公版的核,也称为公版微架构。        但也有少数手机处理器厂商,如高通,直接在ARM v7指令集的基础上深度开发自己的处理器微架构,如高通公司的Scorpion和Krait,进而设计自主的CPU,具有更大的灵活性。Scorpion和Krait的角色就和cortex A53和cortex A57的角色类似和ARMv7、v8的角色类似[6]。Scorpion(蝎子)是高通根据Cortex-A8修改的,关键的特点是同频下更加节能约30%左右,现在的骁龙820以及835采用的是Kryo架构[27],其中820是Kryo,835是其升级版Kryo280。        题外话:华为早在2013年已经取得了ARM的架构授权,即华为可以对ARM原有架构进行改造和对指令集进行扩展或缩减。从2013年至今华为麒麟处理器已经从910更新到960。依照华为公司对技术的执着和对未知领域探索的热情。他们没有理由不对ARM原有架构进行改造和优化,加入自身对架构的独特理解。也就是说,在华为麒麟处理器中所使用的A53+A72架构中已经拥有自己的技术和创新(这种创新就类似于原来三星蜂鸟对Coretex-A8的那种小小的改动)。其实,苹果处理器所采用的的架构也是从ARM架构上演变来的。所以,华为麒麟处理器以后肯定会出自己的架构,不过这需要长时间的研制和技术的积累。即:推出类似于高通的Scorpion、Krait、Kryo、三星的Mongoose,苹果的Swift(基于ARMv7)、Cyclone、TYphoon、Twister,英伟达的Denver这些东西。

  • 2019-02-17
  • 发表了主题帖: 调试TMS320C2000系列的常见问题?

    1)单步可以运行,连续运行时总回0地址: Watchdog没有关,连续运行复位DSP回到0地址。 2)OUT文件不能load到片内flash中: Flash不是RAM,不能用简单的写指令写入,需要专门的程序写入。CCS和C Source Debugger中的load命令,不能对flash写入。 OUT文件只能load到片内RAM,或片外RAM中。 3)在flash中如何加入断点: 在flash中可以用单步调试,也可以用硬件断点的方法在flash中加入断点,软件断点是不能加在ROM中的。硬件断点,设置存储器的地址,当访问该地址时产生中断。 4)中断向量: C2000的中断向量不可重定位,因此中断向量必须放在0地址开始的flash内。在调试系统时,代码放在RAM中,中断向量也必须放在flash内。

  • 发表了主题帖: TMS320系列如何选择外部时钟

    TMS320系列内部指令周期较高,外部晶振的主频不够,因此DSP大多数片内均有PLL。但每个系列不尽相同。 1)TMS320C2000系列: TMS320C20x:PLL可以÷2,×1,×2和×4,因此外部时钟可以为5MHz-40MHz。 TMS320F240:PLL可以÷2,×1,×1.5,×2,×2.5,×3,×4,×4.5,×5和×9,因此外部时钟可以为2.22MHz-40MHz。 TMS320F241/C242/F243:PLL可以×4,因此外部时钟为5MHz。 TMS320LF24xx:PLL可以由RC调节,因此外部时钟为4MHz-20MHz。 TMS320LF24xxA:PLL可以由RC调节,因此外部时钟为4MHz-20MHz。 2)TMS320C3x系列: TMS320C3x:没有PLL,因此外部主频为工作频率的2倍。 TMS320VC33:PLL可以÷2,×1,×5,因此外部主频可以为12MHz-100MHz。 3)TMS320C5000系列: TMS320VC54xx:PLL可以÷4,÷2,×1-32,因此外部主频可以为0.625MHz-50MHz。 TMS320VC55xx:PLL可以÷4,÷2,×1-32,因此外部主频可以为6.25MHz-300MHz。 4)TMS320C6000系列: TMS320C62xx:PLL可以×1,×4,×6,×7,×8,×9,×10和×11,因此外部主频可以为11.8MHz-300MHz。 TMS320C67xx:PLL可以×1和×4,因此外部主频可以为12.5MHz-230MHz。 TMS320C64xx:PLL可以×1,×6和×12,因此外部主频可以为30MHz-720MHz

  • 2019-02-16
  • 发表了主题帖: MSP430控制的DDS输出波形为正弦波和方波c语言程序

    //***************************************************// //                  子程序说明                       // //***************************************************// //函数1:  ad9850_reset() //        复位ad9850,之后为并口写入模式         //函数2:  ad9850_reset_serial() //        复位ad9850,之后为串口写入模式 //函数3:  ad9850_wr_parrel(unsigned char w0,double frequence) //        并口写ad9850数据,w0为ad9850中w0的数据,frequence //        为写入的频率    //函数4:  ad9850_wr_serial(unsigned char w0,double frequence) //        串口写ad9850数据,w0为ad9850中w0的数据,frequence //        为写入的频率    //需定义的位:          //ad9850_w_clk    ;          //ad9850_fq_up    ;          //ad9850_rest     ;          //ad9850_bit_data ; //例:          //sbit ad9850_w_clk    =P2^2;          //sbit ad9850_fq_up    =P2^1;          //sbit ad9850_rest     =P2^0;          //sbit ad9850_bit_data =P1^7; //***************************************************// //                 写数据说明                        // //***************************************************// //写数据例: //       ad9850_reset() //       wr_lcd02_data(unsigned char x) //       ad9850_wr_parrel(0x01,1000) //       ad9850_wr_serial(0x01,1000) //***************************************************// //---------------------------------------------------// //                   程序                            // //---------------------------------------------------// # include <msp430f149.h> # include <stdio.h> #define ad9850_w_clk_High   P2OUT|=0x04 #define ad9850_w_clk_Low    P2OUT&=~0x04 #define ad9850_fq_up_High   P2OUT|=0x02 #define ad9850_fq_up_Low    P2OUT&=~0x02 #define ad9850_rest_High    P2OUT|=0x01 #define ad9850_rest_Low     P2OUT&=~0x01 #define ad9850_bit_data     P1OUT //***************************************************// //              ad9850复位(并口模式)                 // //---------------------------------------------------// void ad9850_reset() {   ad9850_w_clk_Low;   ad9850_fq_up_Low;   ad9850_rest_Low;   ad9850_rest_High;   ad9850_rest_Low; } //***************************************************// //              ad9850复位(并口模式)                 // //---------------------------------------------------// void ad9850_reset_serial() { ad9850_w_clk_Low; ad9850_fq_up_Low; //rest信号   ad9850_rest_Low;   ad9850_rest_High;   ad9850_rest_Low; //w_clk信号 ad9850_w_clk_Low; ad9850_w_clk_High; ad9850_w_clk_Low; //fq_up信号 ad9850_fq_up_Low; ad9850_fq_up_High; ad9850_fq_up_Low; } //***************************************************// //          向ad9850中写命令与数据(并口)             // //---------------------------------------------------// void ad9850_wr_parrel(unsigned char w0,double frequence) { unsigned char w; long int y; double x; //计算频率的HEX值 x=4294967295/125;//适合125M晶振 //如果时钟频率不为125MHZ,修改该处的频率值,单位MHz !!! frequence=frequence/1000000; frequence=frequence*x; y=(double)frequence; //写w0数据 w=w0;    ad9850_bit_data=w;      //w0 ad9850_w_clk_High; ad9850_w_clk_Low; //写w1数据 w=(y>>24); ad9850_bit_data=w;      //w1 ad9850_w_clk_High; ad9850_w_clk_Low; //写w2数据 w=(y>>16); ad9850_bit_data=w;      //w2 ad9850_w_clk_High; ad9850_w_clk_Low; //写w3数据 w=(y>>8); ad9850_bit_data=w;      //w3 ad9850_w_clk_High; ad9850_w_clk_Low; //写w4数据 w=(y>>=0); ad9850_bit_data=w;      //w4 ad9850_w_clk_High; ad9850_w_clk_Low; //移入始能 ad9850_fq_up_High; ad9850_fq_up_Low; } //***************************************************// //                   测试程序1000Hz                  // //---------------------------------------------------// main() {    WDTCTL=WDTPW+WDTHOLD;    P1DIR=0XFF;    P2DIR=0XFF; //---------------------------------------------------// //并行写1000Hz程序 ad9850_reset(); ad9850_wr_parrel(0x00,1); //---------------------------------------------------// while(1) { } }

  • 发表了主题帖: EDMA3--PARAM中的LINK项

    PaRAM中的LINK地址是对PaRAM0的16位偏移地址。在PaRAM对应的传输完成后,会用链接目标PaRAM的内容覆盖整个当前PaRAM表(包括目标PaRAM中的LINK地址)。如果一个PaRAM链接到0xffff(空表),那么当返回一个A、B、C计数器均为0的空搬移表格。如果希望当前PaRAM中的值维持原值,可以LINK到一个“LINK地址配置为自己的备份PaRAM表”,这样传输结束后重复加载新表中的内容。这样就可以在下次事件触发的时候重复执行该操作。 下图为由PaRAM表3链接到PaRAM表511,执行完两次传输后表3成为空表,PaRAM表511中的内容不变 下图为下图为由PaRAM表3链接到PaRAM表511,PaRAM表511中的LINK是指向自身地址0x7FE0,可以重复加载执行。(如果表3和表511中的操作相同,可以直接在表3中指向表3,即可重加载自身)。

  • 发表了主题帖: 说下DSP的音频处理

           从激光唱盘(CD)到超级音频CD(SACD)、DVD音频唱盘和MP3多媒体播放器,数字形式的音频技术越来越流行,音频处理已经取得了长足的进步。本文重点探讨DSP的音频处理。            现在大多数音频处理仍然在模拟领域进行,因为早期的数字处理解决方案--基于通用的DSP和外部的模数转换器(ADC)和数模转换器(DAC)使得在硬件和软件编程上的额外费用明显增加。因此实现这样的解决方案很困难、耗时而且成本又很高。现在已经出现了在一片集成电路上集成了一个音频专用DSP和高性能音频数据转换器的解决方案。可以提供专业品质的数字声音处理,具有112dB信噪比(SNR)、完全图形用户界面开发和编程工具以及较好的性价比,允许传统的模拟系统采用数字技术而具有上乘的声音品质。AD1954SigmaDSP就是一个实例,它带有内置DSP功能的一个完整的26-bit、单片、3个声道的数字音频播放系统。其主要特性包括:3个数字音频声道;一个7频段48-bit的立体声均衡器;用于扩音器位置调节的延时器;Phat Stereo空间增强模块;一个双频段结构专业品质的动态处理器。 一、音频专用DSP内核 针对音频处理要求进行优化后的一种DSP内核。这种用户配置DSP内核比通用DSP内核具很明显的优势,因为它能提供很多特点,例如用于双精度滤波器计算的硬件加速器和动态处理。这些特点能够显著减少对给定音频算法所需要的指令周期数。这个DSP内核基于一个带双48-bit累加器的26x22乘法累加引擎。当输入字长是24bit时,该内核的内部分辨率按照3.23格式(3bit指数和23bit尾数)是26bit。许多音频算法要求+12dB增益,额外2bit提供高达+12dB的增益,从而确保大多数应用中不需要增加增益。 所有滤波器都是利用专用硬件加速器以48-bit双精度分辨率进行计算。双精度操作确保低频的无限长脉冲响应(IIR)滤波器可以正确工作,避免有限周期问题的困扰,否则会产生人为杂音。 二、图形用户界面 不管是有经验的数字电路工程师,还是熟悉自己的音频系统但不想陷入到对"bit和byte"进行低级DSP编程中去的模拟电路工程师,图形用户界面(GUI)都能使他们很容易将DSP加入到系统中。这种工具不仅可以进行直观的操作,而且可以实时地控制整个信号流程。 它用图形示出信号流程,因此使用起来确实很直观。设计工程师对信号链中的每一个参数,包括滤波器系数、音量设置和动态处理函数,都可以直接访问和实时修改。这种GUI可通过PC机的打印机口连接到评估板。通过这种方式,任何参数的改变都可通过SPI串口发出,并且立即生效。 三、根据需要设计用户配置程序 就算使用内部程序最简单并且最节省设计时间,但设计工程师可能仍希望根据其系统的需要用户配置专门的信号流程。图形编译器是一个完全图形程序开发工具。图形输入工具允许系统设计工程师画出用户配置的信号流程并且当按下按钮后就将其编译成DSP程序。无需逐行代码开发,从而使得这种工作流程对模拟电路工程师特别友好。 该DSP是用作3声道音箱的处理引擎。处理过程包括:总均衡模块、3声道分频模块、单驱动器均衡模块、各个单驱动器动态范围控制模块,用于驱动器位置调节(相位校正)的延时模块,以及具有112dBSNR的DAC。 四、专业品质动态处理的重要性 中小规模音频系统常常受其放大器和扬声器的功率限制。另外,由于音箱的尺寸小,低频扬声器的频率响应经常在较低频率上有一个过早的自然滚降。因此,采用相当强的均衡是非常流行的做法,特别是在低音区(低音提升电路),以便补偿这种声音的不完善设置。最后,通常希望(如果不是要求)系统具有很高的最大音量。 系统的有限的放大器功率、较重的低音均衡和高的系统总响度三者相结合,很快使放大器饱和并开始产生严重失真,这会给人们带来不满乃至厌烦的感受。以前试图解决这个问题的几种方法都使用了可以避免削波失真简单的削波检测器,但由此导致的人为杂音与削波失真一样的不佳效果。然而,使用AD1954SigmaDSP专业品质、双频段动态处理器可以控制该系统的限制而不产生人为杂音。 五、提高系统的清晰度和响度 一个是没有任何动态处理的传输函数,另一个是带转折点可调的压缩器与限幅器功能的传输函数。由于使用动态处理,可以在高音量区无失真地处理自然削波电平。这实际上允许用户把系统音量提高约10dB。音量增加10dB表示声压级增加了一倍,从而用户可以将系统的响度提高到原来的两倍。这样就需要对现实世界影响声音因素的调整,带用户配置DSP动态处理器的传递函数可任意调整,它可以将几种动态处理功能组合为一条功能曲线。它有四种典型功能,包括:压缩、限幅、扩展和噪声门限。由于这种传递函数完全可编程,所以这些功能非常容易实现,即可单独使用,也可以组合起来使用。 六、结束语 音频专用DSP技术的引入将音频系统的嵌入式设计带入了一个新纪元。数字领域的处理性能、变换技术和复杂算法都以图形形式出现,使其应用更为方便和经济。这种DSP技术使设计工程师快速开发或把他们的系统移植到数字领域,因此可以充分发挥数字媒体的高品质。

  • 2019-02-15
  • 发表了主题帖: 几个LM386音频放大电路分享

    LM386是美国国家半导体公司生产的音频功率放大器,主要应用于低电压消费类产品。为使外围元件最少,电压增益内置为20。但在1脚和8脚之间增加一只外接电阻和电容,便可将电压增益调为任意值,直至200。输入端以地位参考,同时输出端被自动偏置到电源电压的一半,在6V电源电压下,它的静态功耗仅为24mW,使得LM386特别适用于电池供电的场合。 LM386的封装形式有塑封8引线双列直插式和贴片式。 特性(Features): * 静态功耗低,约为4mA,可用于电池供电。 * 工作电压范围宽,4-12V or 5-18V。 * 外围元件少。 * 电压增益可调,20-200。 * 低失真度。

  • 发表了主题帖: CS8626引脚图 免滤波、50W单声道D类功放 HT8696电路图

    CS8626 免滤波、50W单声道D类音频放大器性能简介 概要CS8626E是一款55W单声道高效D类音频功率放大电路。先进的EMI抑制技术使得在输出端口采用廉价的铁氧体磁珠滤波器就可以满足EMC要求。CS8626E单通道音频功率放大 器是为需要输出高质量音频功率的系统设计。 CS8626引脚图HT8696电路图

  • 发表了主题帖: 功放的6种保护功能以及常见的故障维修方法

    功放的六种保护功能:   1、软启动保护   在大电流吸取量的音响设备,接通电源的瞬间其流过的电流值可以达到其平均电流值的4-10 倍时,对电网和设备本身都是一个冲击,严重的时候会损坏设备。   此时软启动电路能在设备开关的瞬间抑制电流的涌入量,让它平稳的达到正常起到保护设备和不引起电网波动的作用。通常用热敏电阻(NTC)的负温度特性来实现这个功能。   2、直流保护   当功放输出级发生损坏时或静态偏置发生偏移时都有可能输送出直流信号。而对于扬声器来说,它的工作方式只对交流信号产生阻抗,对于直流信号它不产生任何的阻抗(等于零阻抗),这时的电流就为无穷大,因此扬声器的线圈在直流信号下就等同于一根发热丝会被迅速烧毁。   因此准确快速的直流保护电路是非常重要的。功放的直流保护启动值通常设定在 2V,当大于或等于这个值的时候功放会切断输出,保护扬声器。当然,也有功放将会用烧断内置的直流保险丝的方式来切断输出。   如果一台功放的直流保护电路是正常的,但是扬声器的线圈给烧掉了,只有两个原因:输入到扬声器的功率过大,或者功放输出的信号产生削顶变成方波。   3、短路保护   当功放输出级发生损坏时或静态偏置发生偏移时都有可能输送出直流信号。而对于扬声器来说,它的工作方式只对交流信号产生阻抗,对于直流信号它不产生任何的阻抗(等于零阻抗),这时的电流就为无穷大,因此扬声器的线圈在直流信号下就等同于一根发热丝会被迅速烧毁。   因此准确的快速的直流保护电路是非常重要的。功放的直流保护启动值通常设定在 2V,当大于或等于这个值的时候功放会切断输出,保护扬声器。当然,也有功放将会用烧断内置的直流保险丝的方式来切断输出。   如果一台功放的直流保护电路是正常的,但是扬声器的线圈给烧掉了,只有两个原因:输入到扬声器的功率过大,或者功放输出的信号产生削顶变成方波。   4、过流保护   当功放的负载太低但又没有达到短路状态,这时候短路保护不会动作,但输出的电流会非常之大超过功放的安全使用值,这时候过流保护电路就会介入工作,通常的做法是:控制输入电压和输出电流,让功放始终工作在在安全范围内。   5、过热保护   设计优良的功放在正常使用的情况下,不会出现过热保护,只有当外部使用环境恶劣或内部发生故障的时候才会动作。整台功放最热的地方就是输出级晶体管的C极(集电极),因此过热保护的温度感应器一般安装在离晶体管的 C 极最近地方或散热器上最热的地方。   过热保护的阀值一般为95℃,也有105℃,晶体管的极端承受温度是105℃。   6、失真压限器   音响设备的输入电平值都有一个规定的范围,如果超出这个范围,信号就会产生削顶,严重的时候会变成方波。失真限幅器的作用是保证输入信号的电平始终控制在音响设备允许的线性工作区范围内。一般的标准是THD1%时启动。   附: 功放常见的故障维修   1、整机不工作   整机不工作的故障表现为通电后放大器无任何显示,各功能键均失效,也无任何声音,像未通电时一样。   检修时首先应检查电源电路。可用万用表测量电源插头两端的直流电阻值(电源开关应接通),正常时应有数百欧姆的电阻值。若测得阻值偏小许多,且电源变压器严重发热,说明电源变压器的初级回路有局部短路处;若测得阻值为无穷大,应检查保险丝是否熔断、变压器初级绕组是否开路、电源线与插头之间有无断线。有的机器增加了温度保护装置,在电源变压器的初级回路中接人了电流保险丝(通常安装在电源变压器内部,将变压器外部的绝缘纸去掉即可见到),它损坏后也会使电源变压器初级回路开路。   若电源插头两端阻值正常,可通电测量电源电路各输出电压是否正常。对于采用系统控制微处理器或逻辑控制电路的放大器,应着重检查该控制电路的供电电压(通常为+5V)是否正常。   如无+5V电压,应测量三端稳压集成电路7805的输入端电压是否正常,若输入端电压不正常,应检查整流、滤波电路。若7805输入端电压正常,而输出端无十5V电压或电压偏低,可断开负载看+5V电压能否恢复正常。若+5V电压正常,则故障在负载电路;若+5V电压仍不正常,则故障在7805本身。   若系统控制电路的+5V供电电压正常,应再检查微处理器的时钟及复位信号是否正常、键控与显示驱动电路有无损坏。   2、无声音输出   无声故障表现为操作各功能键时,有相应的状态显示,但无信号输出。   检修有保护电路的放大器时,应看开机后保护继电器能否吸合。若继电器无动作,应测量功放电路中点输出电压是否偏移、过流检测电压是否正常。若中点输出电压偏移或过流检测电压异常,说明功率放大电路有故障,应检查正、负电源是否正常。若正、负电压不对称,可将正、负电源的负载电路断开,以判断是电源电路本身不正常还是功放电路有故障所致。若正、负电源正常,应检查功放电路中各放大管有无损坏。   若功放电路中点输出电压和过流检测电压均正常,而保护继电器不吸合,则故障在保护电路,应检查继电器驱动集成电路或驱动管有无损坏、各检测电路是否正常。若继电器触点能吸合,但无声音输出,应先检查扬声器是否正常、继电器触点是否接触良好、静噪电路是否动作。   若上述部分均正常,再用信号干扰法检查故障是在功放后级还是前级电路。用万用表的R×1挡,将红表笔接地,黑表笔快速点触后级放大电路的输入端,若扬声器中有较强的“喀喀”声,说明故障在前级放大电路;若扬声器无反应,则故障在后级放大电路。   对于未采用外设保护电路的集成电路功放电路(通常在集成电路内部有热保护),可先测量其供电电压正常与否。若供电电压正常,再用信号干扰法检查:在功放集成电路的信号输入端加入直流断续信号,若扬声器有较强的“喀喀”声,说明功放集成电路正常,故障在前级放大电路;若无“喀喀”声,而且检查有关外围元件也正常,则故障在功放集成电路本身。   电子管功放无声音输出,也应先检查其电源,观看灯丝是否亮,管壳温度是否正常。若灯丝不亮,管壳很凉,应检查功放管灯丝及屏极电压正常与否。若电压不正常,再进—步检查电源电路,必要时应断开电源负载电路,以确定是电源电路故障还是负载有短路。若各电压正常,可在音量电位器的中心头加入直流断续干扰信号,若有较强反应,说明后级放大电路正常,故障在前级放大电路;反之,故障在后级放大电路。可分别在推动管的栅极和输入放大管的栅极加入干扰信号,在哪—级加干扰信号无反应,说明该级后面的电路工作不正常。对可疑元件(如电子管)可用代换法检修。   具有杜比环绕声解码功能的AV放大器,若在杜比环绕声状态肘各声道均无声而直通状态下主声道声音正常,在电源电路正常的情况下,通常是杜比环绕声解码电路或系统控制电路工作不正常。若在环绕声和直通模式下各声道均无声,应检查系统控制电路、信号选择电路和总音量控制电路。   3、音轻   所谓音轻故障,是指音频信号在放大传输过程中,因某个放大级放大量变化或在某个环节被衰减,使放大器的增益下降或输出功率变小。   检修时,首先应检查信号源和音箱是否正常,可用替换的办法来检查。然后检查各类转换开关和控制电位器,看音量能否变大。   若以上各部分均正常,应判断出故障是在前级还是在后级电路。对于某一个声道音轻,可将其前级电路输出的信号交换输入到另一声道的后级电路,若音箱的声音大小不变,则故障在后级电路;反之,故障在前级电路。   后级放大电路造成的音轻,主要有输出功率不足和增益不够两种原因。可用适当加大输入信号(例如将收录机输出给扬声器的信号直接加至后级功放电路的输入端,改变收录机的音量,观察功放输出的变化)的方法来判断是哪种原因引起的。   若加大输入信号后,输出的声音足够大,说明功放输出功率足够,只是增益降低,应着重检查继电器触点有无接触电阻增大、输入耦合电容容量减小、隔离电阻阻值增大、负反馈电容容量变小或开路、负反馈电阻阻值增大或开路等现象。   若加大输入信号后,输出的声音出现失真,音量并无显著增大,说明后级放大器的输出功率不足,应先检查放大器的正、负供电电压是否偏低(若只是一个声道音轻,可不必检查电源供电)、功率管或集成电路的性能是否变差、发射极电阻阻值有无变大等。   前级电路中转换开关、电位器所造成的音轻,采用直观检查较易发现,可对其进行清洗或更换。如怀疑某信号耦合电容失效,可用同值电容并联试之;放大管或运放集成电路性能不良,也可用代换法检查。另外,负反馈元件有问题,也会造成电路增益下降。   4、噪声大   放大器的噪声有交流声、爆裂声、感应噪声和白噪声等。   检修时,应先判断噪声来自于前级还是来自于后级电路。可把前、后级的信号连接插头取下,若噪声明显变小,说明故障在前级电路;反之,故障在后级电路。   交流声是指听感低沉、单调而稳定的100Hz交流哼声,主要是电源部分滤波不良所致,应着重检查电源整流、滤波和稳压元件有无损坏。前、后级放大电路电源端的退耦电容虚焊或失效,也会产生一种类似交流声的低频振荡噪声。   感应噪声是成分较复杂且刺耳的交流声,主要是前级电路中的转换开关、电位器接地不良或信号连线屏蔽不良所致。   爆裂声是指间断的“劈啪”、“咔咔”声,在前级电路中,应检查信号输入插头与插座、转换开关、电位器等是否接触不良,耦合电容有无虚焊、漏电等。后级放大电路应检查继电器触点是否氧化、输入耦合电容有无漏电或接触不良。另外,后级电路中的差分输入管或恒流管软击穿,也会产生类似电火花的“咔咔”噪声。   白噪声是指无规则的连续“沙沙”声,通常是由前、后级放大电路中的输入级晶体管、场效应管或运放集成电路的性能不良产生的本底噪声,检修时,可用同规格的元件代换试之。   5、失真   失真故障是某放大级工作点偏移或功放推挽输出级工作不对称所致。检修时,可根据放大器输出功率与失真的变化情况,来判断具体的故障部位。   电子管放大器若失真的同时输出功率变小(音轻),应检查是否推挽功放中某一放大管衰老、工作点不对或输出变压器局部短路造成其工作不平衡;若失真的同时输出功率变大,多是负反馈电路中的电阻变值、电容失效或阴极自生偏压的旁路电容短路所致。   晶体管放大器若失真随着音量的增大而明显增大,应检查推动级某只晶体管的工作点是否偏移(通常发生在无保护电路的功放中)或反馈电路中的电容失真;若无论音量大小均有失真,则故障在前级放大电路,应检查各放大管的工作点有无偏移。   集成电路放大器的工作电压异常或功放集成电路内部损坏,也会造成失真(指无保护电路的机器)。   6、啸叫   啸叫故障是电路中存在自激所致,又分为低频啸叫和高频啸叫。   低频啸叫是指频率较低的“噗噗”或“嘟嘟”声,通常是由于电源滤波或退耦不良所致(在啸叫的同时往往还伴有交流声),应检查电源滤波电容、稳压器和退耦电容是否开路或失效,使电源内阻增大。功放集成电路性能不良,也会出现低频啸叫故障,此时集成电路的工作温度会很高。   高频啸叫的频率较高,通常是放大电路中高频消振电容失效或前级运放集成电路性能变差所致。可在后级放大电路的消振电容或退耦电容两端并接小电容来检查。另外,负反馈元件损坏、变值或脱焊时,也会引起高频正反馈而出现高频啸叫。

  • 发表了主题帖: 音响杂音处理办法

    有源音响的噪声问题经常困扰我们,其实只要认真分析和排查,绝大多数的音响噪声都是可以自行解决的。这里简单的分析一下音响产生噪声的原因,以及自行排查方法,可供新手需要时参考。   音响使用不当时有多种情况会造成有杂音,比如信号受到干扰、接口或者连接线接触不良、音响本身质量较差等等。   一般来说,音响的噪音按来源大致可分为电磁干扰、机械噪声和热噪声等。比如,有源音响的放大器、变压器等部件都一起放置于音箱本身的内部,互相干扰产生的噪音就不可避免。另外,很多音响噪声是由于信号线和接插头的接触不良或者短路造成的,保持各接插件的优良接触性能是保障音响正常工作的必要条件。比如一些连续的嘟嘟声,基本上就是信号线或者接插头的问题,可以通过互换卫星箱等手段进行排查解决。下面介绍一些其他几种噪声的来源和处理方法。   电磁干扰噪声来源以及处理办法   电磁干扰主要可以分为电源变压器干扰和杂散电磁波干扰。这种噪声经常表现为较小的嗡嗡声。一般来说,电源变压器干扰是由于多媒体音箱的电源漏磁造成的,在条件允许的情况下为变压器加装屏蔽罩的效果非常明显,可以较大程度的将漏磁阻挡,屏蔽罩只能用铁型材料制作。我们应该尽量选择大品牌、用料扎实的产品,另外,使用外置变压器也是个不错的解决办法。   杂散电磁波干扰噪声与处理办法   杂散电磁波干扰比较常见,音箱导线、分频器、无线设备或者电脑主机都会成为干扰源。将主音箱在允许条件下尽量远离电脑主机,并且减少周边无线设备。   机械噪声处理办法   机械噪音并不是有源音箱特有的。电源变压器在工作过程中,交变磁场引起的铁芯震动就会产生机械噪音,这很类似于日光灯镇流器所发出的嗡嗡声。选择质量好的产品仍然是预防这种噪音的较好办法。另外,我们可以在变压器和固定板之间加装橡胶减震层。   还有一点应该注意一下,如果电位器使用的时间较长,金属刷与膜片之间就会因灰尘堆积和磨损等问题产生接触不良,旋转时就会产生噪声。如果音箱的螺丝没有旋紧,倒相管处理不到位,在播放大动态音乐时,也会产生机械噪音。这种噪声一般表现为,使用音量或者高低音旋钮调整音量时出现喀拉喀拉的异响。   处理这种热噪声可以通过更换低噪声元件或是降低元件工作负荷的方法,另外,降低工作温度也是也是行之有效的方法之一。   另外,有些电脑音箱,当音量调得过大,也会出现噪音。这种情况是因为功放输出功率可能较小,不能避开音乐瞬间的大动态峰值信号造成的或者是因为由于喇叭过载失真造成。这种噪声的特点是声音嘶哑无力,虽然大声,音质却是极差,音色发干,高音毛糙,低音无力。同时有指示灯的可以看到随着音乐的节拍,指示灯会忽明忽暗,这是因为过载情况下电路的供电电压被严重拉低造成。

  • 发表了主题帖: 怎样避免音响设备老化以及让声音更靓

          在音响设备使用的过程中,由于空气中的氧、水、光、热等因素,无可避免的会令设备老化。音响设备老化之后,就会影响到声音的重现,令原本清晰自然的声音蒙上一层纱。那么,我们要怎么样避免音响设备老化以及让声音更靓呢?   方法一:每半年全面清洗接点一次   大家都知道,金属暴露于空气中不久,表层就会有氧化现象,失去光泽,变得暗哑。即使讯号线插头表面经过镀金处理后,已不易氧化,与机身插头又有紧密接触,但日子久了,仍然会有一定程度的氧化导致接触不良,所以最多隔半年就要清洁一次。只要用棉花沾上酒精涂抹接点便可以了,做完这重工夫之后,可以令接点回复最佳接触,声音也随之清晰、透明一点。   方法二:清洗CD机激光唱头   显然激光唱头只有那么一小点的面积,但全靠它读取CD碟上的记号,因此唱头上只要黏附上极少的微尘都足以影响读取信号的精确度。虽然CD机大都有密封的机身,但别忘记在经常出碟入碟的过程中就有空隙让灰尘乘虚而入了,一段日子下来,唱头表面定然留有或多或少的灰尘,这时便要拧开机盖螺丝,打开机盖直接用棉花棒点上酒精清洗。市面上虽然有各种清洗CD碟,但是你花了几十元,那些所谓洗CD碟可能只是靠一排刷去扫掉灰尘或者是利用绒面之类靠转动来除尘,效果比不上直接用棉花棒彻彻底。当你那部久未洗头的CD机清洁完毕之后,再听时会令人有掀开一层纱的感觉,而高频回复旧日的清晰,细节也动听多了。这个清洗唱头的步骤大概要一年做一次,就算是使用Pioneer的反转式唱盘系统(镭射头向下而非向上),灰尘仍会被唱头所带的静电吸引而黏附其上,所以这工夫也还是不能省的。   方法三:尽量避免机叠机   基于环境问题而要将器材叠起来摆放原本无可奈何,到有条件时,就应尽量将最主要的CD讯源及扩音部分独立来摆放,因为重叠摆放会导致谐震而影响机器。当喇叭播放音乐时,震动空气令到器材跟随震动,两部机相叠便会互相传道谐震,令到音乐中的微细讯息模糊不清,并且干扰各频段的传送,造成一种声音的污染,又如其中一部是CD机,自身播放碟时马达连转又加剧了谐震幅度,影响就更大。所以要把器材独立置放在稳固机架之上。   方法四:分体供电与主机、单声道后级之间保持距离   现今连不少中价前级都有一个盒仔大小的分体供电,简单地将火牛与主机分开为两部分,好处自然是可将机内零件与火牛之间可能引起的干扰隔离。若将分体供电器置放在前级旁边,那就有点失去意义了,赶快将它远离前级,如放在另一层的机架,实时便可听到整体的隔度有所提高,音像也会准确一些。单声道的后级亦然,有条件的两件器材分开一点摆放,保证有利无害。   方法五:干扰越少声音越靓   室内的家用电器及计算机应避免与音响共享一组电源,即使要放在一起也应从别处获取电源。其次让接线纠缠在一起也会令线与线之间互相吸收噪声破坏音质。无论是器材还是连接线,都应该保持不受其他电器或者电源线的干扰。   方法六:喇叭摆位   喇叭的摆放是音响使用中重要的一环,摆得不好难免令回放效果大打折扣。如何在房间中找到最好的摆放位置颇考人功夫,除了不断细心聆听不同摆放位置的效果外,还可以请相关的专家来进行指导。   方法七:昏暗环境有助聆听效果   关了灯来听音乐是一个习惯上的问题,可说与回放扯不上关系,只是在漆黑的环境之下,耳朵会特别灵敏,而且减低了视觉上的障碍,对音响画面重组以及乐器的位置感便会格外感觉清楚明确,气氛之佳与开亮灯时更相去颇远,还可以用其他一些比较幽暗的灯光来营造听音氛围。   方法八:吸音   在一般的家庭环境之内,家私杂物已经是上好的吸音材料,大可不必把吸音搞得太繁复,铺一张地毯已经有基本的加强吸音效果。加上地毯的好处是可以减少地板的反射声,避免混和正面传来的声音造成混浊,想知道自己的房间是否需要加上地毯,铺在地上测试声音有何变化便知晓了。喇叭距离后墙太近时,也可以考虑加一幅挂毯以增加吸音效果,但要注意不可用太大块,否则可能连超高频也吸掉。另外,房间的玻璃及镜面都会有较强的反射声音作用,需要用窗帘来遮挡以解决问题。要求高的朋友更不妨在墙角位及室内的声音反射点上多做些吸音功夫,但要注意吸音不可过分,适量的反射声是有助声音生猛活泼的。

  • 发表了主题帖: CCS5.5编译器优化问题

    请问ccs这个优化选项的 0 1 2 3 分别代表优化什么啊??哪位大神有介绍的相关文献多谢啦。 这个是一个优化等级的关系。 None:不优化。[-O0]与此设置,编译器的目标是降低成本的编译和调试产生预期的结果。语句是独立的:如果你停止程序语句之间有一个断点,然后您可以指定一个新值的任何变量或任何其他声明改变程序计数器的功能和得到你期望的结果从源代码。 1(Fast):优化编译需要更多的时间,和更多的内存大的功能。[-0,-1]与此设置,编译器试图减少代码大小和执行时间,没有执行任何优化,需要大量的编译时间。在编译器中,严格的混叠,阻挡重新排序,并内嵌调度优化时默认是禁用的。 2(Faster):编译器执行几乎所有支持优化,不涉及space-speed权衡。[2]与此设置,编译器不执行循环展开或内联函数,或寄存器重命名。相比“快速”的设置,该设置增加编译时间和生成的代码的性能。 3(Fastest):打开“更快”指定的优化设置,也取决于函数内联和寄存器重命名选项。此设置可能会导致一个更大的二进制。 Fastest [3],最小的优化尺寸。这个设置允许所有“更快”的优化通常不增加代码大小。它还旨在减少代码的大小进行进一步的优化。 希望可以帮助到你。

  • 发表了主题帖: 关于C6678运行NonOS_UART0_POLL例程问题

    刚接触dsp编程,目前正在熟悉的开发板是TMS32C6678。我之前一直按照光盘的用户手册的教程在熟悉开发板,最近在运行裸机Demo,NonOS_UART0_POLL可以正确编译,也可以下载到板子里,串口用IBL NOR测试也可以得到信息,串口连接应该没有问题,可是调整到DEBUG模式后,串口始终无法打印信息,请问该如何解决? 将拨码开关拨到DEBUG模式,按照我们的例程手册加载.out文件。 串口的结果

  • 发表了主题帖: ccs无法建立自己的platform

    想用ccs建立自己的platform,结果因为分辨率的问题,设置不了各个段放在什么位置,无法创建! 请勾选Customize Memory

  • 发表了主题帖: 如何使用TMS320DM8148进行目标识别?

    查看了DM8148的官方案例,有dm8148使用dsp和OpenCV进行人脸识别的案例。请问, 1.我能否使用openCV进行车辆的识别,识别的准确率和识别的速率如何?对图像的分辨率、帧率等是否有要求(分辨率高担心dsp的运算达不到实时) 2.使用MD8148,是否有其他目标识别的方案 做车牌识别,基本思路和人脸识别一样的。可以找做算法的供应商要一套 DSP 的算法评估库,放到 DSP  下做逐帧处理得到结果,传回给 ARM 做使用。 根据在其他平台的经验,8148 这款 DSP 做车牌识别够呛,720P 的单帧图像的分析耗时估计需要 1000 毫秒。当然也还有优化空间,改进算法库的实现、分一部分运算给 ARM 端等,但难度较大。对于 USB 摄像头,目前 mcfw 不直接支持,需要先用 v4l2 采集,再通过 hostin LINK 从 ARM Linux 传入 mcfw 框架。

  • 发表了主题帖: TMS320C6748在stareware中有支持 TFTP 实例吗?

    在stareware中有没有支持TFTP的代码,或是实例,这种方式可以实现吗? 在开发板demo中有:ENET_HTTPD、ENET_ECHO、ENET_HTTPD_rmii,可以从这几个找到相关代码吗? 比如说: 在第三方的LWIP中是支持TFTP,在在开发板demo中没有 TFTP 实例,需要自己开发?是这样吗? 我们没有StarterWare的tftp例程,我们有sys/bios的tftp例程,因为涉及到网络协议这一块的话,用裸机来开发的话难度会比较大,可以使用sys/bios来做。

  • 2019-02-14
  • 发表了主题帖: Dspace死区电路部分

    这是死区电路的结构框图 经过霍尔传感器发出的采样信号通过排针JP2输入 信号输入到巴特沃斯滤波电路 信号通过排针传回Dspace    LM358电路图 二阶巴特沃斯滤波电路中含有LM358,LM358里面包括有两个高增益、独立的、内部频率补偿的双运放,适用于电压范围很宽的单电源,而且也适用于双电源工作方式,它的应用范围包括传感放大器、直流增益模块和其他所有可用单电源供电的使用运放的地方使用。 该部分的主要作用:通过二阶巴特沃斯滤波电路消除高频信号    二阶巴特沃斯滤波电路图 其中R3和C2构成低通级,R2和C1构成积分环节,两者都表现出低通特性。

  • 发表了主题帖: 基于DSP的PID控制算法的实现

         摘 要:按偏差的比例、积分和微分进行控制的调节器称为PID调节器,PID调节器是连续系统中技术成熟、应用最为广泛的一种调节器。它构简单,参数易于调整,在长期的应用中已积累了丰富的经验。特别在工业过程中,由于控制对象的精确数学模型难以建立,系统的参数又经常发生变化,运用现代控制理论分析综合要耗费很大的代价进行模型辨识,但往往不能得到预期的效果,所以人们常采用数字PID调节器,并根据经验进行在线整定。这次课程设计将综合用数字信号处理DSP以及自动控制方面的知识,使用CCS集成开发环境进行代码的编译,仿真,才能完成了本次设计。       前言在数字PID算法是目前一般控制领域中经常使用的自动控制算法,它依据给定的设定值,反馈值,以及比例系数,积分和微分时间,计算出一定的控制量,使被控对象能保持在设定的工作范围,并且可以自动的消除外部扰动。由于软件系统的灵活性,经计算出的PID参数可以在调试过程中随时改变。能更精确的控制系统。得到较好的控制效果。PID 控制原理简单、实现方便,并且适应面广、鲁棒性强,其控制品质对被控对象特性的变化不是很敏感。随着计算机技术的发展,在 PID 控制的基础上,出现了很多改进的数字 PID 控制方法 ,如微分先行 PID 控制、积分分离 PID 控制、带死区的PID 控制等。对于数字PID 控制方法,又分为增量式 PID 控制算式和位置式 PID 控制算式。在绝大多数工业控制中,数字 PID 控制仍然是一种稳定的、可靠的、实现简单的、使用广泛的控制方法。本设计以TI公司的TMS320VC5509和外接 D/ A芯片,实现数字 PID 控制器,采用的 PID 控制算法是增量式 PID 控制算法。TMS320VC5509 具有较高的运行速度和数据处理能力,能保证系统对多路模拟信号的实时采集和处理,提高系统的整体性能和集成度。在 DSP 内部设置参考输入量,通过DSP片上 10 位 A/ D 转换器采样,把控制对象的实际输出量采集到 DSP 中,经过DSP 的数字运算处理后,通过外部的 D/ A AD7237 进行数/ 模转换,得到实际的模拟控制量去控制被控对象,使之按照系统的设置运行工作。1、模拟PID调节器模拟PID控制系统组成如图1所示:http://c.51hei.com/d/forum/201706/05/172142vfaw7873t0nu74fu.jpg             图1 模拟PID控制系统原理框图PID调节器是一种线性调节器,它将给定值r(t)与实际输出值c(t)的偏差的比例(P)、积分(I)、微分(D)通过线性组合构成控制量,对控制对象进行控制。根据图1,可以推导出PID调节器的微分方程为:                   http://c.51hei.com/d/forum/201706/05/172142tgogzmggzao8apog.jpg       式中   http://c.51hei.com/d/forum/201706/05/172143gr5zr9b9lzcczr6j.jpg u(t)——控制器(也称调节器)的输出;e(t)——控制器的输入(常常是设定值与被控量之差,即e(t)=r(t)-c(t));Kp——控制器的比例放大系数;Ti ——控制器的积分时间;Td —— 控制器的微分时间。1.1 PID调节器各校正环节的作用比例环节:即时成比例地反应控制系统的偏差信号e(t),偏差一旦产生,调节器立即产生控制作用以减小偏差。对于大多数调节器而言,都不采用比例增益kc作为刻度,而是用比例度来刻度,即δ=1/kc*100%. 也就是说比例度与调节器的放大倍数的倒数成比例。调节器的比例度越小,它的放大倍数越大,它把偏差放大的能力越大,反之亦然。积分环节:主要用于消除静差,提高系统的无差度。积分作用的强弱取决于积分时间常数TI,TI越大,积分作用越弱,反之则越强。调节器的积分作用就是为了消除自控系统的余差而设置的。所谓积分,就是随时间进行累积的意思,即当有偏差输入e存在时,积分调节器就要将偏差随时间不断累积起来,也就是积分累积的快慢与偏差e的大小和积分速度成正比。只要有偏差e存在,积分调节器的输出就要改变,也就是说积分作用总是起作用的,只有偏差不存在时,积分才会停止。微分环节:能反应偏差信号的变化趋势(变化速率),并能在偏差信号的值变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减小调节时间。可见,微分分量对偏差的任何变化都会产生控制作用,以调整系统输出,阻止偏差变化,预见随后。偏差变化越快,则产生的阻止作用越大。对于一个固定不变的偏差e(t),不论其数值多大,根本不会有微分作用输出。2、 数字PID控制器2.1 模拟PID控制规律的离散化模拟形式离散化形式http://c.51hei.com/d/forum/201706/05/172144x8xmva2vu7mu1umo.jpghttp://c.51hei.com/d/forum/201706/05/172144iahvkxfrxrvxauwk.jpghttp://c.51hei.com/d/forum/201706/05/172145o0vhhk8ykvyvlh02.jpghttp://c.51hei.com/d/forum/201706/05/172146no33ynrqjg5pk1og.jpghttp://c.51hei.com/d/forum/201706/05/172146u4snyyrk6z1k0ss4.jpghttp://c.51hei.com/d/forum/201706/05/172148dplaspykyrybcnlp.jpg根据上表和模拟PID的数学表达式,可以退出数字PID控制器的差分方程为:http://c.51hei.com/d/forum/201706/05/172148htnnonzzfpm2mm8c.jpg式中   http://c.51hei.com/d/forum/201706/05/172149xhad0zu0x04x2ca1.jpg                称为比例项       http://c.51hei.com/d/forum/201706/05/172151dnr3h7ht1nuu1659.jpg           称为积分项       http://c.51hei.com/d/forum/201706/05/172152zic1w1gzqwgi8gje.jpg   称为微分项常用的控制方式有    P控制          http://c.51hei.com/d/forum/201706/05/172153x8oee5mer6685756.jpgPI控制          http://c.51hei.com/d/forum/201706/05/172154kecu3999tlc1ozit.jpgPD控制          http://c.51hei.com/d/forum/201706/05/172154fub040ug0fqzugbr.jpgPID控制         http://c.51hei.com/d/forum/201706/05/172155k9xbws7s9rwgbc1b.jpg2.2 PID算法的两种类型2.2.1 位置型控制                  http://c.51hei.com/d/forum/201706/05/172156oq9qewgzl77yl2bv.jpg基本PID控制器的理想算式为http://c.51hei.com/d/forum/201706/05/172158w9cs9z7lglou5u2j.jpg               式中 http://c.51hei.com/d/forum/201706/05/172159vzy1fdh55hhaww6w.jpgu(t)——控制器(也称调节器)的输出;e(t)——控制器的输入(常常是设定值与被控量之差,即e(t)=r(t)-c(t));Kp——控制器的比例放大系数;Ti ——控制器的积分时间;Td——控制器的微分时间。设u(k)为第k次采样时刻控制器的输出值,可得离散的PID算式               http://c.51hei.com/d/forum/201706/05/172200qpz33fmf33qfy4qm.jpg                                                式中 http://c.51hei.com/d/forum/201706/05/172200ju1n4x876dcxvtxs.jpg,               http://c.51hei.com/d/forum/201706/05/172201p0qvgvq025yig1vn.jpg 。 由于计算机的输出u(k)直接控制执行机构(如阀门),u(k)的值与执行机构的位置(如阀门开度),所以通常称上式为位置式PID控制算法。http://c.51hei.com/d/forum/201706/05/172202d1oabcqqv090zeae.jpg 图2 位置式PID控制器流程图位置式PID控制算法的缺点:当前采样时刻的输出与过去的各个状态有关,计算时要对e(k)进行累加,运算量大;而且控制器的输出u(k)对应的是执行机构的实际位置,如果计算机出现故障,u(k)的大幅度变化会引起执行机构位置的大幅度变化。2.2.2增量型控制增量型PID算法的算式为:http://c.51hei.com/d/forum/201706/05/172202wg5i8fm08mi2r0g0.jpg或者写成            http://c.51hei.com/d/forum/201706/05/172203gd4lier8q24r7q4l.jpg        式中 http://c.51hei.com/d/forum/201706/05/172204n5iudyiuj5fit5wf.jpg , http://c.51hei.com/d/forum/201706/05/172205h1fgeu77wfztkrr1.jpg , http://c.51hei.com/d/forum/201706/05/172207eeso8f3zswsmszbo.jpg增量式PID是指数字控制器的输出只是控制量的增量Δu(k)。采用增量式算法时,计算机输出的控制量Δu(k)对应的是本次执行机构位置的增量,而不是对应执行机构的实际位置,因此要求执行机构必须具有对控制量增量的累积功能,才能完成对被控对象的控制操作。执行机构的累积功能可以采用硬件的方法实现;也可以采用软件来实现,如利用算式http://c.51hei.com/d/forum/201706/05/172208wm49fmrmtf4fz0si.jpg程序化来完成。 由上式可得增量式PID控制算式http://c.51hei.com/d/forum/201706/05/172208aq8f2qq0jzbkcw2a.jpg             式中 http://c.51hei.com/d/forum/201706/05/172209g4886ubgqu96gfi0.jpg 进一步可以改写成http://c.51hei.com/d/forum/201706/05/172210en6emruypmf9xau6.jpg                                                                                                 式中 http://c.51hei.com/d/forum/201706/05/172211xq6fa1yhz6xq3h96.jpg、 http://c.51hei.com/d/forum/201706/05/172212fe4l7gyg7nyn7tea.jpg 、 http://c.51hei.com/d/forum/201706/05/172213q25t2ld81z2ldu2t.jpg 一般计算机控制系统的采样周期T在选定后就不再改变,所以,一旦确定了Kp、Ti、Td,只要使用前后3次测量的偏差值即可求出控制增量。根据上述分析,其程序流程图如下:http://c.51hei.com/d/forum/201706/05/172213hwr2yu8rmgnutyzy.jpg 图3 增量型控制算法路程图增量式算法优点:①算式中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关,容易通过加权处理获得比较好的控制效果;②DSP每次只输出控制增量,即对应执行机构位置的变化量,故机器发生故障时影响范围小、不会严重影响生产过程。经过综合比较,最终选择了增量式控制算法。3.系统软硬件设计3.1硬件设计为了实现上述控制算法,还需要硬件电路才行,设计电路原理图如图4所示:从图4 中可以看出,模拟量输入,也即被控电机的实际输出转速,通过一个限流电阻 R 送到由 AD8041 构成的电压跟随器里,经过放大后,再经二极管D1 和 D2嵌位以及电阻 R 限流,送到TMS320VC5509片上的 A/D 转换其中使得 A/D 的输入限制在 0~3 300 mV。TMS320VC5509 一共有16 路复用的片上 A/D 转换器,本实例只采用第 0 通道的A/D转换。由DSP计算出控制量,通过外部数据总线送给D/ A 转换器,采用 AD 公司的 AD7237 芯片,他是 8 位 D/ A 转换器,由DSP的外部地址总线A2 ,A1 ,A0 构成D/ A转换器的译码电路,D/ A转换器的输出采用AD7237 的A相输出。TMS320VC5509 由外部提供复位信号,由无源晶振提供6 MHz时钟。片上 A/D 转换器的参考电压高电平 V 接DSP电源+3.3 V 。http://c.51hei.com/d/forum/201706/05/172214ebiej6pnn7v3skk3.jpg图4  DSP实现数字PID控制器的电路原理图3.2 软件设计本设计运用了CCSV3.3软件,它是一个完整的DSP集成开发环境,CCS支持软仿真器、各种型号的硬仿真器、各种DSK和EVM板。[11]CCS主要特点有:集成可视化代码编辑界面,可以方便地直接编写C、汇编、.h文件、.cmd文件等;集成代码生成工具,包括汇编器、优化的C编译器和连接器等;具有完整的基本调试工具,可以载入执行文件(.out),查看寄存器窗口、存储器窗口和变量窗口、反汇编窗口等,支持在C源代码级进行调试;支持多片DSP联合调试;断点工具,支持硬件断点、数据空间读/写断点、条件断点等;探针工具(probe points),用于进行算法仿真,数据监视等;剖析工具(profile pionts),用于评估代码执行的时间;数据图形显示工具,可绘制时域/频域波形、眼图、星座图等,并可以自动刷新;提供GEI二工具,用户可以根据需要编写自己的控制面板/菜单,从而方便直观地修改变量,配置参数。支持RTDX(Real time date exchange)技术,利用该技术可以在不中断目标系统运行的情况下,实现DSP与其它应用程序(OLE)实现数据交换,具有开放式的plug-ins技术,支持其它第三方的ActiveX插件。提供DSP、BIOS工具,利用该工具可增强对代码的实时分析能力,减少开发人员对硬件资源熟悉程度的依赖性。http://c.51hei.com/d/forum/201706/05/172215ey9k6y6vfwnhekbi.jpg 图5 代码调试与编译为了验证算法的可行性,现建立数字PID直流电机控制模型,然后用Matlab的LTI状态分析工具箱进行仿真,并绘制转速及控制电压变化图形。http://c.51hei.com/d/forum/201706/05/172216znk5zgngngk5zrj1.jpg                   图6 数字PID仿真模型                          利用Matlab软件和 LTI工具箱函数,仿真源程序代码如下:clear all;close all;ts=0.01;                      %采样时间=0.001ssys=tf(2652,[1,25,490]);      %建立被控对象传递函数dsys=c2d(sys,ts,'z');         %把传递函数离散化[num,den]=tfdata(dsys,'v');   %离散化后提取分子、分母e_1=0                         %上一偏差      Ee=0;                         %偏差累计u_1=0.0;                      %上一状态电压u_2=0.0;y_1=0;                        %上一状态输出y_2=0;kp=2.5;                       %PID参数ki=0.04;                        kd=0.28;                        for k=1:100time(k)=k*ts;                  %时间参数r(k)=500;                     %给定值    y(k)=-1*den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;    e(k)=r(k)-y(k);          %偏差    u(k)=kp*e(k)+ki*Ee+kd*(e(k)-e_1);       if u(k)>220        u(k)=220;    end    if u(k)<=0        u(k)=0;    end          Ee=Ee+e(k);       u_2=u_1;    u_1=u(k);       y_2=y_1;    y_1=y(k);       e_2=e_1;    e_1=e(k);endhold on;plot(time,r,'r',time,y,'b',time,u,'r');[kp,ki,kd];程序调试好后,分别改变kp、ki和kd的参数值,看输出图形有何变化,理解PID控制中比例、积分和微分对控制系统的作用。http://c.51hei.com/d/forum/201706/05/172217mkis35ik53x5v3xk.jpg                   图7  Matlab中仿真图Ahttp://c.51hei.com/d/forum/201706/05/172218ca6j2r66raj95xrx.jpg图8 Matlab中仿真图B4 分析与结论通过本次课程设计的软件仿真与调试,才更加深刻的领悟了数字PID控制算法的精髓,使得理论得到了很好的验证,从而是我巩固了所学知识,得到了专业技能的锻炼和提高。5 参考文献[1] 胡寿松  自动控制原理  北京:科学出版社[2] 童诗白、华成英  模拟电子技术基础  北京:高等教育出版社[3] 黄忠霖 控制系统MATLAB设计与仿真 北京:国防工业出版社[4] 谢剑英、贾青 微型计算机控制技术 北京:国防工业出版社[5]赵洪亮.TMS320C55X DSP 应用系统设计[M].北京:北京航空航天大学出版社,2008.[6]王献峰,石东.基于DSP的FIR数字滤波器设计与实现[J].通信电源技术,2006,23(4):38-40.[7]张雄伟.DSP芯片的原理与开发应用(第三版)[M].北京:电子工业出版社,2003.[8]丁玉美.数字信号处理(第二版)[M].西安:西安电子科技大学出版社,2005.[9]杨大柱.基于TMS320C5510的FIR滤波器设计与实现[J].微计算机信息,2008,24(17).[10]陈怀琛.MATLAB及其在理工课程中的应用指南[M].西安:西安电子科技大学出版社,2007. 附录:源程序代码 /*****************************************************************PID FunctionThe PID (比例、积分、微分) function is used in mainlycontrol applications. PIDCalc performs one iteration of the PIDalgorithm.While the PID function works, main is just a dummy program showinga typical usage.****************************************************************//****************************头文件******************************/#include "DSP28_Device.h"#include "System.h"#include "DSP28_Adc.h"typedef struct PID {double SetPoint;                        // 设定目标Desired valuedouble Proportion;                      // 比例常数Proportional Constdouble Integral;                        // 积分常数Integral Constdouble Derivative;                      // 微分常数Derivative Constdouble LastError;                       // Error[-1]double PrevError;                       // Error[-2]double SumError;                       // Sums of Errors} PID;/*********************PID计算部分*********************************/double PIDCalc( PID *pp, double NextPoint ){double dError,Error;Error = pp->SetPoint - NextPoint;                          // 偏差pp->SumError += Error;                                  // 积分dError = pp->LastError - pp->PrevError;                    // 当前微分pp->PrevError = pp->LastError;pp->LastError = Error;return (pp->Proportion * Error                             // 比例项+ pp->Integral * pp->SumError                            // 积分项+ pp->Derivative * dError );                               // 微分项}/**********************Initialize PID Structure************************/void PIDInit (PID *pp){memset ( pp,0,sizeof(PID));}/********************Main Program*********************************/double sensor (void)                                     // Dummy Sensor Function{return 100.0;}void actuator(double rDelta)                             // Dummy Actuator Function{}void InitAdc(void){unsigned int i;AdcRegs.ADCTRL1.bit.RESET=1;NOP;AdcRegs.ADCTRL1.bit.RESET=0;                      //重新设置AdcRegs.ADCTRL1.bit.SUSMOD=3;              //设置仿真挂起模式 3,AdcRegs.ADCTRL1.bit.ACQ_PS=0;AdcRegs.ADCTRL1.bit.CPS=0;//对高速时钟 HSPCLK 分频,=0 时,不分频,=1 时,二分频AdcRegs.ADCTRL1.bit.CONT_RUN=0;             //开始-----停止模式AdcRegs.ADCTRL1.bit.SEQ_CASC=1;//级联模式,SEQ1 和 SEQ2 作为一个 16 状态排序器工作。AdcRegs.ADCTRL3.bit.ADCBGRFDN=3;           //带隙和参考电路上电for(i=0;i<10000;i++) NOP;AdcRegs.ADCTRL3.bit.ADCPWDN=1;//除带隙和参考电路外的 ADC 其它模拟电路上电for(i=0;i<5000;i++)  NOP;AdcRegs.ADCTRL3.bit.ADCCLKPS=15;                                            //时钟分频 ADCCLKPS=HSPCLKPS/[2*15*(ADCTRL1[7]+1)]AdcRegs.ADCTRL3.bit.SMODE_SEL=1;           //选择同步采样模式AdcRegs.MAX_CONV.bit.MAX_CONV=0;           //设置转换通道0AdcRegs.CHSELSEQ1.bit.CONV00=0;AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;   //清除 SEQ1 的中断标志位AdcRegs.ADC_ST_FLAG.bit.INT_SEQ2_CLR=1;   //清除 SEQ2 的中断标志位AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0;      //无作用AdcRegs.ADCTRL2.bit.RST_SEQ1=0;//将排序器立即复位到 CONV00 状态AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;  //使能 INT_SEQ1 的中断请求AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;                                          //每个 SEQ1 序列结束时,INT_SEQ1 置位AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;    //EVA 的触发信号不启动 SEQ1AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0;    //无操作AdcRegs.ADCTRL2.bit.RST_SEQ2=0;        //无操作AdcRegs.ADCTRL2.bit.SOC_SEQ2=0;         //清除一个挂起的 SOC 触法AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=0;     //禁止 INT_SEQ2 产生的中断请求AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2=0;//每个 SEQ2 结束时,INT_SEQ2 置位AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=0;//EVB 的触发信号不启动 SEQ2AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;//软件触法,从当前停止的位置启动 SEQ1void main(void){PID sPID;                                // PID Control Structuredouble rOut;                             // PID Response (Output)double rIn;                              // PID Feedback (Input)PIDInit ( &sPID );                        // Initialize StructuresPID.Proportion = 0.5;                    // Set PID CoefficientssPID.Integral = 0.5;sPID.Derivative = 0.0;sPID.SetPoint = 100.0;                    // Set PID Setpointfor (;;) {                                // Mock Up of PID ProcessingrIn = sensor ();                           // Read InputrOut = PIDCalc ( &sPID,rIn );               // Perform PID Interationactuator ( rOut );                         // Effect Needed Changeswhile(AdcRegs.ADC_ST_FLAG.bit.SEQ1_BSY==0){AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;}     //只要 SEQ1 不忙,那么就启动 SOC_SEQ1}/*********************AD 中断服*********************************/interrupt void ad(void){   PieCtrl.PIEACK.bit.ACK1=1;               //采集 ADC0 通道的数据ADtemp[adflag]=(AdcRegs.RESULT0>>4)&0x0fff;//右移四位,减小误差                    //RESULT 寄存器的低四位为无效位,故应右移四位        adflag++;        if(adflag==MAX_DATA){          adflag=0;}     AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;    //清除中断标志位     AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;

  • 发表了主题帖: CPU卡程序设计处理流程

    假设所有CPU卡和ESAM模块的文件可以自由读,但是写文件的时候需要权限认证。 当单片机控制电路检测到有CPU卡插入后,处理流程为: 1)、卡上电和复位 2)、选择要操作的卡上的主文件 3)、ESAM模块上电和复位 4)、选择要操作的ESAM模块的主文件 5)、如果文件的读写权限自由,这时已经可以对文件进行读写操作,如果读写有权限,则需要向下经过内部认证和外部认证后进行文件的读写。 6)、卡和ESAM之间的内部认证 7)、卡和ESAM的外部认证 8)、读(写)有权限的文件。 2.1端口配置 这里定义了以后程序里面用到的与CPU卡和ESAM模块有关的单片机端口定义。 2.1.1. 端口定义 #define P3_7EsamPower BIT7 //ESAM上电 #define P4_4EsamSDA BIT4 //ESAM数据端 #define P4_5EsamRST BIT5 //ESAM复位 #define P3_2CardSDA BIT2 //卡数据端 #define P3_4CardRst BIT4 //卡复位 #define P3_5CardInsChk BIT5 //卡插入检测 #define P3_6CardPower BIT6 //卡上电 #define PJ_1MCLK BIT1 // MCLK,卡和ESAM的SCL信号输入端 在程序中经常要对端口的输入输出和电平高低状况进行改变,MSP430单片机不能对端口进行位操作,为了操作方便将端口的各种状态用宏定义进行规范,这样可以简化程序中队端口的操作,并且使程序可读性强,便于移植。 例如下面定义的CardPowerInput,直接从字面理解即为CPU卡的商店管脚作为输入口,而CardPowerOutputHigh意为卡上电端口输出高电平。这样不仅直观,而且避免了在程序中直接对端口进行配置。 //卡SDA管脚宏定义 #define CardSDAOutput P3DIR|=P3_2CardSDA #define CardSDAInput P3DIR&=~P3_2CardSDA #define CardSDAOutputHigh P3OUT|=P3_2CardSDA #define CardSDAOutputLow P3OUT&=~P3_2CardSDA #define CardSDAInputCheck P3IN&P3_2CardSDA //卡复位管脚宏定义 #define CardRSTOutput P3DIR|=P3_4CardRst #define CardRSTInput P3DIR&=~P3_4CardRst #define CardRSTOutputHigh P3OUT|=P3_4CardRst #define CardRSTOutputLow P3OUT&=~P3_4CardRst #define CardRSTInputCheck P3IN&P3_4CardRst //卡上电管脚宏定义 #define CardPowerOutput P3DIR|=P3_6CardPower #define CardPowerInput P3DIR&=~P3_6CardPower #define CardPowerOutputHigh P3OUT|=P3_6CardPower #define CardPowerOutputLow P3OUT&=~P3_6CardPower #define CardPowerInputCheck P3IN&P3_6CardPower //卡插入管脚宏定义 #define CardInsertCheckOutput P3DIR|=P3_5CardInsChk #define CardInsertCheckInput P3DIR&=~P3_5CardInsChk #define CardInsertCheckOutputHigh P3OUT|=P3_5CardInsChk #define CardInsertCheckOutputLow P3OUT&=~P3_5CardInsChk #define CardInsertCheck P3IN&P3_5CardInsChk //Esam SDA管脚宏定义 #define EsamSDAOutput P4DIR|=P4_4EsamSDA #define EsamSDAInput P4DIR&=~P4_4EsamSDA #define EsamSDAOutputHigh P4OUT|=P4_4EsamSDA #define EsamSDAOutputLow P4OUT&=~P4_4EsamSDA #define EsamSDAInputCheck P4IN&P4_4EsamSDA //Esam 复位管脚宏定义 #define EsamRSTOutput P4DIR|=P4_5EsamRST #define EsamRSTInput P4DIR&=~P4_5EsamRST #define EsamRSTOutputHigh P4OUT|=P4_5EsamRST #define EsamRSTOutputLow P4OUT&=~P4_5EsamRST #define EsamRSTInputCheck P4IN&P4_5EsamRST //Esam 上电管脚宏定义 #define EsamPowerOutput P3DIR|=P3_7EsamPower #define EsamPowerInput P3DIR&=~P3_7EsamPower #define EsamPowerOutputHigh P3OUT|=P3_7EsamPower #define EsamPowerOutputLow P3OUT&=~P3_7EsamPower #define EsamPowerInputCheck P3IN&P3_7EsamPower //MCLK管脚宏定义 #define MCLKOutput PJDIR|=PJ_1MCLK #define MCLKInput PJDIR&=~PJ_1MCLK #define MCLKOutputHigh PJOUT|=PJ_1MCLK #define MCLKOutputLow PJOUT&=~PJ_1MCLK #define MCLKInputCheck PJIN&PJ_1MCLK #define MCLKSEL PJSEL|=PJ_1MCLK 2.2. 变量及宏定义 2.2.1. 卡处理结果变量 unsigned int CardError; 该变量定义了在卡处理过程中出现的各种异常状态,用以提示在那一步出现了问题,便于问题查找及解决。 以下是该变量各个位的定义。 #define ErrorRSTBIT BIT0 //卡复位错 #define ErrorRWBIT BIT1 //卡读写错误 #define ErrorPasswBIT BIT2 //卡与Esam内部认证错误 #define ErrorCardExtAuthBIT BIT3 //卡外部认证错误 #define ErrorEsamExtAuthBIT BIT4 //ESAM模块外部认证错误 #define ErrorKeyUpdateBIT BIT5 //密钥更新错误 #define ErrorKeyBIT BIT6 //密钥比较错误 2.2.2. CPU卡通信字节长度 unsigned char TxAndRxBuff[124]; 卡或者ESAM读写过程中的数据通过此变量进行传输。 CPU卡在处理过程中,每次最多可接收和发送124个字节 2.2.3. 卡和ESAM文件主目录宏定义 //卡主目录3f 01,Esam主目录3f 00 #define MainDir 0x3f #define CardMainDir 0x01 #define EsamMainDir 0x00 对卡或者ESAM的文件进行操作前,必须先选择该文件所在的主目录。 2.2.4. 响应状态字 //响应状态字SW1,SW2, //命令正确执行的响应数据为SW1SW2=90 00或SW1SW2=61 00 #define RespondStateByte1 0x90 #define RespondStateByte2 0x00 #define RespondStateByte3 0x61 2.2.5. 数据接收结果变量 //cTxAndRxStatus CPU卡接收数据正确标志 #define ReceINSRightBIT BIT0 该变量用以判定从卡或者ESAM接受的数据是否正确。 2.2.6. 卡(ESAM操作标志变量) 此变量用以标明是对卡还是对ESAM进行操作,并且还标明从卡或者ESAM来的数据的校验结果正确与否 //变量CardWorkFlag #define CardORESAM BIT0 //0--对SAM操作 1--对卡操作 #define CARDPRO_ERR BIT1 //0--读写卡操作正常 1--读写卡错误 #define cCheckOrRe BIT2 #define ICXOR BIT6 //卡/ESAM传来的校验和 #define MXOR BIT7 //CPU计算的校验和 #define CheckflagBit BIT5

  • 发表了主题帖: 关于nRF24L01读内部任何寄存器值为08H的经历和解决办法

    某次设计需要使用nRF24L01实现数据的双向通信,将原本在51单片机上运行成功的程序移植到STM8单片机上时,出现无法运行的问题。尝试读取nRF24L01内部的寄存器以查看模块工作状态时,发现无论哪个寄存器读出值均为0x08。现具体描述此次经历以及最后的解决方法。 原设计平台为IAP15W4K58S4,开发环境Keil uVision4,设定的工作频率22.1184MHz;移植的目标平台为STM8S105K4T6,开发环境IAR for STM8,使用HSE:8MHz,CPU时钟不分频。 设计同时使用波特率为115200bps的串口通信以及外部中断。 由于设计需要,在STM8S上,nRF24L01模块以软件模拟SPI的方式连接在STM8S的PB0~PB5端口上。引脚的定义如下: #define nRF24L01_MISO PB_IDR_IDR5 #define nRF24L01_MOSI PB_ODR_ODR4 #define nRF24L01_SCK PB_ODR_ODR3 #define nRF24L01_CSN PB_ODR_ODR2 #define nRF24L01_CE PB_ODR_ODR1 #define nRF24L01_IRQ PB_IDR_IDR0 复制代码 遵循调试的基本步骤,我更换了无线模块、连接线,以及平台核心板,但是都不能够解决问题。 考虑到STM8S的IIC接口,是真正的开漏输出,没有内部上拉电阻。于是查询芯片手册: 从手册可以看到,STM8S105K4T6的PE1、PE2是真正的开漏输出,而我所使用的LQFP32封装上没有这两个引脚,PB4、PB5为IIC的映射管脚,是具有上拉电阻的。 所以问题不在管脚选择上。 重新查阅芯片手册,注意到PB管脚的输出速度均为O1级别,手册上对于O1是这样描述的: 可以看到,O1为不可配置的2MHz慢速引脚,因为我所配置的单片机工作频率达到8MHz,怀疑是在与nRF24L01通讯过程中引脚电平变化速度过快导致IO电平不稳定,于是配置CPUDIV,使CPU工作频率8分频在1MHz,故障依旧。 所以引脚输出速度不是引起问题的原因。 重新查阅nRF24L01的芯片手册,想到芯片的各个寄存器读出值均为08H,那么应该排除芯片的初始化失败这样的可能性,因为无论是否初始化,按照正确配置步骤进行过之后,芯片内部的寄存器保留位应该是保持保留值不变化,而现在的现象是,以CD载波检测寄存器为例,本应该只有00H和01H两种取值可能性,却读出08H。 将关注点放在与模块进行通信的底层SPI模拟函数上,我在51平台上使用的SPI读写函数如下所示: unsigned char nRF24L01_SPI_RW(unsigned char dat)//向SPI发送一个字节的数据,并且由其移位寄存器的特性,返回收到的字节 {     unsigned char i;     for(i=0;i<8;i++)//输出8个比特     {         nRF24L01_MOSI=(dat&0x80);//高位先出,按位传递         dat=(dat<<1);//转移比特位         nRF24L01_SCK=1;//置高时钟         nRF24L01_MISO=1;         dat|=nRF24L01_MISO;//得到从机传来的比特位         nRF24L01_SCK=0; //拉低时钟     }     return(dat);//返回移位得到的数据 } 复制代码 按照SPI的协议,重写函数如下: unsigned char nRF24L01_SPI_RW(unsigned char dat)//向SPI发送一个字节的数据,并且由其移位寄存器的特性,返回收到的字节 {     unsigned char i;     for(i=0;i<8;i++)//输出8个比特     {         if(dat&0x80)         {             nRF24L01_MOSI=1;         }         else         {             nRF24L01_MOSI=0;         }         dat=(dat<<1);//转移比特位         nRF24L01_SCK=1;//置高时钟         if(nRF24L01_MISO)         {             dat|=1;         }         else         {             dat|=0;         }         nRF24L01_SCK=0; //拉低时钟     }     return(dat);//返回移位得到的数据 } 复制代码 则出乎意料的恢复正常了。 后经过逐步化简调试,这样的表达在IAR环境下也可以正常运行: unsigned char nRF24L01_SPI_RW(unsigned char dat)//向SPI发送一个字节的数据,并且由其移位寄存器的特性,返回收到的字节 {     unsigned char i;     for(i=0;i<8;i++)//输出8个比特     {         nRF24L01_MOSI=(_Bool)(dat&0x80);//高位先出,按位传递,强制转换为布尔类型         dat=(dat<<1);//转移比特位         nRF24L01_SCK=1;//置高时钟         dat|=nRF24L01_MISO//得到从机传来的比特位         nRF24L01_SCK=0; //拉低时钟     }     return(dat);//返回移位得到的数据 } 复制代码 故此得到结论,IAR下,对于一个位只能赋值逻辑0、1,如果赋值一个非布尔型的数据,则会产生混乱。

TA暂时无记录哦~

统计信息

已有380人来访过

  • 芯币:4175
  • 好友:--
  • 主题:862
  • 回复:81
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言