火辣西米秀

  • 2019-10-13
  • 发表了主题帖: Arduino遥控套装解决你的所有问题

    最近制作了一个基于Arduino的遥控器和配套的接受板,可以用在一些遥控小车或者机器人上面,用的无线方案使最常见的NRF24L01,接受板使用的是ATmega328P控制器,遥控器使用的是ATmega8A控制器 ,这一章我带来遥控器的制作过程。 这次我设计了一个遥控器的板子,体积很小,整个版面只有9.6mm*4.6mm,可以称的上是掌上遥控器,并且常用功能都不少。 设计篇 首先当然是对整个遥控器的功能规划,先定目标,就是我的成品需要达到什么功能,这样方便之后设计中可以保证我们目标的专一以及成品后就可以按照我的目标表去一一核对我的目标功能是否全部达标。 1.单片机选择 对于单片机我是选择atmega8,其实atmega328也可以选择,但是价格上贵一些,但是遥控器这样简单的设备来说用不着328那么大的内存,所以选择Mega8。两个芯片的引脚分部都是一样的,所以后期可以更换单片机芯片,而不用改变电路结构,下面是Atmega8的引脚图。 2.无线通讯模块 采用的还是NRF24l01这款无线模块,在某宝上有许多版本的NRF24l01,我使用的是采用DIP2*4引脚输出的这款,据说还有一款加载了功率放大器的板子,接口是兼容的,所以如果后期想增加遥控距离的话可以采用带功放的模块。 关于给它供电的电路,还是使用MIC5205的方案,我在许多项目中都会用到它,体积小巧(采用SOT23-5封装)并且输出电流足够(150ma),外围电路足够简单,两个电容即可。不过大家在选择电容的时候注意它的最大承受电压,一般商家会在参数里面标注,我选择的是耐压10V的10uf电容。 3.摇杆 首先是作为一个遥控器,该有的比例控制摇杆肯定必须有,这样我们就可以操控一些比例通道(例如电机速度,灯的亮度,舵机旋转角度以及所有需要连续变化的量)。参照市面上的常用设计来看,设计两个全向摇杆是比较好的选择(类似于PS2手柄上的摇杆)关于摇杆的原理,我简单的介绍一下: 其实摇杆的本质就是让摇杆的转轴连接着一个电位计,使用电位计对摇杆进行定位,这样我们通过读取电位计的电压值就可以计算出摇杆的位置。如果是全向摇杆,一般就会有两个电位计去对摇杆在X轴和Y轴上的位置进行定位,这样使用单片机的ADC即可读取到电压,从而得知摇杆的位置。 那么每一个摇杆都有两个运动轴,两个摇杆就有四个运动轴,这样我就可以用两个摇杆去控制四个比例通道了。 4.按键 对于四个比例通道的控制显然不够用,有些项目也需要开关量的控制(比如灯的开关,模式的切换)于是我设计了两个额外的按键开关,可以用来控制一些开关量。 关于按键开关的检测电路我在这里直接将按键开关的两个引脚分别连接到GND和单片机的引脚,没有设置上拉电阻的原因是我会使用单片机内部的上拉电阻,所以不再需要外接上拉电阻,这样也节省了版面空间。 对于引脚的连接是需要分外注意的一点,一定要和单片机的外部中断引脚连接,这里讲解一下原因:如果不使用中断引脚去检测按键开关的状态话,由于按键操作的时间很短,这容易造成单片机在运行其他程序的时候错过按键检测的程序,这样按键的按下就无法检测到。如果按键连接在中断引脚,这样无论单片机在执行什么程序,都可以第一时间停止执行当前程序,进入中断服务程序去执行按键指令。对于Atmgea8来说,有两个外部中断引脚,于是我将这两个按键连接到这两个引脚上。 5.boost升压电路 这一次给Atmega8供电的电路是采用E50D方案的升压电路,最大输出电流800ma左右,足够使用了。在这里提醒一句,由于E50D工作频率在300khz左右,所以大家在布线的时候注意和低频线路的隔离。图中的二极管选择的是肖特基二极管,有着速度快的特性。 6.供电 在遥控器的供电上我好不犹豫选择了18650锂电池,这种规格的电池是市面上最常见的(许多充电宝里面都会用到)而且内阻也低,体型规整,方便布线以及固定。具体哪个牌子的18650锂电效果好,据说松下的电池不错,但是价格感人。。:L所以我用了神火的18650,先试试,不行的话换其他家的。 7.充电电路 充电芯片的话,对于一节锂电池的方案大家还是比较统一的,某宝上搜18650充电板一搜一大把,但是究其使用的充电IC,基本上都是TP4056。不仅便宜而且用起来反响不错,唯一问题就是发热有点大。。。 我放出我的电路图,大家如果有想设计充电电路的也可以借鉴一下。 R2连接在PROG引脚,用来设定充电电流,充电电流的设定可以参考公式:I=1/R*1200来设定,CHRG是充电状态指示引脚,当充电进行时,为低电平,充电完成后为高阻态。充电的接口用的就是micro usb,这样使用手机充电器就可以充电。 8.电压检测 关于电池保护电路我也想过,但是想到这是遥控器,万一低电量的时候保护板把输出断开了怎么办?(保护电路会在电池低电量的时候断开输出电压)那样岂不是会造成失控的后果?于是我放弃了使用保护电路,改为使用电压检测电路,这样当电池低电压的时候,可以维持整个系统的运作一段时间而不会立刻断电,从而提醒使用者更换电池。:lol 电压检测电路的话很简单,直接连接到atmega328的A0引脚,用ADC采样电压值。而关于报警电路,我使用555构成单稳态触发器,可以控制蜂鸣器断续鸣叫。 9.USB转TTL电路 因为使用了micro usb接口,索性再添加一个USB转TTL电路,这样烧写程序和充电就可以共用一个接口了,使用起来方便了许多。 至于TTL芯片的选用,自然是考虑CH340系列芯片了,使用范围很广而且比较稳定,在CH340的产品线中也有很多不同型号的,使用比较多的是CH340G以及CH340C的型号,但是由于他们使用的是SOIC16的封装,体积较大,所以我采用了CH340E,是CH340中最小的一款,外围电路简单,十分适合我的项目。 其中TNOW表示串口正在发送,高电平有效,于是我接了一个LED灯来指示串口的状态,这样的设计在一些USB转TTL模块上也比较常见。 10.预留接口 由于遥控器上不会涉及到太多的外接设备,这一次我仅仅预留了少许的接口。因为Atmega8需要烧写bootloader,所以我预留了一个烧写的接口,方便以后烧写。对于I2C接口我也有预留,主要是方便以后连接led显示屏使用 原理图绘制好了之后就是导出绘制PCB板了,因为要手持操作,所以对于外形还是很重要的,我绘制了一个长方形的边框,并把四周倒圆角,这样摸起来不会刮手。 经过一个多小时的布线以及摆放元件位置,我完成了设计: 这里有个改进的地方,就是发现这个电池盒的封装不对,于是又绘制了新的封装,并且将图纸发到工厂去了。。。 工厂制板中。。。。。。。。。 工厂制板中。。。。。。。。。 工厂制板中。。。。。。。。。 焊接测试篇 拿到了板子,接下来就是焊接的环节了,大家注意,一般正规PCB厂家发回来的板子都是真空包装的,这样可以防止焊盘被氧化,所以大家一定不要将所有的板子一股脑全部拿出来,我的习惯是焊几片我就拿几片出来,这样可以有效防止焊盘氧化。 下面就是刚刚寄回来的板子,用真空包装袋装着,热腾腾的: 当时为了焊接的方便,我将所有的元件基本上都放在了板子的一面,这样可以避免焊接时候需要板子两边翻来翻去的问题,也可以减少麻烦。 在选取电池的时候,我也在18650和锂聚合物电池两者之间0徘徊过,两者的最大区别就是外形,一个扁平长方形一个是圆柱形,但是考虑到握持手感的问题,如果使用锂聚合物可能会比较单薄,所以我特地用了18650电池,这样手握起来会比较饱满。我把18650电池盒的位置放在了板子的最下部。 介绍完了整体的布局,下面就是焊接过程了。对于焊接过程,并没有什么困难,关键就是对于引脚较密集的芯片的焊接,我使用了助焊剂,这样可以保证焊点不会出现粘连以及不饱满的现象。 在这次设计中我设计了USB转TTL芯片的位置,原因是充电和烧写程序正好可以公共用一个端口,这样节省了版面空间。对于芯片的选择,大家各执己见,但是我综合了我的板子情况考虑后,我选择了CH340E,仅仅需要几个外围滤波电容即可完成整个电路,这应该是市面上体积最小的USB转TTL方案,大家也可以考虑采用。 在设计中,我提到了两款ATMEGA系列芯片,一款是ATMEGA28,一款就是ATEMGA8,两者具有相同的引脚排布以及外围电路,区别就是内部资源的多少。但是对于我的遥控器来说,使用ATMEGA328显然是大才小用,因为整个板子只会涉及到ADC采样以及SPI总线通信(与NRF24L01)所以价格低廉的ATMEGA8是我最好的选择。 最后就是摇杆了,摇杆我使用的是PS2手柄上用的摇杆,某宝价格在3元一个左右,我的一个板子需要两个摇杆。 整个板子焊接完成大概用了一个多小时,然后就是对板子的测试了,关于充电功能,我设计的是充电红灯亮,充好电之后红灯熄灭,下面是测试结果。 充好电之后,将开关拨动到N的位置,可以看到电源红灯亮,说明E50D升压电路正常工作中。。。

  • 发表了主题帖: TMS320F28035 ECAN中断发送与接收

    本帖最后由 火辣西米秀 于 2019-10-13 16:39 编辑        在熟知CAN设置后,才能进一步引入中断,显然,这是TI芯片can的进阶。        TI can中断的作用在于,发送请求后,内部启动发送,发送完成之后,触发中断,进入中断里面,进行置位清零标志位;接收到匹配的ID数据后,触发中断,进入中断内,也进行置位清零,获取数据的操作。两个中断进入后,都需对PIE 组9进行置位清零的操作。        在实际调试中,我看到,就算接收邮箱中断进不去,但通过仿真,还是可以在MBOX中查看匹配的接收邮箱ID,具体查看是这一条: TestMbox3 = ECanaMboxes.MBOX16.MSGID.all;//从外部接收邮箱16的ID,16为接收邮箱(CANMD)        根据can指导手册来看,设置中断启动需要进行几个步骤,在查询上进行添加修改,即可,具体操作自己查说明,我参考的是《TMS320F28012原理与开发》,《TMS320F28335DSP原理与开发编程》这两份指导说明,另can中断需要在PIE开启需要查询《TMS320F28035 Datasheet》产品说明书。以下开始罗列我的修改: 声明中断函数加: __interrupt void Ecan1ISR(void); __interrupt void Ecan0ISR(void); 主函数main里加入: EALLOW;     ECanaRegs.CANMIM.all = 0x00010003;//open interp  T-0&1    R-16     ECanaRegs.CANMIL.all = 0xFFFF0000;     ECanaRegs.CANGIM.all = 0x00006703;//110 0111 0000 0011  //中断使能     ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;     ECanaShadow.CANMC.bit.STM = 0;    // 0-Normal     ECanaRegs.CANMC.all = ECanaShadow.CANMC.all; EDIS; EALLOW;  // This is needed to write to EALLOW protected registers        PieVectTable.ECAN1INTA = &Ecan1ISR;//R-CAN1  接收后中断函数        PieVectTable.ECAN0INTA = &Ecan0ISR;//T-CAN0  发送后中断函数  EDIS;   // This is needed to disable write to EALLOW protected registers     PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block     PieCtrlRegs.PIEIER9.bit.INTx6=1;     //R-CAN1  接收邮箱     PieCtrlRegs.PIEIER9.bit.INTx5=1;     //T-CAN0  发送邮箱     IER = 0x100; // Enable CPU INT-中断9使能     EINT;//开总中断 for(;;)  {        ECanaRegs.CANTRS.all = 0x00000001;  //发送请求box0  Set TRS for all transmit mailboxes        for(ii=0; ii<100; ii++)//延时        {            for(jj=0; jj<1000; jj++){}        }        ECanaRegs.CANTRS.all = 0x00000002;//发送请求box1        for(ii=0; ii<100; ii++)//延时        {           for(jj=0; jj<1000; jj++){}        }   } 加入中断函数: __interrupt void Ecan1ISR(void)//R  接收后进入的中断 {      DINT;      if(ECanaRegs.CANRMP.all==0x00010000)//RX get after flag and int   BOX16      {         ECanaRegs.CANRMP.all = 0x00010000;//clear GMIF16         TestMbox1 = ECanaMboxes.MBOX16.MDL.all;         if(TestMbox1==0x81010101)//data  发送进来的前4位数据              GpioDataRegs.GPATOGGLE.bit.GPIO5 =1;//标记     }     PieCtrlRegs.PIEACK.bit.ACK9 = 1;     EINT; } __interrupt void Ecan0ISR(void)//T  发送后进入的中断 {    DINT;     //TX over after flag and int   1-2BOX     if((ECanaRegs.CANTA.all == 0x00000001)||(ECanaRegs.CANTA.all == 0x00000002))     {        ECanaRegs.CANTA.all = 0x00000003;//clear GMIF16          }     PieCtrlRegs.PIEACK.bit.ACK9 = 1;     EINT; }       以上就是设置的内容,在我这边是可行的,因此分享出来,仅供参考,有异议讨论,本文章仍是需要自己动手调试理解的  

  • 回复了主题帖: MM32W无线MCU系列产品应用笔记 —— 智能炫彩遥控灯方案

    通过控制灰度来实现视觉上的亮度和颜色变化,红、绿、蓝三个颜色已经很普通了

  • 回复了主题帖: 【DSP】TMS320F28035 ADC例程(软件触发+查询)

    led2015 发表于 2019-10-13 11:26 有时想想,技术这种东西,要是有标题,内容,计划,设计,框图,代码,实验,视频,资料,摘要,说明,补充 ...
    有同感啊 谢谢回复

  • 发表了主题帖: 简简单单---一个TMS320F28035的按键驱动程序

    /************************************     标题:key.h     软件平台:CCS v5.2     硬件平台:毕设控制板     主频:60M *************************************/ #ifndef KEY_H_ #define KEY_H_   #include "PeripheralHeaderIncludes.h" #include <stdio.h>   #define delay_cheak 15000   #define KEY1     1 #define KEY2     2 #define KEY3     3 #define KEY4     4 #define noKEY    0   #define KEY1_on        GpioDataRegs.GPADAT.bit.GPIO19 == 0 #define KEY2_on        GpioDataRegs.GPADAT.bit.GPIO6 == 0 #define KEY3_on        GpioDataRegs.GPADAT.bit.GPIO12 == 0 #define KEY4_on        GpioDataRegs.GPADAT.bit.GPIO16 == 0 #define KEYs_on           (GpioDataRegs.GPADAT.all & 0x00091040) != 0x00091040   extern void (*key1_handle)(); extern void (*key2_handle)(); extern void (*key3_handle)(); extern void (*key4_handle)();   void KEY_init(void (*key1_dle)(), void (*key2_dle)(), void (*key3_handle)(), void (*key4_dle)()); char KEY_scanf_handle();   #endif /* KEY_H_ */ /************************************     标题:key.c     软件平台:CCS v5.2     硬件平台:毕设控制板     主频:60M        ********/ #include "key.h"   void (*key1_handle) () = NULL; void (*key2_handle) () = NULL; void (*key3_handle) () = NULL; void (*key4_handle) () = NULL;   void KEY_init(void (*key1_dle)(), void (*key2_dle)(), void (*key3_dle)(), void (*key4_dle)()) {        EALLOW;          GpioCtrlRegs.GPAPUD.all &= (~0x00091040); //除能上拉电阻        GpioCtrlRegs.GPADIR.all &= (~0x00091040);   //输入        GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;  //GPIO19        GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 2; // 6 samples          GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;  //GPIO6        GpioCtrlRegs.GPAQSEL1.bit.GPIO6 = 2; // 6 samples          GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;  //GPIO12        GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 2; // 6 samples          GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0;  //GPIO16        GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 2; // 6 samples          EDIS;          GpioDataRegs.GPASET.all |= 0x00091040;          key1_handle = key1_dle;        key2_handle = key2_dle;        key3_handle = key3_dle;        key4_handle = key4_dle; }   char KEY_scanf_handle() {     char KEY_mun = 0;     if(KEYs_on)         {             DELAY_US(delay_cheak);             if(KEYs_on)             {                    if(KEY1_on)                    {                        (*key1_handle)();                        KEY_mun = KEY1;                    }                    if(KEY2_on)                    {                        (*key2_handle)();                        KEY_mun = KEY2;                    }                    if(KEY3_on)                    {                        (*key3_handle)();                        KEY_mun = KEY3;                    }                    if(KEY4_on)                    {                        (*key4_handle)();                        KEY_mun = KEY4;                    }             }         }     return KEY_mun; }  

  • 发表了主题帖: 【DSP】TMS320F28035 ADC例程(软件触发+查询)

    #include "DSP28x_Project.h" Uint16 ConversionCount; Uint16 Voltage1[10]; Uint16 Voltage2[10]; main() {     InitSysCtrl();     DINT;     InitPieCtrl();     IER = 0x0000;     IFR = 0x0000;     InitPieVectTable();     InitAdc();     ConversionCount = 0;     EALLOW;     AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;    //转换完成前一个ADC时钟周期产生EOC     AdcRegs.INTSEL1N2.bit.INT1E     = 1;    //使能ADCINT1     AdcRegs.INTSEL1N2.bit.INT1CONT  = 0;    //关闭连续模式     AdcRegs.INTSEL1N2.bit.INT1SEL   = 1;    //将ADCINT1映射到EOC1     AdcRegs.ADCSOC0CTL.bit.CHSEL    = 0;    //将ADCINA0映射到通道0     AdcRegs.ADCSOC1CTL.bit.CHSEL    = 1;    //将ADCINA1映射到通道1     AdcRegs.ADCSOC0CTL.bit.TRIGSEL  = 0;    //软件触发SOC0     AdcRegs.ADCSOC1CTL.bit.TRIGSEL  = 0;    //软件触发SOC1     AdcRegs.ADCSOC0CTL.bit.ACQPS    = 6;    //设置窗口采样次数     AdcRegs.ADCSOC1CTL.bit.ACQPS    = 6;    //设置窗口采样次数     EDIS;     AdcRegs.ADCSOCFRC1.all = 0x0003;//强制给通道0和1产生SOC信号    for(;;)    {       while(AdcRegs.ADCINTFLG.bit.ADCINT1 == 0){}    //等待EOC1信号(ADCINT1)       AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;        //清除EOC1信号(ADCINT1)       AdcRegs.ADCSOCFRC1.all = 0x0003;//强制给通道0和1产生SOC信号       if(ConversionCount == 9)       {           ConversionCount = 0;       }       else ConversionCount++;       Voltage1[ConversionCount] = AdcResult.ADCRESULT0;       Voltage2[ConversionCount] = AdcResult.ADCRESULT1;    } }  

  • 2019-10-12
  • 发表了主题帖: MSP430F149的IO口

    1 概述 MSP430F149共有6组IO口,每组8bit, IO口的设置包括设置IO功能、方向、输入输出寄存器初值。对IO口不做设置,默认情况下为第一功能,输入模式。 2 常用寄存器 PxDIR 0 输入,1 输出; PxSEL 0 I/O口,1 第二功能; PxOUT,PxIN; PxIES 设置中断触发方式 0上升沿,1下降沿; PxIE 设置中断触发允许0禁止,1允许; PxIFG 中断标志寄存器,需要软件清零。 3 用法 IO口中断: P1,P2口总共有16个IO口均能引发中断,相关寄存器为PXIE(中断允许):0不允许,1允许。PXIES(中断触发岩选择)0上升沿、1下降沿。PXIFG(中断标志寄存器),I0口满足中断时相应位置一,只能通过软件清零。P1和P2分别公用两个中断入口PORT1_VECTOR,PORT2_VECTOR。注意IO口中断模式输入仍为第一功能,PXSEL=0。

  • 2019-10-11
  • 发表了主题帖: TMS320C6000芯片结构图和基本特性

    TMS320C6000 芯片结构图      TMS320C600的基本特性   TMS320C6000产品是美国TI公司于1997年推出的dsp芯片,该DSP芯片定点、浮点兼容,其中,定点系列是TMS320C62xx系列,浮点系列是TMS320C67xx系列,2000年3月,TI发布新的C64xx内核,主频为1.1GHz,处理速度9000MIPS,在图像处理和流媒体领域得到了广泛的应用。   C6000片内有8个并行的处理单元,分为相同的两组。DSP的体系结构采用超长指令字(vliw)结构,单指令字长为32位,指令包里有8条指令,总字长达到256位。执行指令的功能单元已经在编译时分配好,程序运行时通过专门的指令分配模块,可以将每个256为的指令包同时分配到8个处理单元,并有8个单元同时运行。芯片最高时钟频率为300MHz(67xx系列),且内部8个处理单元并行运行时,其最大处理能力可达到1600MIPS。   TMS320C6000的架构   1. CPU架构      2. C6000基本指令集   在“DSP TMS320C6000基础学习(1)”中已经说过:SOP是大部分DSP算法的关键单元。C6000的寄存器包括A,B两组。   我们将看看下面的表达式通过DSP指令是怎么一步步实现的,   Y=∑an*xn withn = 1.。.N   (1)an*xn乘法实现,DSP中有专门的硬件乘法模块,因此只需要一个指令就能完成乘法操作,而且指令周期为1。   其中MPY为乘法指令,.M表示DSP的乘法单元,上面指令执行Y1=a1*x1。   (2)加法实现,ADD指令,加法单元用.L表示,下面指令执行Y=Y+Y1      (3)内存数据装载(上面的操作其实是有问题的,MPY和ADD不能直接操作内存),只能使用如下命令:   LDB *Rn, Rm:转载一个字节(8bits)   LDH *Rn, Rm:装载一个半字(16bits)   LDW *Rn, Rm:装载一个字(32bits)   LDDW *Rn, Rm:装载一个double字(64bits)   其中Rn包含要装载操作数内存地址(32bits)的寄存器,Rm为目标寄存器。装载的DSP执行单元称为.D。   (4)将常量装入寄存器指令——MVKL和MVKH   MVKL const, Rn(低16bits)   MVKH const Rn(高16bits)   const是一个常量或标签值,只能先装低位再装高位。   比如(3)中,先要将操作数内存地址载入Rn中,因为地址长度为32bits,必须依次使用上面的2条指令完成地址到寄存器的载入工作,   MVKL Addr_low8 Rn   MVKL Addr_high8 Rn   (5)综合(1)~(4)指令完成a1*x1的过程      其中pt1和pt2分别为a与x地址。   (6)循环指令   为完成Y=∑an*xn withn = 1.。.N,还有一个循环求和的过程,与其它平台类似,DSP中通过跳转指令和计数器实现循环,实现循环的步骤为:   添加一个标签(下一次要跳转到何处);   添加跳转指令(B);   创建一个循环计数器;   添加一条指令用于对循环计数器更新;   使跳转指令根据计数器的值做相应的跳转;

  • 2019-10-09
  • 发表了主题帖: 单片机在倒立摆控制系统的应用

          倒立摆作为一种典型的控制系统实验装置,具有非线性、自然不稳定等特性,常用来作为检验某种控制理论或方法是否合理的典型方案。一阶倒立摆系统能用多种理论和方法来实现其稳定控制,如PID、自适应、状态反馈、模糊控制及人工神经元网络等多种理论和方法都能在倒立摆系统控制上得到实现。   1系统构成及工作原理   图1为一阶旋转倒立摆结构示意图。直流电机作为唯一的动力装置,与旋臂保持刚性连接,带动旋臂在水平面内旋转,旋臂的一端通过转轴(本系统选用电位器角度传感器)与摆杆连接,摆杆可做垂直于旋臂的圆周运动。在自然状态下,摆杆为竖直下垂状态。倒立摆控制的目的是通过控制直流电动机的运动状态,使摆杆保持倒立状态。   图1倒立摆结构示意图   系统工作原理如下:摆杆摆动时,角度传感器检测摆杆的角度,根据角度传感器的输出特性,其输出电压经A/D转换器转换成电压数字量,该数字量与期望的值进行比较产生偏差,通过单片机对该偏差进行处理,即PID控制运算,根据运算结果产生控制信号控制电机和旋臂的转动,使摆杆的角度与期望的角度更接近。   倒立摆控制系统结构框图如图2所示,单片机(51单片机)为控制器,直流电机为执行器,倒立摆为被控对象,倒立摆角度为被控量,角度传感器和模数转换器构成反馈回路。   图2倒立摆控制系统结构框图   2 倒立摆控制系统的硬件设计   2.1单片机最小系统   该系统中选用了STC90C51单片机,该型单片机   具有以下特点:①八位MCU核,与传统8051兼容;②大容量存储空间,包括64kB程序空间,1280B   SRAM等;③具有4个八位并行I/O口,3个定时/计数器,2个外部中断源和1个全双工UART传输口;④5V供电时,最高支持80MHz振荡频率,具备高速浮点运算能力,适合倒立摆系统等较为复杂的控制系统使用。51单片机最小系统如图3所示。 图3 51单片机最小系统   2.2摆杆角度检测   检测摆杆角度所用到的角度传感器种类非常多,常用的有电位器式角度传感器、光电编码器、陀螺仪模块等。由于电位器式角度传感器原理简单,检测精度取决于所用A/D转换器的精度,成本相对较低,因此,综合多方面要求,本系统选用电位器式角度传感器。   传感器返回的电压信号无法被单片机直接识别,所以需要通过A/D转换,将模拟电压信号转换为二进制数的形式,然后单片机才能计算出偏差,进而产生相应的输出。A/D转换器常用的有8位和12位输出,在本系统中选用8位A/D转换器即可满足控制要求,其型号选用ADC0809,相应电路原理图见图4。 图4 A/D转换电路   A/D转换器的时钟脉冲为单片机ALE引脚输出的脉冲经74LS74芯片分频之后得到,A/D转换器的8位数字信号通过单片机的P0口进行采集与处理。   2.3驱动电路   本系统选用的直流电机额定电压为24V,额定功率为30W,单片机的I/O口不足以提供如此大的驱动能力,故需采用驱动电路。常用的直流电机驱动芯片为L298N,可驱动两路直流电机,最大驱动电压为46V,最大电流2A~3A,满足设计要求。直流电机驱动电路如图5所示。 图5 直流电机驱动电路   图5中,L298N的ENA为使能端,可作为单片机PWM(脉宽调制)控制端,控制直流电机转速;IN1和IN2为信号输入端,OUT1和OUT2为输出端,输出   状态与输入状态对应,控制直流电机转向。输出端的二极管为续流二极管,起保护电动机线圈的作用。   3倒立摆控制系统的软件设计   3.1控制算法   本系统采用PID控制算法,PID算法适用于负荷变化大、容量滞后较大、控制品质要求高的控制系统。PID算法有3个可设定参数,即比例放大系数KP、积分时间常数TI、微分时间常数TD。比例调节的作用是使调节过程趋于稳定,但会产生稳态误差;积分作用可消除被调量的稳态误差,但由于积分饱和等原因可能会使系统振荡甚至使系统不稳定;微分作用能有效地减小动态偏差[4]。其传递函数为:   其中:u(k)为第k个采样时刻的输出;e(k)为第k个采样时刻的偏差值;T为采样周期;KP为比例放大系数;TI为积分时间常数;TD为微分时间常数。   在实时性要求较高的倒立摆系统中,积分作用常常使系统对偏差的调节变慢,使动态相应变慢。因此要尽量弱化或者消除积分作用,使用PD调节规律即可。在该系统中,输入变量为给定值与实际检测到角度的差值,输出变量控制所产生的PWM波形的占空比。由于旋臂、摆杆以及电动机的各项参数很难准确把握,且干扰较多,难以建立精确的数学模型,因此采用试验法整定参数的数值,即根据系统表现出的状态,调节各参数的数值,直至系统达到稳定。   3.2程序流程图   倒立摆系统主程序流程图见图6。其中,U为PID运算的输出值,为输出PWM波形的占空比,由于所选单片机不具备专用PWM输出引脚,需要利用定时器T0模拟其波形输出,定时器T0中断子程序流程图见图7。在本系统中,采样周期选择为10ms,由定时器T1控制,定时器T1中断子程序流程图见图8。   4系统测试   本系统测试所用到的倒立摆模型为自制简易模型,测试过程如下:外力将摆杆拉起至接近倒立状态(与倒立状态相差20°左右);给系统上电,同时撤去外力,观察到摆杆迅速呈倒立状态,经过几次调整,即可长时间保持倒立状态。系统达到稳定状态的效果如图在摆杆保持倒立状态时,施加一扰动,即轻碰摆杆或旋臂,系统经过短时间的调整之后,仍可以自动调节至稳定状态,说明该系统具备较强的鲁棒性。   5结论   本系统采用单片机作为一阶旋转倒立摆系统的控制器,执行了数据采集、数据处理(PID运算)、控制直流电机运行状态等操作,成功使该系统稳定,其经济性和实用性得到了很好的展现。同时也体现了经典PID控制理论在一阶倒立摆系统中使用时良好的控制效果。

  • 发表了主题帖: TI C2000 TMS320F28379D SCID SCIB 的配置与使用

           TI的官方例程里面只给了SCIA的配置而没有给其他的SCI的配置方法 其实这些的配置都是一样的,下面以SCIB和SCID的配置为例并结合数据手册说明一下配置过程:至于一些参数为什么要向程序中那样配置可参考F28379的技术手册和博客最后面的截图(当然了也都是在技术手册中截的) 注:程序中红色的代表需要注意的部分,其他颜色的对应下面相同颜色的函数实现方式 /*****************系统配置*****************/     InitSysCtrl();        // 初始化系统     InitGpio();            // 初始化GPIO    SciIOCfg();            // 初始化SCI   引脚的初始化     /*中断配置*/      DINT; //关闭所有中断     InitPieCtrl();  //初始化PIE 控置寄存器到它们的默认状态。默认所有 PIE 被清除     //失能所有的CPU中断 并清除所有的CPU中断标志:     IER = 0x0000;     IFR = 0x0000;     InitPieVectTable();//用指向shell中断服务例程(ISR)的指针来初始化PIE 向量表。     /*中断向量配置*/     EALLOW;     PieVectTable.SCIB_RX_INT = &scibRxFifoIsr;        //串口B接收中断     PieVectTable.SCID_RX_INT = &scidRxFifoIsr;      //串口D接收中断     EDIS;     /*SCI带FIFO接收中断*/     scib_fifo_init();                     //初始化SCI_B 的FIFO     scid_fifo_init();                    //初始化SCI_D 的FIFO     PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block     PieCtrlRegs.PIEIER9.bit.INTx3 = 1;   // PIE Group 9, INT3,配置sciB 接收中断使能*/     PieCtrlRegs.PIEIER8.bit.INTx7 = 1;   // PIE Group 8, INT7,配置sciD 接收中断使能*/     IER |= M_INT9|M_INT8;                // Enable CPU INT     EINT;   //启用全局中断INTM   下面结合上面的代码对配置过程进行详解: 首先是其中SCI初始化函数的配置程序: 1.SciIOCfg(); void SciIOCfg(void) {     /*SCIB:配置GPIO为上拉和复用功能*/ //注意这里端口引脚的复用需要找数据表中 GPIO Muxed Pins端口复用引脚的第几种复用方式 SCIB为2     //RX--P19     GPIO_SetupPinMux(19, GPIO_MUX_CPU1, 2);     GPIO_SetupPinOptions(19, GPIO_INPUT, GPIO_PULLUP);  //这里应该是GPIO_PULLUP ->1  例程错误 原本例程为GPIO_PUSHPULL ->0  正确应该是GPIO_PULLUP 启用上拉     //TX--18     GPIO_SetupPinMux(18, GPIO_MUX_CPU1, 2);     GPIO_SetupPinOptions(18, GPIO_OUTPUT, GPIO_ASYNC);     /*SCID:配置GPIO为上拉和复用功能*/ //注意这里端口引脚的复用需要找数据表中 GPIO Muxed Pins端口复用引脚的第几种复用方式 SCID为6     //RX--P105     GPIO_SetupPinMux(105, GPIO_MUX_CPU1, 6);     GPIO_SetupPinOptions(105, GPIO_INPUT, GPIO_PULLUP);     //TX--104     GPIO_SetupPinMux(104, GPIO_MUX_CPU1, 6);     GPIO_SetupPinOptions(104, GPIO_OUTPUT, GPIO_ASYNC); }   FIFO初始化函数:scib_fifo_init();      (当然SCID只需把程序中的scib改成scid即可 这里不赘述SCID) void scib_fifo_init(void) {     ScibRegs.SCICCR.all = 0x0007;              // 一个停止位 无回环                                             // 无奇偶校验位 ,8个字符位 ,                                                   // async (空闲线)模式, 空闲线协议     ScibRegs.SCICTL1.all = 0x0003;             // 使能 TX, RX, 内部 SCICLK(SCI时钟),                                                   // Disable RX ERR, SLEEP, TXWAKE     //波特率高低位     ScibRegs.SCIHBAUD.all = 0x0000;     ScibRegs.SCILBAUD.all = SCI_PRD;        // 配置波特率为SCI_PRD     ScibRegs.SCIFFTX.all = 0xE040;        // 使能SCI的FIFO功能,重置SCI,发送重置     ScibRegs.SCIFFRX.bit.RXFFIENA = 1;        // 使能SCI FIFO发送功能     ScibRegs.SCIFFRX.bit.RXFFIL = RXNUM;    // 设定接受位数为RXNUM 0h-10h     ScibRegs.SCIFFRX.bit.RXFFINTCLR =1;        // FIFO计数中断标志位清零     ScibRegs.SCIFFCT.all = 0x00;     ScibRegs.SCICTL1.all = 0x0023;             // 重启sci     ScibRegs.SCIFFRX.bit.RXFIFORESET = 1;    // 重启sci接收fifo }   至于波特率的配置就需要对照官方例程了,注意:时钟为200兆时才正确 如何计算可以在技术手册中找到哦!SCI的官方例程中也是这样计算的 //波特率计算方式 #define CPU_FREQ           200E6 #define LSPCLK_FREQ     CPU_FREQ/4 #define SCI_FREQ        115200 #define SCI_PRD         (LSPCLK_FREQ/(SCI_FREQ*8))-1

  • 2019-10-08
  • 发表了主题帖: 根据数字信号处理器与PC机高速通信的设计

          近些年,随之模拟信号技术性的发展趋势,必须解决的信息量愈来愈大,解决的速率也变快,因而具备髙速特性DSP 集成ic的运用获得了普遍高度重视。而根据DSP 解决的统计数据通常要传送给PC 机开展储存和再解决,那麼就务必处理DSP 与 PC 机中间的高速通信难题。本方案设计以德州仪器(TI)的C5000 系列产品DSP 集成icTMS320VC5416为微控制器,运用Cypress企业出示的USB2.0插口集成icCY7C68001 保持了USB2.0 从机接口设计,进而使PC机与DSP 根据USB2.0 插口保持髙速双重地传送数据。   2 TMS320VC5416 与CY7C68001 EZUSBSX2硬件配置接口设计   系统软件计划方案选用PC机做为上位机,承担USB系统总线上检验到机器设备连接并开展枚举、鉴别的全过程,而且能够根据在PC机上运作手机应用程序来控制参数的传送。USB集成ic做为USB机器设备端,联接DSP与上位机的数据传输。DSP用以保持USB协议书,根据DSP程序编写保持DSP统计数据根据USB插口与PC机通讯,且USB集成ic的描述符载入及各种各样指令情况的解决均根据DSP程序编写保持。   TMS320VC5416 是TI 的这款16bit 指定性能DSP,因为VC5416的功率低、特性高,其分离的指令和数据室内空间使该集成ic具备高宽比的并行操作工作能力,在单周期时间内容许指令和数据一起存储,加上高宽比提升的指令集,促使该集成ic具备很高的与运算速率,一起该集成ic自身 具备丰富多彩的片内存储器資源及其多种多样上面外接设备,因而在建筑界获得了普遍的运用。   Cypress 企业的CY7C68001 EZ-USB SX2 是这款性能、方便使用的USB2.0 插口集成ic,考虑USB2.0 协议书,可工作中在髙速(480Mbps)或飞速(12Mbps)方式下,出示1个操纵端点用以解决USB机器设备的恳求及其4个可配备端点用以传送操纵和网络信号,这4个端点共享资源1个4KB的FIFO室内空间,具有规范的8位或16位外界服务器插口,可无缝拼接联接多种多样规范微控制器,比如说DSP、ASIC和FPGA等,并可依据要求设定为同歩或异步插口,片内集成化锁相环(PLL),该集成ic运用于DSL调制调解器、MP3、SD读卡器、数码科技照机、扫描机、复印机等机器设备。   系统软件的硬件配置接口设计如图所示1、图2图示,二者根据统计数据、地址总线及其读、写电源线等开展通讯,CY7C68001的片选数据信号联接至TMS320VC5416 的I/O室内空间片选数据信号上,CY7C68001 的FIFO拓展在VC5416 的I/O 室内空间上。     根据DSP与PC机中间的高速通信设计方案   开关电源一部分选用一整片1117 将5V 变为3.3V供求平衡CY7C68001EZ-USB SX2,仿真模拟地与大数字地中间选用磁珠联接,校准一部分选用RC电路原理,且集成ic材料上详细介绍有典型值100KΩ和0.1μF。   3 插口实际操作基本原理   CY7C68001 有2个外界插口:   (1) 指令插口:用于浏览CY7C68001 寄存器、Endpoint 0缓冲器,及其叙述表。   (2) FIFOapi接口:用于浏览4个1K字节数的FIFO中的统计数据。   这2个外界插口均能够根据同歩或异步的方法开展浏览。   本设计方案选用异步的方法开展浏览。依据图3 的详细地址分派,运用TMS320VC5416 的四根上位详细地址线(A11、A12、A13)联接CY7C68001 的FIFOAD0/1/2,用于挑选FIFO2、FIFO4、FIFO6、FIFO8及其指令插口,其详细地址表如图所示3图示。CY7C68001的详细地址线FIFOADR[2:0]为100B 时,选定CY7C68001 的指令口(Command)。根据CY7C68001的指令口,能够浏览37个寄存器、Endpoint 0缓冲器(64个字节数FIFO)和叙述表(500个字节数FIFO)等,对这种寄存器开展读写能力方法选用再次寻址方式,即最先根据指令口即将寻址方式的寄存器的子详细地址和实际操作种类(读或写)载入,随后再根据指令口将统计数据读取或载入相对的寄存器。      载入指令口的內容称之为命令字,命令字包括要寻址方式的寄存器的子详细地址,或要载入寄存器的统计数据的高4位或低4位。读指令口务必要跟在给指令口写读命令字以后,读取的为相对寄存器的8位统计数据。因此,寄存器的写实际操作由3 个流程构成:     4 USB 插口的软件开发   USB插口的软件开发由两一部分构成:一要在PC机Windows中运作USB 2.0 UTIlity 专用工具,是1个Windows 图形用户界面手机软件,出示CY7C68001 与Windows 电脑操作系统的插口程序流程,促使CY7C68001的开发设计越来越简易。二要在在DSP中运作嵌入式应用编程代码,出示硬件配置的驱动器,用于管理方法CY7C68001开展不一样方法的数据处理方法,从而实现USB2.0 传送协议书。   4.1 USB 插口的软件开发步骤   USB插口的软件开发,DSP端编码大概包含DSP集成ic复位(vc5416_init 涵数)、USB集成ic复位(sx2_init 涵数)、USB集成ic配备程序流程( s x 2 _ s e t u p 涵数) 及其USB 集成ic统计数据读写能力程序流程(sx2_processdata 涵数),操作流程如图所示4 图示。   DSP集成ic复位(vc5416_init涵数)关键承担设定VC5416的输出功率,配备SWCR及其SWWSR寄存器,另一个本软件系统选用1个GPIO脚位做为68001的校准数据信号,因此还必须进行有关设定。     USB集成ic复位(sx2_init涵数)关键承担消除Buffer堆栈及其使能VC5416 的外界终断INT1,待复位完毕后传出READY终断,这时DSP将描述符载入68001,开展枚举全过程,待枚举根据后传出ENUMOK终断,枚举方法能够选用外界EEPROM根据I2C系统总线通电后从外界导进描述符,也可选用根据运作DSP程序流程从DSP导到68001,本软件系统选用第二类枚举方法。   USB集成ic配备程序流程(sx2_setup涵数)是在指令安全通道(0连接点)接到没法全自动解决的上位机恳求,68001向VC5416传出SETUP终断后实行的程序流程,这时VC5416 根据对SETUP寄存器持续实行八次读操作步骤就能获得8字节数恳求,系统软件能够响应当恳求或STALL该恳求。   USB 集成ic统计数据读写能力程序流程(sx2_processdata 涵数)即PC 机与USB从机器设备端遵循USB传送协议书开展数据通讯。   CY7C68001的详细地址FIFOAD[2:0]为100时,选定CY7C68001的指令插口。针对指令插口的读写能力要分二步开展,即在READY合理时,先根据指令插口载入要寻址方式寄存器的子详细地址和实际操作种类(读或写),以后,在READY再度合理时段2次读写能力指令插口,就能读写能力一个字节的统计数据。   4.2 终断服务项目编程设计关键点   DSP应用1个外界终断脚位(INT1)与CY7C68001的INT脚相接,USB系统总线上造成一连串的主题活动,均会开启相对的终断,如果终断造成,DSP 是从CY7C68001 的Command 嘴中载入相对的值,来分辨造成的是哪种终断。

  • 2019-09-21
  • 发表了主题帖: 三极管偏置电路分析方法

    1.了解基极静态偏置电流作用   偏置电路的作用是给三极管提供基极直流电流,这一电流又称基极静态偏置电流。   只有当三极管工作在放大状态时,才给三极管提供静态偏置电流,而这一电流是保证三极管工作在放大状态的必要条件,静态电流不正常,三极管放大信号的工作就一定不正常,掌握三极管放大器的这一重要特性。   静态工作电流就是没有信号输入放大管时三极管各电极的直流工作电流,这一电流由放大器电路中的直流电源电路提供。   2.基极偏置电路具体分析方法和思路培养   三极管基极偏置电路分析最为困难,掌握下列电路分析方法和步骤可以方便基极偏置电路的分析。   (1)电路分析的第一步在电路中找出三极管的电路符号,如下图所示,然后在三极管电路符号中找出基极,这是分析基极偏置电路的关键一步。   三极管偏置电路分析方法   (2)从基极出发,将基极与电源端(+V端或-V端)相连的所有元件找出来,如下图所示电路中的R1,再将基极与地线端相连的所有元件找出来,如电路中的R2,R2与地线相连,这些元器件构成基极偏置电路的主体电路。   三极管偏置电路分析方法   分析与基极相连的各元件,区别哪些元器件可能是偏置电路中的元器件。电阻器有可能构成偏置电路,电容器具有隔直作用而视为开路,所以在分析基极直流偏置电路中,不必考虑电容器。这一电路中R1和R2构成分压式偏置电路。   三极管偏置电路分析方法   (3)确定偏置电路中元器件后,进行基极电流回路的分析,如上图所示。基极电流回路是:直流工作电压+V→偏置电阻R1一VT1管基极→VT1管发射极一VT1管发射极电阻R3一地线。3.掌握三极管静态电流细节问题   三极管的静态电流大小影响三极管的二个重要参数:三极管噪声和电流放大倍数。   (1)静态电流与放大倍数之间关系。静态电流大小与三极管的噪声大小相关,静态电流大,噪声大,反之则小。   三极管偏置电路分析方法   静态电流大小还与三极管放大倍数相关,如上图所示是基极电流与放大倍数p之间的关系曲线,从图中可以看到,在基极电流为一定值时,放大倍数β为最大,基极电流大于或小于这一定值时,放大倍数p要都下降。不同型号三极管有不同的这样特性曲线,但是很相似。   (2)静态电流与噪声之间关系。在一个多级放大器中,会用到数级单级放大器,这时要求前级放大器中三极管静态电流较小,以降低整个放大器的噪声,因为前级电路的微小噪声都将被后级放大器所放大。      三极管偏置电路分析方法   如图,NPN三极管T1处于基极偏置状态。   首先要了解,三极管的基极偏置电路多应用于开关电路;即应用数字电路的TTL电平来控制三极管的导通和截止;即此时的三极管只有两种工作状态——饱和导通和截止。   然而,基极偏置下的三极管Q点不稳定,容易受到各种因素的影响,如温度等;所以为了保证三极管的工作状态保持在饱和导通和截止状态,即保证三极管充当开关时能够稳定的开和关,一般我们取三极管的增益为10。   利用上面的知识我们就可以进行三极管基极偏置驱动继电器电路的设计了。   首先,我们要了解继电器的一些知识;我举个我从松乐继电器数据手册上看到的数据,当选型12V继电器时,它有155欧姆的电阻,需要77mA的驱动电流。   我们此时可以将继电器看成是一个155欧姆的电阻,并且有77mA的电流流过。即 Ic = 77mA ;   根据 Ic = Ib * 增益 ; 增益为10。   得到 Ib = 7.7mA ;   而,如果我们使用 5V 的MCU,那么此时MCU的控制电平为5V,计算 Rb = 5V / 7.7mA = 650欧姆;   然后,我们个继电器加上续流电路,为MCU端口加上下拉电阻(为了防止MCU复位时的误动作);   就这样,一个基于NPN三极管基极偏置驱动继电器的电路就设计完了。

  • 2019-09-19
  • 发表了主题帖: MM32W无线MCU系列产品应用笔记 —— 智能炫彩遥控灯方案

           基于蓝牙技术的智能灯控方案是智能家居应用重要组成部分,通过连接手机APP可以控制灯的开关、亮度、设定开关时间、统计耗电量等功能。该方案具有控制方便,功能多样,操作迅速,设计开发简单等优势。   硬件资源: LED的驱动分别使用PA9/10/11输出PWM波形控制三极管来驱动RGB灯。通过控制灰度来实现视觉上的亮度和颜色变化,红、绿、蓝三个颜色通道每种颜色各分为255阶亮度,在0时"灯"最弱--是关掉的,而在255时"灯"最亮。当三色数值相同时为无色彩的灰度色,而三色都为255时为最亮的白色,都为0时为黑色控制频率。可以使用几百赫兹到几十K赫兹来进行调节不同色彩的灯光。驱动控制原理部分详见下图:   图1 RGB灯驱动原理图   软件资源: 1、PA9/10/11为TIM1的CH2、3、4的捕获比较输出通道,需要将三个IO工作模式的配置为复用推挽输出,同时配置AF寄存器为TIM1的CH2、3、4功能,TIM1需要配置CH2、3、4为脉冲宽度调制模式。配置方式实现代码如下:   void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; TIM_OCInitTypeDef  TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE);  GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,GPIO_AF_2); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10,GPIO_AF_2); GPIO_PinAFConfig(GPIOA, GPIO_PinSource11,GPIO_AF_2); TIM_TimeBaseStructure.TIM_Period = 255*100; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  TIM_OC2Init(TIM1, &TIM_OCInitStructure); TIM_OC3Init(TIM1, &TIM_OCInitStructure); TIM_OC4Init(TIM1, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE); TIM1->BDTR |= 0x8000; //上电亮白光 SetLEDLum(0,0,0,100); SetLEDLum(0,0,100,101); }   2、我们在UpdateLEDValueAll函数中调用Led_getInfo(data)来获取RGB的配置信息,data是一个数组指针,数组成员包含RGB三个LED的灰度值(0-255),而Led_getInfo(data)最终通过调用server_rd_rsp(u8 attOpcode, u16 attHandle, u8 pdu_type)函数来获取手机APP发送给我们的信息。根据data信息修改TIM1的CCR2、3、4的大小来调节CH2、3、4三路PWM输出的占空比,进而调节REB的三个LED的亮度,来实现我们对于不同色彩、亮度的需求。详细实现代码如下:   void UpdateLEDValueAll(void) //porting function { int t; unsigned char data[7]; unsigned char EnableLED_Flag = 0; unsigned int Led_Lum_percent = 100; Led_getInfo(data); EnableLED_Flag = data[0]; if(EnableLED_Flag == 0) { TIM_SetCompare2(TIM1,0); //G TIM_SetCompare3(TIM1,0); //B TIM_SetCompare4(TIM1,0); //R } else { Led_Lum_percent = data[6]; t = data[3] * Led_Lum_percent; TIM_SetCompare2(TIM1,t); //Rx100 t = data[2] * Led_Lum_percent; TIM_SetCompare3(TIM1,t); //Gx100 t = data[1] * Led_Lum_percent; TIM_SetCompare4(TIM1,t); //Bx100 } }   我们选用一款通用APP做为控制端,操作流程如下: 1.     手机打开App,会自动开始搜索蓝牙设备名(如MindMotionLED)并连接。 2.     连接成功以后app出现RGB控制界面,可以在APP界面中点选不同区域来改变LED灯的颜色。                           图2 APP界面

  • 2019-09-10
  • 发表了主题帖: C6678的SRIO和FPGA的通信

    设计的板子到了SRIO调试阶段了,在板子上,一片V6和两片6678通过4XSRIO互联,中间没有Switch,总算搞定了相互之间的通信。   首先,感谢Ti论坛提供的SRIO程序范例,但是其硬件平台是EVM板,更多的只能用于loopback测试,但是可以在其基础上修改。 1.初始化DSP的SRIO,主要是对SerDes进行配置,然后是Lane和Speed的配置,最后需要等待FPGA的LinK建立,我们在建立时候碰到一点困难,每次建立并不都是4X,一直没有找到问题,我们使用了一个别的办法来保证link为4X。方法是:判断如果不为4x的话重新训练 2.数据发送,DSP上提供的数据发送方法主要有两种,DirectIO和Message,主要区别为DirectIO需要TX和RX双方知道地址映射关系,而Message是通过Message中mail信息得到数据需要保存的地址,我们使用的为DirectIO方法,6678上提供了8组LSU来进行DirectIO数据发送,每个LSU有6个寄存器,当5th寄存器写完后,数据会发送出去,第6个寄存器主要用于检测当前的LSU状态。LSU还有16(32)个影子寄存器  3.SWRITE/NWRITE/NREAD:对DSP来说,初始化完SRIO后,FPGA便可以通过SRIO来发送数据,但是要注意,Designer并不知道什么时候FPGA会发送数据,所以通常会先发送一个DoorBell信息来告知DSP,FPGA要发送数据了,DoorBell可以触发中断,对于NREAD来说,FPGA发送这个命令后,DSP会自动的将请求的数据发送出去,Designer也并不知道数据发送出去,这些都需要DoorBell来支持。   1 问题: 你好,我们现在也能DSP发数据到fpga,但是存在如下问题:    dsp用Nwrite给fpga写数据,fpga能收到数据但是没有响应数据给dsp?(请问需不要两边都确认下 读写的地址??)   dsp用Nread给fpga发,尝试着读取fpga里的数据,但是fpga这边没反应?   fpga主动发起给dsp读写数据,dsp那边该怎么写程序啊?   答:    采用DirectIO模式,FPGA不会主动响应的    DSP发送Nread命令,FPGA应该使用用户接口将Nread命令中请求的地址空间中的数据发送出去    可以采用先发送Doorbell,再发送数据   2 问: 现在我们已经能dsp主动发起对fpga进行读写,但可是fpga无法主动发起对dsp进行读写? 不知道fpga这边需要怎样配置ip核才能实现 dsp,fpga都能主动发起读写数据请求?? 答: 如果没记错的话,FPGA发送NREAD命令就可以了,DSP会自动将数据发送过去,注意NREAD命令中的地址是DSP的实际访问地址   3 问: 你好,请问用DirectIO传输数据是用DMA传输的吗? 这个需要寄存器配置还是直接默认的就是? 还有,FPGA这端有没有DMA这个说法?需不需要进行配置啊? 答: 应该不需要 FPGA没有DMA这个东西 一般FPGA的DMA都是和上位机配合完成的本身没有DMA的吧

  • 2019-09-09
  • 发表了主题帖: 用MCU的PWM产生负电压的教程

         我们应该知道,有一种开关电源是通过PWM波来实现的,但你知道通过PWM波也能输出负电压吗?   负电压的产生电路图原理      在电子电路中我们常常需要使用负电压,比如我们在使用运放的时候常常需要建立一个负电压。下面就简单的以正5V电压到负电压5V为例说一下它的电路。        通常需要使用负电压时一般会选择使用专用的负压产生芯片,但这些芯片都比较贵,比如ICL7600、LT1054、MC34063等。MC34063使用的最多了,关于34063的负压产生电路这里不说了,在datasheet中有的。下面请看我们在单片机电子电路中常用的两种负电压产生电路。            现在很多MCU都带有PWM输出,在使用单片机的时候PWM很多时候是没有用到的,用它辅助产生负压是不错的选择。         上面的电路是一个最简单的负压产生电路了。使用的原件是最少的了,只需要给它提供1kHz左右的方波就可以了,相当简单。这里需要注意这个电路的带负载能力是很弱的,同时在加上负载后电压的降落也比较大。   由于上面的原因产生了下面的这个电路:     负电压产生电路分析         电压的定义:电压(voltage),也称作电势差或电位差,是衡量单位电荷在静电场中由于电势不同所产生的能量差的物理量。其大小等于单位正电荷因受电场力作用从A点移动到B点所做的功,电压的方向规定为从高电位指向低电位的方向。         说白了就是:某个点的电压就是相对于一个参考点的电势之间的差值。V某=E某-E参。一般把供电电源负极当作参考点。电源电压就是Vcc=E电源正-E电源负。   想产生负电压,就让它相对于电源负极的电势更低即可。要想更低,必须有另一个电源的介入,根本原理都是利用两个电源的串联。电源2正极串联在参考电源1的负极后,电源2负极就是负电压了。     一个负电压产生电路:利用电容充电等效出一个新电源,电容串联在GND后,等效为电源2,则产生负电压。     1、电容充电:当PWM为低电平时,Q2打开,Q1关闭,VCC通过Q2给C1充电,充电回路是VCC-Q2-C1-D2-GND,C1上左正右负。   2、电容C1充满电。     3、电容C1作为电源,C1高电势极串联在参考点。C1放电,从C2续流,产生负电压。   当PWM为高电平时,Q2关闭,Q1打开,C1开始放电,放电回路是C1-C2-D1,这实际上也是对C2进行充电的过程。C2充好电后,下正上负,如果VCC的电势为5点几伏,就可以输出-5V的电压了。    

  • 2019-09-08
  • 发表了主题帖: 消除干扰

        我们对高精度数模转换器 (DAC) 中的输出干扰源进行了探讨。若您希望在增加代码的过程中获得线性转换,那么这些输出脉冲可能会扰乱系统运行。   DAC 输出干扰的“能量”由脉冲(以绿色显示)的宽度和高度定义。可根据系统要求对干扰的形状进行很好的控制。在 DAC 输出的后面添加一个简单的 RC 滤波器能够减小干扰的幅度,但会增加建立时间,而干扰“能量”(曲线下面的区域)保持不变。下面以 DAC 通过主要进位转换阶段为例,展示了 RC 滤波器之前和之后的输出。   应通过观察干扰周期并提前 10 个单位左右选择截止点 (cutoff point) 来为 RC 滤波器选择适合的电阻与电容比。在选择组件值时,应使用较小的电阻值以避免电阻负载上产生较大的压降。电容值可根据所选的电阻值和所需的 RC 比率进行确定。 降低干扰的另一种方案是使用跟踪与保持放大器。这种方法比较麻烦,因为需要严格的开关定时和外部组件,会导致成本和板级空间增加。 通过使用外部开关、一些无源组件以及放大器,您能够完全去除 DAC 输出干扰,但同时会出现来自新 S/H 开关的小瞬态信号。可利用一阶低通滤波器级来减弱这种新的短小瞬态信号。基本原理图如下所示。   系统设计结构非常简单明了。当 DAC 通过主要进位转换阶段时,开关打开。这就是出现干扰的地方。一旦电压转换完成,开关就会闭合,并为 CH 采样电容器充电以达到所需值。当 DAC 再次更新其输出时,随着外部开关打开电容器会继续保持新的电压值。这样您在理论上就可以完全消除干扰,且不会增加建立时间。 下面是这两种解决方案的优缺点:         如果系统可以容许增加建立时间,并且需要降低干扰脉冲的幅度值,那么简单的 RC 滤波器就足够了。         如果系统需要完全消除干扰,则可采用跟踪与保持放大器解决方案。 当然,另一种选项是为了避开 R-2R DAC,而采用电阻串 DAC 解决方案进行设计则可用避免出现较大干扰。应注意,这样做可能会让您不得不对其它 DAC 规范进行权衡。

  • 2019-09-07
  • 发表了主题帖: 单片机编程使用C库函数

    1.printf函数 这个非常简单。只要重定向printf函数即可。 这个是STM8L单片机代码,注意:如果是IAR编译器需要开启library-FULL 亲测在msp430,stm32,stm8l上均可使用,将1,2替换成对应单片机的函数即可 int fputc(int ch, FILE *f)//printf {     USART_SendData8(USART1, (uint8_t) ch);//1       while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}//2             return ch; } 2.memset()函数 memset(void *, int, size_t);//IAR环境 *memset  (void *s, char val, int n);//keil环境 这里只讲在单片机中编程中的使用,以上是两种编译环境的memset函数,实现的功能是一样的 第一个参数:指向一个起始地址 第二个参数:任意数值(0~255)value 第三个参数:长度n(从起始地址起连续n个字节) 从起始地址起连续n个字节,全部置为value 我们一般用来进行数组清0,非常方便,比如:  memset(RevBuffer,0,sizeof(RevBuffer));//清0数组 RevBuffer:字符型数组 3.memcpy函数 void *memcpy(void*dest, const void *src, size_t n); 从源src所指的内存地址的起始位置开始,拷贝n个字节的数据到目标dest所指的内存地址的起始位置中。 char buf[]="123456"; char buf2[5]; memcpy(buf2,buf,3); printf("%s\r\n",buf2);   输出:123 4.strcpy函数 strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。 原型声明:char *strcpy(char* dest, const char *src); 头文件:#include <string.h> 和 #include <stdio.h> 功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。 char buf[]="123"; char buf1[5]; strcpy(buf1,buf); printf("%s\r\n",buf1); 5.atoi函数(注意引用#include <stdlib.h>) (表示 ascii to integer)是把字符串转换成整型数的一个函数。 int atoi(const char *nptr); *nptr:把参数 nptr 所指向的字符串转换为一个整数(类型为 int 型)。 #include <stdio.h> #include <stdlib.h>   int main() {     int n;     char *str = "1234567";     n = atoi(str);     printf("n=%d\n",n);     return 0;   }  

  • 发表了主题帖: 玩转 HDMI2.1 源端测试

          在HDMI2.1源端测试中,示波器模拟了sink的行为,提供了端接电阻和端接电压。EDID 仿真器模拟sink的EDID,提供分辨率/速率信息,HDMI2.0 的EDID仿真器也提供SCDC信息, 完成与source的沟通,使source输出需要TMDS信号。测试项目分为单端信号测试和差分信号测试,对应的连接方式分别为单端连接和差分连接,用于采集单端信号和差分信号,以便完成相应的测试项目。   HDMI1.4b/2.0的测试难点:   一些方案端接电压需要外接电源提供,或者端接电压不可调,无法验证极限情况;   单端测试和差分测试信号采集需要更改硬件连接,过程繁琐耗时;   测试信号速率随着分辨率变化,需要手动设置分辨率,测试无法自动化;   这些问题在泰克HDMI2.1 FRL 测试方案中都得到了完美的解决。   为了追求更好的视觉效果和体验,人们不满足于4Kp60Hz显示分辨率,也在追求8Kp60Hz和  4Kp120Hz的体验。但是8Kp60Hz 需要的带宽约64G(RGB/YCbCr 4:4:4格式),远远超过了HDMI2. 0的支持范围。所以HDMI协会增加HDMI2.1 FRL(Fixed Rate Link)模式,实现接口带宽的增加,满足8Kp60Hz需要。同时需要结合相应的YCbCr 4:2: 0编码和视频压缩技术。   FRL模式如何实现带宽的增加   FRL模式增加带宽的常用方法有两种,方法一:提升通道数据速率;方法二:速率不变时,增量通道数量。FRL模式这两种方法都有使用。在保持HDMI物理接口不变的情况,每个通道支持的速率增加到了12Gbps ;另外,原来的TMDS Clock channel重定义为FRL Lane3(时钟嵌入在数据流中); TMDS Data 0/1/2 分别对应FRL lane 0/1/2,如下图所示,共计有4个数据通道。这样就实现了最高48Gbps的带宽。信号的编码方式从TMDS的 8b/10b改变为FRL 16b/18b格式,编码效率更高。     FRL mode 可以分为两种模式:3 lanes 工作模式下, 仅仅支持3 Gbps和6Gbps 两种速率;未使用的Lane3, source 和sink 都需要使用差分50Ω~150Ω端接。4 lanes 工作模式下, 支持6/8/10/12 Gbps 四种速率。   HDMI2.1源端测试   总的测试项目有9个,如下表所示,以测试Lane0 为例。          试信号是固定的码型,测试共定义8种码型Link training pattern 1~8,简写为LTP1~8。不像HDMI1.4b/2.0 ,对码型没有要求。   测试信号速率是固定的,不需要随分辨率变化。   需要考虑其他lane的干扰,例如HFR1-1项目,测试Lane0时,需要Lane0 发出LTP5 码型, Lane1/2/3 分别发出LTP6/7/8的码型, 测试方法更复杂。   源端测试的难点解决   ? 端接电压的实现   泰克示波器和探棒,不需要外接电源,本身不仅可以提供标准的3.3V端接电压,用于协会要求的一致性测试。在用户自定义模式下,还提供可调的端接电压,例如设置3.0V的端接电压,用于验证源端芯片在端接电压变化时的情况。                单端和差分信号的自动采集   对应单端项目和差分项目,测试时需要分别采集单端信号和差分信号;在HDMI1.4b/2.0测试中,都是通过差分探棒采集差分信号;手动更改探棒硬件连接后,采集单端信号。更改连接繁琐,无法自动化,造成了测试效率低。   泰克Tri-mode 探棒(三模探棒), 在测试软件控制下,交替工作在单端模式(A-GND和B-GND),无需硬件连接的改变,可以实现8个单端信号的采集,再自动计算差分信号,从而实现了全部项目的自动化。除了三模探棒方案外, 泰克还提供两台示波器级联自动化方案,通过8个channel 实现对8个单端信号的同时采集,测试效率更高。             决测试复杂化的问题   随着速率的提升,HDMI规范定义新的均衡技术和cable 模型,也造成了测试过程的复杂化。规范定义两种Cable mode: Category 3 Worst Cable Mode(WCM3)和 Category 3 Short Cable Mode (SCM3)。两种均衡: CTLE 1~8 dB和 DFE 1-tap d1 value 25mV。      在TP1采集信号后,应用 cable 模型,得到TP2位置的波形,再应用参考均衡后得到TP2_EQ位置的波形。            图计算方法更为复杂,既要考虑Cable 模型的插入损耗,也要考虑其他数据线引入的串扰。   泰克方案针对以上情况,优化了算法, 测试时间短。    测试速率和码型自动切换   以前测试需要手动更改分辨率,才能实现测试信号速率的变更。现在泰克通过测试软件与EDID/SCDC模拟器的配合,在SCDC(Status and Control Data Channel) offset 0x31中FRL_Rate设置测试信号速率, 在offset 0x41/42中为每个Lane 设置码型。实现了测试需要的速率和码型的自动切换,实现了测试完全自动化,提高了测试效率。   泰克HDMI2.1 FRL自动化方案   配置一:DPO 70000 SX示波器级联方案。两台DPO 70000 SX示波器,使用UltraSync cable同步级联,可以把8个通道的skew调整到1ps内,确保所有单端信号采集的同步性。同时采集8个单端信号后,再自动计算生成4对差分信号。 测试过程不需要更改硬件连接, 信号路径衰减小,测试速度快,效率高。搭配EDID emulator,实现速率和码型的自动切换。     配置二:DPO70000SX示波器搭配Tri-mode探棒。利用Tri-mode探棒的特性,在测试软件控制下,交替工作在单端模式(A-GND和B-GND),分次完成对8个单端信号的采集。 测试过程也不需要更改硬件连接。连接示意图如下,示波器会对探棒进行自动去嵌,消除探棒对信号的影响。兼顾了成本和效率,同样通过EDID emulator实现自动化的测试。    示波器带宽的考量   在HDMI2.1规范中推荐示波器带宽是23GHz或者以上。出于成本考虑,大家也许会问,16GHz 或者20GHz带宽的示波器可以吗?一方面可以从上升时间和带宽的角度来看,HDMI2.1 信号允许的最快上升时间22.5ps(20%-80%)。示波器测量到上升时间可以用如下公式计算:    从上表可以看到带宽越高,上升时间的测量误差就越小。从带宽角度看,示波器的带宽定义是示波器观察到的正弦波幅度衰减-3dB的频率。在实际测试过程中,非正弦波信号需要考虑3次~5次谐波。HDMI2.1 信号速率最高12Gbps,基频是6GHz, 3次谐波频率是18GHz,16GHz带宽的示波器测量到3次谐波成分会被衰减超过-3dB。另一方面被测HDMI2.1 DUT的FRL最高速率没有达到上限12Gbps的话,可以按照上面的计算方法实际评估示波器的带宽需求。   简单来说,为了保证更好的测量精度以及测试的合规性,示波器的带宽越高越好

  • 2019-09-05
  • 发表了主题帖: 如何在信号线中使用共模扼流圈来消除共模噪音

    1.信号线用共模扼流圈的偏移改善功能   在信号线中使用共模扼流圈的目的在于消除共模噪音,由于共模扼流圈是变压器的应用元件,因此可以寄希望于差动传输电路的偏移改善功能。在差动传输电路中,将两条线路设计成平衡状态是最理想的,但是由于制造不均衡而导致的线路不平衡事件也时有发生。在这种情况下,两条线路的信号到达时间会发生差别,这便导致了传输信号发生偏移。   在此处放入共模扼流圈后便可减少偏移。   图2展示了通过共模扼流圈改善偏移的结构   共模扼流圈与变压器结构相同,因此当两条信号线的上升/下降时机不均衡时,共模扼流圈就在相反一侧产生电动势,以确保电流的均衡。这种做法可以使差动信号的时机一致,改善偏移。   这是在故意设定了不同线路长度的差动传输线中检测到的波纹,可以看出,在不放入滤波器(共模扼流圈)的情况下,DOUT+和DOUT-的上升/下降时机有所偏差。   DOUT+与DOUT-的总和在两条线路保持平衡的情况下应该是固定值,此时由于平衡被破坏,偏移在一定程度上存在。   当放入了共模扼流圈时,两条线路的上升/下降时机一致,可以看出DOUT+与DOUT-的总和基本固定,偏移得以改善。   2.共模扼流圈的等价电路图   下面的内容我想内行人应该已经知道了,但是由于我经常被问到这些问题,所以想借此机会介绍一下共模扼流圈的等价电路图中记载的黑点的意思。   共模扼流圈的等价电路图如图4所示。   与变压器形状基本相同。在线圈一侧有两个地方标记了黑点。   经常有人问:"这表示线圈开始绕转吗?"实际上这并不表示在黑点处有什么东西,而是表示两个线圈中磁力结合的方向。在以前的报道中,已经说明了共模扼流圈的结构。共模扼流圈在工作时需要两个线圈中发生的磁通量与共模电流之间互相强化,同时与差动模式电流之间互相抵消。   因此,当2个线圈的绕转方向发生错乱时,往往会产生相反的效果。   如图5的上半部分所示,当等价电路上的黑点与线圈处于同一侧时,磁力结合作为共模扼流圈发挥作用,如下半部分所示,当等价电路上的黑点处于线圈的另一侧时,磁力结合将不再作为共模扼流圈发挥作用。   可见,黑点位置表示每个线圈的磁力结合方向,并不意味着有黑点的一侧有任何东西。   另外,这个黑点原本表示使用变压器时的电压极性。

  • 2019-09-03
  • 发表了主题帖: 简述RFID货车车架管理应用技术

             RFID无线射频识别技术是利用射频方式进行非接触式双向通信交换数据,以达到识别目的。与传统的磁卡,IC卡或者条码识别方式相比,RFID具有远距离和非接触识别的特点,同时对环境适应性强,通过合理的设计,可工作于各种恶劣环境,并具备优秀的识别效果。RFID识别工作时无须人工干预,适合于实现系统的自动化数据采集,同时,可识别高速运动物体并可同时识别多个电子标签,操作快捷方便。RFID货车车架管理应用技术正是利用RFID技术的这些有点进行智能管理。   RFID读写器通过天线向电子标签发出微波查询信号,电子标签被读写器微波能量激活,接受到微波信号后应答并发出带有标签数据信息的回波信号。射频识别技术的基本特点是采用无线电技术实现对静止的或移动的物体进行识别,达到确定待识别物体的身份、提取待识别物体的特征信息的目的。目前,已经广泛应用于汽车生产,交通运输控制管理,工业自动化,仓储物流等诸多领域。   RFID货车车架管理系统是基于RFID技术的中外运货柜车车架管控系统,将在参考RFID在其他领域成功应用经验的基础上,结合中外运货柜车车架管理的自身需求,以自动化、先进性、稳定性、可拓展性为原则,围绕核心的业务需求,实现对货柜车车架的自动识别和跟踪监控。本系统的核心是在货柜车的车头安装RFID读写器及RFID天线,在车架上安装RFID电子标签,通过读写器对电子标签的识别,来达到对车架的监控管理。RFID电子标签安装在车架靠近车头位置,根据不同的车架结构特征,选择合适的安装位置。同时,车架是金属材质,需采用抗金属电子标签。为保证电子标签在车架的使用及储运过程中不被破坏,因充分利用车架自身的结构,来达到对电子标签的保护。对确没有保护位置的车架,在兼顾读取性能的前提下,采用安装金属挡板或者缓冲橡胶的方式形成对标签的保护作用。   电子标签自带3M双面胶,且根据附着面的材质和环境,选择金属粘合度高,耐高温的进口双面胶,可直接粘贴在车架上,使用方便,性能可靠。RFID天线安装在车头靠近车架的位置。因RFID天线本身体积比电子标签大,车头上不易找到合适的具备保护作用的位置安装,而车辆在日常的使用过程中,不可避免会出现磕碰事件,容易造成对安装在车头上的设备的损坏。为尽量避免这种意外损坏,本系统将采用边框背面加厚金属合金构造的RFID天线,耐受能力大幅提升,工业环境适应能力强。UHFRFID读写器是本系统的核心设备,在货柜车上面的应用,应能达到车规级应用规范,包括防尘、防水、防振适应能力,并能适应电压、电流的波动,设备外壳必须坚固耐用,抗腐蚀,适应高低温等户外环境使用要求。   RFID读写器可安装在驾驶室中,通过射频电缆线与RFID天线连接,并实现对RFID标签信息的获取,从而实现对车架的监管。系统使用前,需首先完成电子标签信息的初始化,根据中外运对车架管理的规则或规范,将车架的唯一识别码写入到电子标签中,并将电子标签安装到对应的车架上,完成初始数据信息的建立。本系统中,RFID读写器通过串口与车载终端连接,RFID读取到的数据将实时上传给车载终端。货柜车辆启动后,RFID读写器开始进入工作状态;当安装有RFID电子标签的车架与车头完成连接后,电子标签进入读写器识别范围,读写器即将读取到的数据反馈给车载终端,车载终端经过处理后将数据发送给后台数据库,完成车架的“上车任务”。   车架完成“上车任务”后,RFID读写器可根据系统要求,每间隔一段时间将读取到的标签信息上车给车载终端,实时更新车架的工作状态。车架完成任务后,即被调离,车架上的RFID电子标签将离开RFID读写器的阅读范围,此时,RFID读写器无法检测到电子标签的存在,车载终端接收不到读写器返回的标签信息,即判断车架完成“下车”操作。车架的一个完整工作周期结束,系统实时更新并保存这些信息,达到对车架的实时监管目的。RFID读写器需具有较宽的功率调整范围,以通过对功率的调整,在不影响读取性能的前提下,保障不会误读到别的车架电子标签。

最近访客

< 1/2 >

统计信息

已有11人来访过

  • 芯币:226
  • 好友:--
  • 主题:76
  • 回复:6
  • 课时:--
  • 资源:--

留言

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


现在还没有留言