一、PLC控制-编码器的定位功能

严格来讲,编码器只会告诉你改如何定位,要如何执行,是需要靠数控系统(或者PLC之类控制器)控制伺服或者步进电机来实现定位的,编码器好比人的眼睛,知道电机轴或者负载处于当前某个位置,工业上用的一般是光电类型编码器,下边简单说明一下

嵌入式分享合集140_编码器

01 编码原理和位置测量

光电编码器是在一个很薄很轻的圆盘子上,通过紧密仪器来腐蚀雕刻了很多条细小的缝,相当于把一个360度,细分成很多等分,比如成1024组,这样每组之间的角度差是360/1024度=0.3515625度。

然后有个精密的发光源,安装在码盘的一面,码盘的另外一面,会有个接收器之类的,使用了光敏电阻这些元件加放大和整形电路组成,这样码盘转动时候,有缝隙的地方会透光过去,接收器会瞬间收到光脉冲,经过电路处理后,输出一个电脉冲信号,这样码盘旋转了一周,会对应输出1024个脉冲,第一个脉冲位置如果是0,第二个脉冲位置就是0.3515625°,第三个脉冲位置是0.3515625°*2,以此类推,这样只要有仪器能读到脉冲个数,就可以知道码盘对应在什么位置了,如果把编码器安装到电机的轴上,电机轴和码盘是刚性连接,两者的位置关系会一一对应,通过读编码器脉冲,就可以知道电机的轴位置。

嵌入式分享合集140_差分_02

而电机轴,比如会通过同步带,齿轮,链条等带动一些负载,比如控制丝杆,这样会有个所谓电子齿轮比的关系,电机转一圈,丝杆会前进多少毫米,这样读到了对应编码器上输出多少给脉冲,通过脉冲数就可以反推出当前丝杆的位置。 

嵌入式分享合集140_差分_03

但是编码器是圆的,如果无限制旋转下去,角度会无穷大,所以设计了一种增量型的编码器,转一圈,会输出三组信号ABZ,其中AB是一样的脉冲,比如上边说的一圈有1024个脉冲,AB相脉冲对应一圈内的圆周角度,而且两种脉冲是处于正交状态的,如果是正反转,通过判断AB相脉冲的上升沿和下降沿的先后顺序,就可以知道编码器当前是顺时针还是逆时针方向旋转的, 

嵌入式分享合集140_编码器_04

另外有个Z相脉冲,是因为圆周虽然会不停转下去,角度会无穷无尽,但是都是一周一周的重复而已,零相脉冲固定在圆周某个位置,编码器每转一圈,只输出一个零相脉冲,这样如果以Z相脉冲为基准点,这样每次读到这个脉冲时候,系统就清零一次,就可以让角度最大值控制在360°以内,相当于一个零基准点了。这样即使系统断掉了,重新上电,只要能找到这个基准点,就可以知道丝杆的初始位置在什么地方了。 

嵌入式分享合集140_嵌入式硬件_05

嵌入式分享合集140_编码器_06

以上这种定位叫增量坐标系,所以编码器就是增量型编码器,应用比较广泛,因为灵活而且价格便宜。

嵌入式分享合集140_嵌入式硬件_07

如果只设备只需要转一圈的,也就是角度在360°内的,编码器可以细分精密一点,比如有13位,相当于2^13次方个脉冲一圈,对应着360°,这种脉冲数和角度一一对应,不怕系统断电需要重新调整零位,这种编码器叫单圈绝对值编码器。如果负载需要转多圈的,但是这个圈数也不能非常多,比如5圈,相当于5*360°=1800°,这样脉冲和1800°一一对应,这些在一些高档的数控机床上应用比较多,可以知道丝杆或者一些旋转工作的当前精密位置,而且不用担心系统断电归零问题。

此外,编码器还有磁电方式的,比如在码盘上加工了很多个南北间隔的小磁铁,通过霍尔去读小磁铁信号,输出信号,同样经过放大和整形变成了电脉冲,这点和光电编码器是类似的,而且价格会便宜点,可靠性会高,但是精度就比光电要差点。

02 PLC如何通过编码器判断位置

PLC能输入开关量,也就是一高一低的电平电压,而编码器脉冲信号,可以理解一定时间内,用极快的速度完成的一组开关量。但是因为这种开关量的频率太高了,所以PLC的普通I/O口是无法准确读到这些脉冲的个数的,因为PLC工作过程中存在扫描周期,需要每个一段时间才去刷新一下普通I/O口的数据,而编码器的精度太高了,单位时间内输出的脉冲个数太多,普通I/O是无法胜任的。

嵌入式分享合集140_差分_08

 一般PLC会设计有高速计数端口,本质是利用了底层单片机的硬件逻辑来完成这些编码器计数的,避开了扫描周期问题,PLC都设计有专门的高速计数指令,使用的时候,直接调用这些指令就可以读到当前的脉冲值了。

嵌入式分享合集140_数据_09

但是脉冲的计算和输出上,由于扫描周期存在,往往也会存在着滞后影响,如果用来控制一些执行机构,比如气缸来动作裁切动作,这样要考虑提前量的补偿问题。

嵌入式分享合集140_嵌入式硬件_10

提醒一下,如果想用PLC来控制伺服或者步进系统,往往并不需要通过编码器反馈来判断位置,通过一些PLS指令之类的来发出位置脉冲给伺服驱动器,位置环在伺服驱动器内部构成就好,而PLC这边只是一个指令机构,并没有构成位置闭环,当然如果是专门定位模块控制,使用了NC之类的控制方式,是可以在里边构建位置闭环的。 

二、电工胶带(绝缘胶带)使用方法

电工胶带全名为聚氯乙烯电气绝缘胶粘带,又有人称之为电工绝缘胶带或绝缘胶带。是一种性能优良、经济实用的聚氯乙烯绝缘胶带。它具有良好的耐磨性、防潮性、耐酸碱性及抗环境变化能力(包括紫外线)。适用于电线缠绕,变压器、马达、电容器、稳压器等各类电机、电子零件的绝缘固定用。有红、黄、蓝、白、绿、黑、透明等颜色。聚氯乙烯带具有很高的介电强度,从形性好,较少用量即可获得较好的机械保护。

主要用途

适用于各种电阻零件的绝缘。如电线接头缠绕,绝缘破损修复,变压器、马达、电容器、稳压器等各类电机、电子零件的绝缘防护。也可用于工业过程中捆绑、固定、搭接、修补、密封、保护。

用于绑扎电线和电缆适用于室内或室外用于电压等级600V以下的所有电线和电缆接头的主绝缘用于修补高压电缆接头的护套用于600V及以下电气绝缘电线电缆相识标色。

使用方法

首先电线接头在用胶布缠之前一定要按照接线标准要求把两根电线完美的扭在一起,不同材料、不同横截面、不同应用场景下都有不同的接线标准,这个一定要按照规范要求去做。

导线连接处的绝缘处理通常采用绝缘胶带进行缠裹包扎。一般电工常用的绝缘带有黄蜡带、涤纶薄膜带、黑胶布带、塑料胶带、橡胶胶带等。绝缘胶带的宽度常用20mm的,使用较为方便。

电线接头用胶布缠的最简单方法是,二分之一压缠,也就是简单的把电工胶布从交叉的一端向另一端缠过去,记住在缠的过程当中,一定要用一点力气,不要随手一缠,用点力气将电工胶布缠得死死的,牢牢的。如果随便一缠一绑的话,随时间的加长,很有可能胶布自己会慢慢松动,松开散掉,这是很危险的,一定要绑死缠紧。

但是这个简单的方法只适合在普通暂时绝缘的场景下,要知道在不同应用场景下,胶布缠法也是有区别的。

1、一般导线接头的电线接头用胶布的缠法 一字形连接的导线接头先进行绝缘处理,先包缠一层黄蜡带,再包缠一层黑胶布带。将黄蜡带从接头左边绝缘完好的绝缘层上开始包缠,包缠两圈后进入剥除了绝缘层的芯线部分。包缠时黄蜡带应与导线成55°左右倾斜角,每圈压叠带宽的1/2,直至包缠到接头右边两圈距离的完好绝缘层处。然后将黑胶布带接在黄蜡带的尾端,按另一斜叠方向从右向左包缠,仍每圈压叠 带宽的1/2,直至将黄蜡带完全包缠住。包缠处理中应用力拉紧胶带,注意不可稀疏,更不能露出芯线,以确保绝缘质量和用电安全。对于220V线路,也可不用黄蜡带,只用黑胶布带或塑料胶带包缠两层。在潮湿场所应使用聚氯乙烯绝缘胶带或涤纶绝缘胶带。

2、T字分支接头的电线接头用胶布的缠法 导线分支接头的绝缘处理基本方法同上,T字分支接头的包缠方向走一个T字形的来回,使每根导线上都包缠两层绝缘胶带,每根导线都应包缠到完好绝缘层的两倍胶带宽度处。

3、十字分支接头的电线接头用胶布的缠法 对导线的十字分支接头进行绝缘处理时,包缠方向走一个十字形的来回,使每根导线上都包缠两层绝缘胶带,每根导线也都应包缠到完好绝缘层的两倍胶带宽度处。

绝缘胶带耐多少度高温

1、普通电工使用的绝缘胶带,耐高温能够达到80度。从这个温度上来说,是不怎么耐高温的绝缘胶带,又称之为电工绝缘胶带,它主要材质就是聚氯乙烯薄膜,后期通过涂了橡胶型的样品胶制作而成,起到了一定的防止漏电绝缘的作用。主要的性能就是耐压,而且具有阻燃的特点,适合运用在电气绝缘防护等方面。

2、还有一种是高温的胶带,代表它能够在高温作用环境下使用,耐温性能能够达到120度,甚至能够达到260度之间,这 种高温的胶带就比较耐高温。

贮存

在常温、通风条件下,电工胶布性能保持稳定。

三、 USB 接口电路设计常见问题

    USB是一种快速、双向、同步传输、廉价、方便使用的可热拔插的串行接口。由于数据传输快,接口方便,支持热插拔等优点使USB设备得到广泛应用。目前,市场上以USB2.0为接口的产品居多,但很多硬件新手在USB应用中遇到很多困扰,往往PCB装配完之后USB接口出现各种问题。

    比如通讯不稳定或是无法通讯,检查原理图和焊接都无问题,或许这个时候就该怀疑PCB设计不合理。绘制满足USB2.0数据传输要求的PCB对产品的性能及可靠性有着极为重要的作用。

    USB协议定义由两根差分信号线(D+、D-)传输数字信号,若要USB设备工作稳定差分信号线就必须严格按照差分信号的规则来布局布线。根据笔者多年USB相关产品设计与调试经验,总结以下注意要点:

    1.在元件布局时,尽量使差分线路最短,以缩短差分线走线距离(√为合理的方式,×为不合理方式);

嵌入式分享合集140_差分_11

   2.优先绘制差分线,一对差分线上尽量不要超过两对过孔(过孔会增加线路的寄生电感,从而影响线路的信号完整性),且需对称放置(√为合理的方式,×为不合理方式); 

嵌入式分享合集140_差分_12

 3.对称平行走线,这样能保证两根线紧耦合,避免90°走线,弧形或45°均是较好的走线方式(√为合理的方式,×为不合理方式); 

嵌入式分享合集140_编码器_13

  4.差分串接阻容,测试点,上下拉电阻的摆放(√为合理的方式,×为不合理方式); 

嵌入式分享合集140_嵌入式硬件_14

 5.由于管脚分布、过孔、以及走线空间等因素存在使得差分线长易不匹配,而线长一旦不匹配,时序会发生偏移,还会引入共模干扰,降低信号质量。所以,相应的要对差分对不匹配的情况作出补偿,使其线长匹配,长度差通常控制在5mil以内,补偿原则是哪里出现长度差补偿哪里; 

嵌入式分享合集140_差分_15

  6.为了减少串扰,在空间允许的情况下,其他信号网络及地离差分线的间距至少20mil(20mil是经验值),覆地与差分线的距离过近将对差分线的阻抗产生影响;

嵌入式分享合集140_编码器_16

    7.USB的输出电流是500mA,需注意VBUS及GND的线宽,若采用的1Oz的铜箔,线宽大于20mil即可满足载流要求,当然线宽越宽电源的完整性越好。

嵌入式分享合集140_差分_17

  普通USB设备差分线信号线宽及线间距与整板信号线宽及线间距一致即可。然而当USB设备工作速度是480 Mbits/s,只做到以上几点是不够的,我们还需对差分信号进行阻抗控制,控制差分信号线的阻抗对高速数字信号的完整性是非常重要的。

    因为差分阻抗影响差分信号的眼图、信号带宽、信号抖动和信号线上的干扰电压。差分线阻抗一般控制在90(±10%)欧姆(具体值参照芯片手册指导),差分线阻抗与线宽W1、W2、T1成反比,与介电常数Er1成反比,与线间距S1成正比,与参考层的距离H1正比,如下图是差分线的截面图。

    下图为四层板的参考叠层,其中中间两层为参考层,参考层通常为GND或Power,并且差分线所对应的参考层必须完整,不能被分割,否则会导致差分线阻抗不连续。若是以图 2叠层设计四层板,通常设计时差分线采用4.5mil的线宽及5.5mil的线间距既可以满足差分阻抗90Ω。

    然而4.5mil线宽及5.5mil线间距只是我们理论设计值,最终电路板厂依据要求的阻抗值并结合生产的实际情况和板材会对线宽线间距及到参考层的距离做适当的调整。

嵌入式分享合集140_编码器_18

    以上所描述的布线规则是基于USB2.0设备,在USB布线过程中把握差分线路最短、紧耦合、等长、阻抗一致且注意好USB电源线的载流能力,掌握好以上原则USB设备运行基本没问题。 

四、ARM Cortex-M内核复位启动过程

 ARM Cortex-M内核的复位启动过程也被称为复位序列(Reset sequence),下面就来简要总结分析下这一过程。

    ARM Cortex-M内核的复位启动过程与其他大部分CPU不同,也与之前的ARM架构(ARM920T、ARM7TDMI等)不相同。大部分CPU复位后都是从0x0000_0000处取得第一条指令开始运行的,然而在ARM Cortex-M内核中并不是这样的。其复位序列为:

1. 从地址0x0000_0000处取出MSP的初始值;

2. 从地址0x0000_0004处取出PC的初始值,然后从这个值对应的地址处取指。

    即下图所示过程:

嵌入式分享合集140_数据_19

事实上,地址0x0000_0004开始存放的就是默认中断向量表(有些资料中将地址0x0000_0000处的MSP指针初始值也算作中断向量表的一部分,这个说法似乎不太妥当),ARM Cortex-M内核的中断向量表布局情况如下图所示: 

嵌入式分享合集140_差分_20

注意:中断向量表的位置可以改变,此处是默认情况下的设置。

    值得注意的是,在ARM Cortex-M内核中,发生异常后,并不是去执行中断向量表中对应位置处的代码,而是将对应位置处的数据存入PC中,然后去此地址处进行取指。简而言之,在ARM Cortex-M的中断向量表中不应该放置跳转指令,而是该放置ISR程序的入口地址。

    有了上面的分析就很好理解复位序列了,复位其实就相当于发生了一次Reset异常,而从图中可以看到,地址0x0000_0004处存放的正是Reset异常对应的中断处理函数入口地址。

    另外还有两个细节问题需要注意:

1. 0x0000_0000处存放的MSP初始值最低三位需要是0;

2. 0x0000_0004处存放的地址最低位必须是1。

    第一个问题是因为ARM AAPCS中对栈使用的约定是这样的:

5.2.1.1
Universal stack constraints
At all times the following basic constraints must hold:
Stack-limit < SP <= stack-base. The stack pointer must lie within the extent of the stack.
SP mod 4 = 0. The stack must at all times be aligned to a word boundary.
5.2.1.2
Stack constraints at a public interface
The stack must also conform to the following constraint at a public interface:
SP mod 8 = 0. The stack must be double-word aligned.

    简而言之,规约规定,栈任何时候都必须4字节对齐,在调用入口需8字节对齐,而且SP的最低两位在硬件上就被置为0了。

    第二个问题与ARM模式与Thumb模式有关。ARM中PC中的地址必须是32位对齐的,其最低两位也被硬件上置0了,故写入PC中的数据最低两位并不代表真实的取址地址。ARM中使用最低一位来判断这条指令是ARM指令还是Thumb指令,若最低位为0,代表ARM指令;若最低位为1,代表Thumb指令。在Cortex-M内核中,并不支持ARM模式,若强行切换到ARM模式会引发一个Hard Fault。

    最后写一段小程序来验证下以上分析。这段程序基于STM32F4系列单片机,作用是让PA0管脚输出高电平。这应该也是实现这一目的最精简的写法了。

rAHB1ENR        EQU     0x40023830
AHB1ENRValue    EQU     0x00000001
    
rMODER          EQU     0x40020000
MODERValue      EQU     0xA8000001
    
rODR            EQU     0x40020014
ODRVaule        EQU     0x00000001
    AREA RESET, DATA, READONLY
    DCD 0x00000400
    DCD Start
    AREA |.text|, CODE, READONLY
    ENTRY
Start
    LDR R0, =rAHB1ENR
    LDR R1, =AHB1ENRValue
    STR R1, [R0]
    
    LDR R0, =rMODER
    LDR R1, =MODERValue
    STR R1, [R0]
    
    LDR R0, =rODR
    LDR R1, =ODRVaule
    STR R1, [R0]
    B .  
    END

    第11行使用DCD伪指令分配了4个字节的存储空间,并将其值设置为0x0000_0400;第12行同理,将Start标号处的地址放置在偏移量为4字节的位置处;第17行Start标号之后的部分就是程序主体,依次完成了GPIOA端口RCC时钟使能、PA0设置为输出模式、PA0置高这三个步骤。

    程序在链接时会将RESET段放置在目标文件开头,故相当于在地址0x0000_0000处的数据为0x0000_0400,在地址0x0000_0004处的数据为Start部分的入口地址。

    不过需要指出的是,实际上在STM32F4芯片中,内部Flash的地址是从0x0800_0000处开始的,在BOOT管脚设置为Flash启动的时候,芯片内部会自动将0x0000_00000 0x000F_FFFF区域映射至0x0800_0000 0x080F_FFFF处,此时可以视为二者是等价的。

    使用Debug模式进行调试,复位后CPU寄存器的值如下所示:

嵌入式分享合集140_编码器_21

   Flash中的数据如图:

嵌入式分享合集140_嵌入式硬件_22

 可以看到,编译器很智能的将0x0800_0004处的数据设置为了0x0800_0009,而不是Start标号真实的地址值,这说明了这是一条Thumb-2指令。复位后PC中的值是0x0800_0008,SP中的值是0x0000_0400,与预期结果完全相同。

    最后顺便提一下,上面那段简单的程序有个问题,实际上Start部分的程序是占用了中断向量表的空间,这在没有异常发生的时候是没有问题的,不过一旦有异常发生,显然程序执行是会出错的。