精华内容
下载资源
问答
  • 220V电容启动交流电机

    千次阅读 2016-04-06 21:28:26
    这种电机一般用在对转速稳定性要求不大,扭矩较大的场合。...61表示型号,容量20UF,容量误差-+ 5%。交流耐压450V 电源适用频率50/60HZ。40/70/21是温度,最高70度,最低40度,21为湿度 最后说明

    这种电机一般用在对转速稳定性要求不大,扭矩较大的场合。如:点钞机、洗衣机里的电机。

    一般长这样:


    然后它的旁边一般还能找到一个长这样的黑色大电容:

      

    CBB61电容上面的数字含义为:CBB代表聚苯乙烯电容器。61表示型号,容量20UF,容量误差-+ 5%。交流耐压450V 电源适用频率50/60HZ。40/70/21是温度,最高70度,最低40度,21为湿度

    最后说明一下使用方法:


    一般具体的接线方法电机的铭牌上会有,按照说明接就可以了。


    展开全文
  • 电容

    千次阅读 2013-02-13 20:09:51
    电容(Capacitance)亦称作“电容量”,是指在给定电位差下的电荷储藏量,记为C,国际单位是法拉(F)。一般来说,电荷在电场中会受力而移动,当导体之间有了介质,则阻碍了电荷移动而使得电荷累积在导体上,造成...

    百科名片

    电容   
    电容

    电容(Capacitance)亦称作“电容量”,是指在给定电位差下的电荷储藏量,记为C,国际单位是法拉(F)。一般来说,电荷在电场中会受力而移动,当导体之间有了介质,则阻碍了电荷移动而使得电荷累积在导体上,造成电荷的累积储存,储存的电荷量则称为电容。因电容是电子设备中大量使用的电子元件之一,所以广泛应用于隔直、耦合、旁路、滤波、调谐回路、能量转换、控制电路等方面。

    编辑本段简介

    电容(或称电容量)是表现 电容器容纳 电荷本领的 物理量。
    电容(图1)

      电容(图1)

    电容 从物理学上讲,它是一种静态电荷存储介质,可能电荷会永久存在,这是它的特征,它的用途较广,它是电子、电力领域中不可缺少的 电子元件主要用于电源滤波、信号滤波、信号耦合谐振、滤波、补偿、充放电、储能、隔直流等电路中。
    在电路学里,给定 电势差电容器储存 电荷的能力,称为电容(capacitance),标记为C。采用 国际单位制,电容的单位是 法拉(farad),标记为F。
    电容的符号是C。
    C=εS/d=εS/4πkd(真空)=Q/U
    国际单位制里,电容的单位是 法拉,简称法,
    电容(图2)

      电容(图2)

    符号是F,由于法拉这个单位太大,所以常用的电容单位有毫法(mF)、 微法(μF)、纳法(nF)和皮法(pF)等,换算关系是:
    1法拉(F)= 1000毫法(mF)=1000000微法(μF)
    1微法(μF)= 1000纳法(nF)= 1000000皮法(pF)。
    电容与电池容量的关系:
    1伏安时=1瓦时=3600 焦耳
    w=0.5cuu 

    相关公式

    一个电容器,如果带1库的电量时两级间的电势差是1伏,
    电容(图3)

      电容(图3)[1]

    这个电容器的电容就是1法,即:C=Q/U 但电容的大小不是由Q(带电量)或U(电压)决定的,即:C=εS/4πkd 。其中,ε是一个常数,S为电容极板的正对面积,d为电容极板的距离,k则是 静电力常量。常见的平行板电容器,电容为C=εS/d(ε为极板间介质的介电常数,S为极板面积,d为极板间的距离)。
    定义式:C=Q/U
    电容器的电势能计算公式:E=CU^2/2=QU/2=Q^2/2C
    多电容器并联计算公式:C=C1+C2+C3+…+Cn
    多电容器串联计算公式:1/C=1/C1+1/C2+…+1/Cn
    三电容器串联:C=(C1*C2*C3)/(C1*C2+C2*C3+C1*C3)

    理论简介

    电容是指容纳电场的能力。 任何静电场都是由许多个电容组成,有静电场就有电容,电容是用静电场描述的一般认为:孤立导体与无穷远处构成电容,导体接地等效于接到无穷远处,并与大地连接成整体

    实际应用

    电子制作中需要用到各种各样的电容器,
    电容(图4)

      电容(图4)

    它们在电路中分别起着不同的作用。与电阻器相似,通常简称其为电容,用字母C表示。顾名思义,电容器就是“储存电荷的容器”。尽管电容器品种繁多,但它们的基本结构和原理是相同的。两片相距很近的金属中间被某物质(固体、气体或液体)所隔开,就构成了电容器。两片金属称为极板,中间的物质叫做介质。 电容器也分为容量固定的与容量可变。但常见的是固定容量的电容,最多见的是 电解电容瓷片电容
    不同的电容器储存电荷的能力也不相同。规定把电容器外加1伏特直流电压时所储存的电荷量称为该电容器的电容量。
    在电子线路中,电容用来通过交流而阻隔直流,也用来存储和释放电荷以充当滤波器,平滑输出脉动信号小容量的电容,通常在高频电路中使用,如: 收音机发射机振荡器中。 大容量的电容往往是作滤波存储电荷。而且还有一个特点, 一般1μF以上的电容均为电解电容而1μF以下的电容多为瓷片电容,当然也有其他的,如:独石电容、 涤纶电容、小容量的 云母电容等。 电解电容有个铝壳,里面充满了 电解质,并引出两个电极,作为正(+)、负(-)极, 与其它电容器不同,它们在电路中的极性不能接错,而其他电容则没有极性
    把电容器的两个电极分别接在电源的正、负极上,过一会儿即使把电源断开,
    电容(图5)

      电容(图5)

    两个引脚间仍然会有残留电压,电容器储存了电荷。电容器极板间建立起电压,积蓄起电能,这个过程称为 电容器的充电。充好电的电容器两端有一定的电压。电容器储存的电荷向电路释放的过程,称为 电容器的放电
    电子电路中,只有在电容器充电过程中,才有电流流过,充电过程结束后(电容两侧电荷电压与提供充电的电压相同了),电容器是不能通过直流电在电路中起着“隔直流”的作用电路中,电容器常被用作耦合旁路滤波等,都是利用它“通交流,隔直流”的特性。交流电不仅方向往复交变,它的大小也在按规律变化。 电容器接在交流电源上,电容器连续地充电放电,电路中就会流过与交流电变化规律一致(相位不同)充电电流放电电流
    电容器的选用涉及到很多问题。首先是耐压的问题。 加在一个电容器的两端的电压超过了它的额定电压,电容器就会被击穿损坏。一般电解电容的耐压分档为6.3V、10V、16V、25V、50V等。

    编辑本段命名方法

    国产电容器的型号一般由四部分组成
    电容(图6)

      电容(图6)

    (不适用于压敏、可变、真空电容器)。依次分别代表名称、材料、分类和序号。 
    第一部分:名称,用字母表示,电容器用C;
    第二部分:材料,用字母表示;
    第三部分:分类,一般用 数字表示,个别用 字母表示;
    第四部分:序号,用数字表示。

    编辑本段主要分类

    1、按照结构分三大类:固定电容器、
    电容(图7)

      电容(图7)

    可变电容器和微调电容器;
    2、按电解质分类有:有机介质电容器、无机介质电容器、电解电容器和空气介质电容器等;
    3、按用途分有:高频旁路、低频旁路、滤波、调谐、高频耦合、低频耦合、小型电容器;
    4、频旁路:陶瓷电容器、云母电容器、玻璃膜电容器、涤纶电容器、玻璃釉电容器;
    5、低频旁路:纸介电容器、陶瓷电容器、铝电解电容器、
    电容(图8)

      电容(图8)

    涤纶电容器;
    6、滤波:铝电解电容器、纸介电容器、复合纸介电容器、液体钽电容器;
    7、调谐:陶瓷电容器、云母电容器、玻璃膜电容器、聚苯乙烯电容器;
    8、高频耦合:陶瓷电容器、云母电容器、聚苯乙烯电容器;
    9、低耦合:纸介电容器、陶瓷电容器、铝电解电容器、涤纶电容器、固体钽电容器;
    10、小型电容:金属化纸介电容器、陶瓷电容器、铝电解电容器、聚苯乙烯电 容器、固体钽电容器、玻璃釉电容器、金属化涤纶电容器、聚丙烯电容器、云母电容器。
    11、按照功能分:
    1)聚酯(涤纶)电容
    符号:(CL)
    电容量:40p--4μ
    额定电压:63--630V
    主要特点:小体积,大容量,耐热耐湿,稳定性差
    应用:对稳定性和损耗要求不高的低频电路。
    2)聚苯乙烯电容
    符号:(CB)
    电容量:10p--1μ
    额定电压:100V--30KV
    主要特点:稳定,低损耗,体积较大
    应用:对稳定性和损耗要求较高的电路。
    3)聚丙烯电容 
    符号:(CBB)
    电容量:1000p--10μ
    额定电压:63--2000V
    主要特点:性能与聚苯相似但体积小,稳定性略差
    应用:代替大部分聚苯或云母电容,用于要求较高的电路。
    4)云母电容 
    符号:(CY)
    电容量:10p--0.1μ
    额定电压:100V--7kV
    主要特点:价格较高,但精度、温度特性、耐热性、寿命等均较好
    应用:高频振荡,脉冲等对可靠性和稳定性较高的电子装置。
    5)高频瓷介电容 
    符号:(CC)
    电容量:1--6800p
    额定电压:63--500V
    主要特点:高频损耗小,稳定性好
    应用:高频电路
    6)低频瓷介电容 
    符号:(CT)
    电容量:10p--4.7μ
    额定电压:50V--100V
    主要特点:体积小,价廉,损耗大,稳定性差
    应用:要求不高的低频电路。
    7)玻璃釉电容
    符号:(CI)
    电容量:10p--0.1μ
    额定电压:63--400V
    主要特点:稳定性较好,损耗小,耐高温(200度)
    应用:脉冲、耦合、旁路等电路
    8)铝电解电容 
    符号:(CD)
    电容量:0.47--10000μ
    额定电压:6.3--450V
    主要特点:体积小,容量大,损耗大,漏电大,有极性,安装时要注意
    应用:电源滤波,低频耦合,去耦,旁路等
    9)钽电解电容
    符号:(CA)
    电容量:0.1--1000μ
    额定电压:6.3--125V
    主要特点:损耗、漏电小于铝电解电容
    应用:在要求高的电路中代替铝电解电容
    10)空气介质可变电容器
    可变电容量:100--1500p
    主要特点:损耗小,效率高;可根据要求制成直线式、直线波长式、直线频率式及对数式等。
    应用:电子仪器,广播电视设备等
    11)薄膜介质可变电容器
    可变电容量:15--550p
    主要特点:体积小,重量轻;损耗比空气介质的大。
    应用:通讯,广播接收机等
    12)薄膜介质微调电容器
    可变电容量:1--29p
    主要特点:损耗较大,体积小
    应用:收录机,电子仪器等电路作电路补偿。
    13)陶瓷介质微调电容器
    可变电容量:0.3--22p
    主要特点:损耗较小,体积较小
    应用:精密调谐的高频振荡回路
    14)独石电容
    容量范围:0.5PF--10μF
    耐压:二倍额定电压。
    应用范围:广泛应用于电子精密仪器。各种小型电子设备作谐振、耦合、滤波、旁路。
    独石电容的特点:电容量大、体积小、可靠性高、电容量稳定,耐高温耐湿性好等。 [2]

    编辑本段电容作用

    电容器的基本作用就是充电与放电,
    电容(图9)

      电容(图9)

    但由这种基本充放电作用所延伸出来的许多电路现象,使得电容器有着种种不同的用途,例如:在电动马达中,用它来产生相移;在照相闪光灯中,用它来产生高能量的瞬间放电等等。而在电子电路中,电容器不同性质的用途尤多,这许多不同的用途,虽然也有截然不同之处,但因其作用均来自充电与放电。下面是一些电容的作用列表: [3]
    耦合电容:用在 耦合电路中的电容称为耦合电容,在阻容耦合放大器和其他电容耦合电路中大量使用这种电容电路,起隔直流通交流作用。
    滤波电容:用在 滤波电路中的电容器称为滤波电容,在电源滤波和各种滤波器电路中使用这种电容电路,滤波电容将一定频段内的信号从总信号中去除。
    退耦电容,用在退耦电路中的电容器称为退耦电容,在多级放大器的直流电压供给电路中使用这种电容电路,退耦电容消除每级放大器之间的有害低频交连。
    高频消振电容:

    各种插件电容器

    各种插件电容器 (4张)
    用在高频消振电路中的电容称为高频消振电容,在音频负反馈放大器中,为了消振可能出现的高频自激,采用这种电容电路,以消除放大器可能出现的高频啸叫。
    谐振电容:用在LC谐振电路中的电容器称为谐振电容,LC并联和串联谐振电路中都需这种电容电路。
    旁路电容:用在旁路电路中的电容器称为旁路电容,电路中如果需要从信号中去掉某一频段的信号,可以使用旁路电容电路,根据所去掉信号频率不同,有全频域(所有交流信号)旁路电容电路和高频旁路电容电路。
    中和电容:用在中和电路中的电容器称为中和电容。在收音机高频和中频放大器,电视机高频放大器中,采用这种中和电容电路,以消除自激。
    定时电容:用在定时电路中的电容器称为定时电容。
    电容(图10)

      电容(图10)

    在需要通过电容充电、放电进行时间控制的电路中使用定时电容电路,电容起控制时间常数大小的作用。
    积分电容:用在积分电路中的电容器称为积分电容。在电势场扫描的同步分离电路中,采用这种积分电容电路,可以从场复合同步信号中取出场同步信号。
    微分电容:用在微分电路中的电容器称为微分电容。在触发器电路中为了得到尖顶触发信号,采用这种微分电容电路,以从各类(主要是矩形脉冲)信号中得到尖顶脉冲触发信号。
    补偿电容:用在补偿电路中的电容器称为补偿电容,在卡座的低音补偿电路中,使用这种低频补偿电容电路,以提升放音信号中的低频信号,此外,还有高频补偿电容电路。
    自举电容:用在自举电路中的电容器称为自举电容,
    玻璃釉电容

      玻璃釉电容

    常用的OTL功率放大器输出级电路采用这种自举电容电路,以通过正反馈的方式少量提升信号的正半周幅度。
    分频电容:在分频电路中的电容器称为分频电容,在音箱的扬声器分频电路中,使用分频电容电路,以使高频扬声器工作在高频段,中频扬声器工作在中频段,低频扬声器工作在低频段。
    负载电容:是指与石英晶体谐振器一起决定负载谐振频率的有效外界电容。负载电容常用的标准值有16pF、20pF、30pF、50pF和100pF。负载电容可以根据具体情况作适当的调整,通过调整一般可以将谐振器的工作频率调到标称值。
    调谐电容:连接在谐振电路的振荡线圈两端,起到选择振荡频率的作用。
    衬垫电容:与谐振电路主电容串联的辅助性电容,调整它可使振荡信号频率范围变小,并能显著地提高低频端的振荡频率。
    中和电容:并接在三极管放大器的基极与发射极之间,构成负反馈网络,以抑制三极管极间电容造成的自激振荡。
    稳频电容:在振荡电路中,起稳定振荡频率的作用。
    定时电容:在RC时间常数电路中与电阻R串联,共同决定充放电时间长短的电容。
    加速电容:接在振荡器反馈电路中,使正反馈过程加速,提高振荡信号的幅度。
    缩短电容:在UHF高频头电路中,为了缩短振荡电感器长度而串联的电容。
    克拉波电容:在电容三点式振荡电路中,与电感振荡线圈串联的电容,起到消除晶体管结电容对频率稳定性影响的作用。
    锡拉电容:在电容三点式振荡电路中,与电感振荡线圈两端并联的电容,起到消除晶体管结电容的影响,使振荡器在高频端容易起振。
    稳幅电容:在鉴频器中,用于稳定输出信号的幅度。
    预加重电容:为了避免音频调制信号在处理过程中造成对分频量衰减和丢失,而设置的RC高频分量提升网络电容。
    去加重电容:为了恢复原伴音信号,要求对音频信号中经预加重所提升的高频分量和噪声一起衰减掉,设置RC在网络中的电容。
    移相电容:用于改变交流信号相位的电容。
    反馈电容:跨接于放大器的输入与输出端之间,使输出信号回输到输入端的电容。
    降压限流电容:串联在交流回路中,利用电容对交流电的容抗特性,对交流电进行限流,从而构成分压电路。
    逆程电容:用于行扫描输出电路,并接在行输出管的集电极与发射极之间,以产生高压行扫描锯齿波逆程脉冲,其耐压一般在1500伏以上。
    S校正电容:串接在偏转线圈回路中,用于校正显像管边缘的延伸线性失真。
    自举升压电容:利用电容器的充、放电储能特性提升电路某点的电位,使该点电位达到供电端电压值的2倍。
    消亮点电容:设置在视放电路中,用于关机时消除显像管上残余亮点的电容。
    软启动电容:一般接在开关电源的开关管基极上,防止在开启电源时,过大的浪涌电流或过高的峰值电压加到开关管基极上,导致开关管损坏。
    启动电容:串接在单相电动机的副绕组上,为电动机提供启动移相交流电压,在电动机正常运转后与副绕组断开。
    运转电容:与单相电动机的副绕组串联,为电动机副绕组提供移相交流电流。在电动机正常运行时,与副绕组保持串接。

    编辑本段选用方法

    低频中使用的范围较宽,可以使用高频特性比较差的;但是在 高频电路中就有很大的限制,一旦选择不当会影响电路的整体工作状态;
    一般的电源里用的有电解电容、和瓷片电容、但是在高频中就要使用云母等价格较贵的电容,就不可以使用绦纶的电容,和电解的电容,因为它们在高频情况下会形成 电感,以致影响电路的工作精度。

    编辑本段特性参数

    允许偏差

    标称电容量是标志在电容器上的电容量。
    电容器实际电容量与标称电容量的偏差称误差,在允许的偏差范围称精度。
    精度等级与允许误差对应关系:00(01)-±1%、0(02)-±2%、Ⅰ-±5%、Ⅱ-±10%、Ⅲ-±20%、 Ⅳ-(+20%-10%)、Ⅴ-(+50%-20%)、Ⅵ-(+50%-30%)
    一般电容器常用Ⅰ、Ⅱ、Ⅲ级,电解电容器用Ⅳ、Ⅴ、Ⅵ级,根据用途选取。

    绝缘电阻

    直流电压加在电容上,并产生漏电电流,两者之比称为绝缘电阻。
    当电容较小时,主要取决于电容的表面状态,容量>0.1uf时,主要取决于介质的性能,绝缘电阻越大越好。
    电容的 时间常数:为恰当的评价大容量电容的绝缘情况而引入了时间常数,他等于电容的绝缘电阻与容量的乘积。 

    损耗

    电容在电场作用下,在单位时间内因发热所消耗的能量叫做损耗。各类电容都规定了其在某频率范围内的损耗允许值,电容的损耗主要由 介质损耗,电导损耗和电容所有金属部分的电阻所引起的。 
    在直流电场的作用下,电容器的损耗以漏导损耗的形式存在,一般较小,在交变电场的作用下,电容的损耗不仅与漏导有关,而且与周期性的极化建立过程有关。

    频率特性

    随着频率的上升,一般电容器的电容量呈现下降的规律。
    大电容工作在低频电路中的阻抗较小,小电容而比较适合工作在高频环境下。

    编辑本段安全防护

    在电容充电后关闭电源,电容内的电荷仍可能储存很长的一段时间。此电荷足以产生电击,或是破坏相连结的仪器。一个抛弃式相机闪光模组由1.5V AA 干电池充电,看似安全,但其中的电容可能会充电到300V,300V 的电压产生的电击会使人非常疼痛,甚至可能致命。
    许多电容的等效串联电阻(ESR)低,因此在短路时会产生大电流。在维修具有大电容的设备之前,需确认电容已经放电完毕。为了安全上的考量,所有大电容在组装前需要放电。若是放在基板上的电容器,可以在电容器旁并联一 泄放电阻(bleeder resistor)。在正常使用的,泄放电阻的 漏电流小,不会影响其他电路。而在断电时,泄放电阻可提供电容放电的路径。高压的大电容在储存时需将其端子短路,以确保其储存电荷均已放电,因为若在安装电容时,若电容突然放电,产生的电压可能会造成危险。
    大型老式的油浸电容器中含有多氯联苯(poly-chlorinated biphenyl),因此丢弃时需妥善处理,若未妥善处理,多氯联苯会进入地下水中,进而污染饮用水。多氯联苯是致癌物质,微量就会对人体造成影响。若电容器的体积大,其危险性更大,需要格外小心。新的电子零件中已不含多氯联苯。
    在高电压和强电流下工作的电容有着超出一般的危险。
    高电压电容在超出其标称电压下工作时有可能发生灾难性的损坏。绝缘材料的故障可能会导致在充满油(通常这些油起隔绝空气的作用)的小单元产生电弧致使绝缘液体蒸发,引起电容凸出、破裂甚至爆炸,而爆炸会将易燃的油弄的到处都是、起火、损坏附近的设备。硬包装的圆柱状玻璃或塑料电容比起通常长方体包装的电容更容易炸裂,而后者不容易在高压下裂开。
    被用在射频电路中和长期在强电流环境工作的电容会过热,特别是电容中心的卷筒。即使外部环境温度较低,但这些热量不能及时散发出去,集聚在内部可能会迅速导致内部高热从而导致电容损坏。
    在高能环境下工作的电容组,如果其中一个出现故障,使电流突然切断,其他电容中储存的能量会涌向出故障的电容,这就即有可能出现猛烈的爆炸。
    高电压真空电容即使在正确的使用时也会发出一定的X射线。适当的密封、熔融(fusing)和预防性的维护会帮助减少这些潜在的危险。

    编辑本段容量测定

    电容器容量
    独石电容

      独石电容

    的简易测量方法:
    其中电压表和电流表应尽可能采用精度较高的磁电系或电动系仪表。
    接通电源后,应尽可能快(1-2S)记录下仪表的示值。
    当电源频率为50HZ时,用下式求取被测电容器的电容量。
    C=3183 I/U
    式中C----被 测电容器的电容量,μF
    I-----电流表读数,A;
    U----电压表读数,V。
    词条图册

    展开全文
  • 这种电容器适用于50/60hZ的交流电源供电的“单向电动机”的启动和运转,具有体积小、重量轻、价格低、损耗小、自愈效果佳等优点。 一般用于洗衣机等家用电器的交流电机中,起维持电机运转的作用。 2、cbb65电容 ...
  • 电容的分类

    千次阅读 2017-06-28 17:12:16
    电容是一种经常用到的电子器件,它是由两片离得较近的金属片,中间再隔以绝缘物质组成。按绝缘物质不同,可分为不同的电容,如:云母、瓷介、纸介和电解电容。 纸介电容: 用两片金属箔作电机,夹在极薄的电容纸中,...

    电容是一种经常用到的电子器件,它是由两片离得较近的金属片,中间再隔以绝缘物质组成。按绝缘物质不同,可分为不同的电容,如:云母、瓷介、纸介和电解电容。

    一.按绝缘物质分类

    1.纸介电容(CZ):

            用两片金属箔作电极,夹在极薄的电容纸中,卷成圆柱形或者扁柱形芯子,然后密封在金属壳或者绝缘材料(如火漆、陶瓷、玻璃釉等)壳中制成。它的特点是体积较小、容量可以较大。但是固有电感和损耗比较大,用于低频比较合适。

    常用的型号有:CZ11、CZ30、CZ31、CZ32、CZ40、CZ80

    2.云母电容(CY):

              用金属箔或者云母片上涂上银层做电极,极层和云母叠合之后,再压铸在胶木粉或封固在环氧树脂中制成。它的特点是介质损耗小,绝缘电阻大、温度系数小,适用于高频电路。

    3.陶瓷电容(CC)

            用陶瓷做介质,在陶瓷基体两面喷涂银层,然后烧成银质薄膜做极板构成。它的特点是体积小、耐热性好、损耗小、绝缘电阻高,但容量小、适用于高频电路。

    瓷介电容分为两类:

    1类电解质(NPO CCG)

    2类电解质(X7R 2X1)

    3类电解质(Y5V 2F4)

    铁电陶瓷电容容量大,但是损耗和温度系数较大,适用于低频电路。

    4.薄膜电容

    结构和纸质电容相同,介质是涤纶或聚苯乙烯。

    a.涤纶薄膜电容(CL),介质常数较高、体积小、容量大,稳定性较好,适合做旁路电容。

    常用的型号有CL11,CL12等。

    b.聚苯乙烯(CB)薄膜电容,介质损耗小,绝缘电阻高,但是温度系数较高,适用于做高频电路。

    常用的有CB10、CB11 ;CB14-CB16;CB24、CB25;CB80;Cb40

    c.聚苯烯(CBB)薄膜电容:低频电子电路或电动机的启动电路。常用的箔式聚苯烯电容有CBB10、CBB11 、CBB60、CBB61 等;常用的金属化聚苯烯电容有CBB20、CBB21、CBB401等系列。

    5.金属化纸介电容(CJ)

    结构和纸介电容基本相同,它是在电容器纸上覆上一层金属膜来代替金属箔,体积小,容量较大,一般用在低频电路中。常见的型号有CJ10、CJ11;

    6.油浸纸介电容

    它是把纸介电容浸在特殊处理过的油里,能增强它的耐压。它的特点是电容量大、耐压高,但是体积较大。

    7.铝电解电容(CD)

    它是由铝圆筒做负极,里面装有液体电解质,插入一片弯曲的铝带做正极做成。还需要经过直流电压处理,使正极片上形成一层氧化膜做介质。它的特点是容量大、但是漏电大、稳定性差有正负极性,适用于电源滤波或者低频电路。适用的时候。

    注意:不能用于交流电路,在直流电路中使用的时候,正负极不能接反。

    8.钽(CA)、铌电解电容

    它用金属钽或者铌做正极,用稀硫酸等配液做负极,用钽或者铌表面生成的氧化膜做介质制成。它的特点是体积小、容量大、性能稳定、寿命长、绝缘电阻大、温度特性好,用在要求较高的设备中。

    钽电容型号有CA30、CA31、CA35、CAK35、CA40、CA41 、CA42、CA42H、CA49、CA70(无极性)等系列。

    二.按用途分类

    电容的用途非常多,主要有以下几种:

    1.隔直流

    作用是阻止直流通过而让交流通过。

    2.旁路(去藕)

    为交流电路中某些并联的组建提供低阻抗通路。

    3.耦合

    作为两个电路中连接,允许交流信号通过并传输到下一级电路。

    4.滤波

    这个队与DIY而言很重要,显卡上的电容基本上都是这个作用 。

    5.温度补偿

    针对其他组件对温度的适应性不够带来的影响,而进行补偿,改变电路的稳定性。

    6.计时

    电容器与电阻器配合使用,确定电路的时间常数

    7.调谐

    对于频率相关的电路进行调谐,比如:收音机、电视机、手机

    8.整流

    在预定的时间打开或关闭半导体组件。

    9.储能

    储存电能,用于必要的时候释放。例如相机闪光灯、加热设备等等。(如今某些电容的储能水平已近接近某些锂电池,某些电容的储能可以让手机用一整天)

    三.电容器参数与分类

    1.标称电容(CR)

    电容器产品标出的电容量值。云母和陶瓷电容介质的电容量较低(大约在5000pF以下);纸、塑料和陶瓷介质形式的电容器居中(大约在0.005uf-1.0uf),通常电解电容的容量较大。

    2.类别温度范围

    电容器所能确定的连续工作的环境温度范围。该范围取决于 它相应类别的温度极限值,如上限类别温度、下限类别温度、额定温度(可以连续施加额定电压的最高环境温度)等。

    3.额定电压(UR)

    在下限类别温度和额定温度的任一温度下,可以连续施加在电容器上的最大直流电压或者最大交流电压的有效值或者脉冲电压的峰值。电容器在高电压场合必须注意电晕的影响。电晕是由于介质/电极层之间的空隙而产生的,它除了可以产生损坏设备的寄生信号外,还会导致电容器介质击穿。

    4.损耗角正切(tg)

    在规定频率的正弦电压下,电容器的损耗功率除以电容器的无功功率为损耗正切,在实际应用中,电容器并不是一个纯电容,还有等效电阻。

    5.电容器的温度特性

    通常是以20摄氏度的电容量和有关温度的电容量的百分比表示。

    6.使用寿命

    电容器的使用寿命随温度的增大而减小,主要原因是温度加快化学反应而介质随时间退化。

    7.绝缘电阻

    由于温升引起电子活动增加,因而温度升高,电阻降低。

    四.X电容和Y电容

    安规电容(CBB ):
    安规电容是指用于这样的场合,即电容器失效后,不会导致电击,不危及人身安全.
    它包括X电容各Y电容两种类型,x电容是跨接在电力线两线(L-N)之间的电容,一般选用金属薄膜电容;Y电容是分别跨接在电力线两线和地之间(L-E,N-E)的电容,一般是成对出现。基于漏电流的限制,Y电容值不能太大,一般X电容是uF级,Y电容是nF级。X电容抑制差模干扰,Y电容抑制共模干扰。
    根据IEC 60384-14,电容器分为X电容及Y电容:
    1. X电容是指跨于L-N之间的电容器, 
    2. Y电容是指跨于L-G/N-G之间的电容器。 
    (L=Line, N=Neutral, G=Ground)
    X电容底下又分为X1, X2, X3,主要差別在于: 
    1. X1耐高压大于2.5 kV, 小于等于4 kV, 
    2. X2耐高压小于等于2.5 kV, 
    3. X3耐高压小于等于1.2 kV
    Y电容底下又分为Y1, Y2, Y3,Y4, 主要差別在于: 
    1. Y1耐高压大于8 kV, 
    2. Y2耐高压大于5 kV, 
    3. Y3耐高压 n/a 
    4. Y4耐高压大于2.5 kV

    X,Y电容都是安规电容,火线零线间的是X电容,火线与地间的是Y电容.
    它们用在电源滤波器里,起到电源滤波作用,分别对共模(Y电容),差模(X电容)干扰起滤波作用.
    一.抑制电源电磁干扰用电容器 
      当在电源跨线电路中使用电容器来消除噪音时,不仅仅只有正常电压,还必须考虑到异常的脉冲电压(如闪电)的产生,这可能会导致电容器冒烟或者起火。所以,跨线电容器的安全标准对于在不同国家有严格规定,故必须使用经过安全认证的电容器。 
    二.不允许将直流电容器用作跨线电容器使用:
      对于X2类抑制电源电磁干扰用电容器应适用于在电容器失效时不会导致电击危险的场合,如电源跨线路连接,可承受2.5kV的脉冲电压。 
    对于Y2类抑制电源电磁干扰用电容器应适用于在电容器失效时不会导致电击危险的场合,用于电源跨线路连接时,能承受5kV的脉冲电压冲击,不致发生击穿现象。


    展开全文
  • 电容触摸屏

    2021-08-17 23:35:51
    电容屏具有支持多点触控、检测精度高的特点,电容屏通过与导电物体产生的电容效应来检测触摸动作, 只能感应导电物体的触摸,湿度较大或屏幕表面有水珠时会影响电容屏的检测效果。区分电阻屏和电容屏一般通过绝缘...

    电容触摸屏

    触摸屏又称触控面板,它是一种把触摸位置转化成坐标数据的输入设备,根据触摸屏的检测原理,主要分为电阻式触摸屏和电容式触摸屏。 相对来说,电阻屏造价便宜,能适应较恶劣的环境,但它只支持单点触控(一次只能检测面板上的一个触摸位置),触摸时需要一定的压力, 使用久了容易造成表面磨损,影响寿命;而电容屏具有支持多点触控、检测精度高的特点,电容屏通过与导电物体产生的电容效应来检测触摸动作, 只能感应导电物体的触摸,湿度较大或屏幕表面有水珠时会影响电容屏的检测效果。区分电阻屏和电容屏一般通过绝缘物体点击是否响应来区别。
    电阻触摸屏一般会引出四根线,通过XPT2046触摸控制芯片驱动;f407可用GT5688驱动电容屏。
    电阻屏结构及其原理

    电阻屏结构
    在这里插入图片描述
    它主要由表面硬涂层、两个ITO层、间隔点以及玻璃底层构成, 这些结构层都是透明的,整个触摸屏覆盖在液晶面板上,透过触摸屏可看到液晶面板。表面涂层起到保护作用, 玻璃底层起承载的作用,而两个ITO层是触摸屏的关键结构,它们是涂有铟锡金属氧化物的导电层。 两个ITO层之间使用间隔点使两层分开,当触摸屏表面受到压力时,表面弯曲使得上层ITO与下层ITO接触,在触点处连通电路。

    电阻屏电压原理

    两个ITO涂层的两端分别引出X-、X+、Y-、Y+四个电极,见下图 XY的ITO层结构 , 这是电阻屏最常见的四线结构,通过这些电极,外部电路向这两个涂层可以施加匀强电场或检测电压。在这里插入图片描述
    通过按压点和xy轴的比例关系,来确定按压点
    在这里插入图片描述
    计算X坐标时,在X+电极施加驱动电压Vref,X-极接地,所以X+与X-处形成了匀强电场,而触点处的电压通过Y+电极采集得到, 由于ITO层均匀导电,触点电压与Vref之比等于触点X坐标与屏宽度之比,从而:
    在这里插入图片描述
    计算Y坐标时,在Y+电极施加驱动电压Vref,Y-极接地,所以Y+与Y-处形成了匀强电场,而触点处的电压通过X+电极采集得到, 由于ITO层均匀导电,触点电压与Vref之比等于触点Y坐标与屏高度之比,从而:
    在这里插入图片描述
    注:可计算出坐标的基础是ITO上的电压是均匀的。上文说的四根线就是X、Y的正负。
    为了方便检测触摸的坐标,一些芯片厂商制作了电阻屏专用的控制芯片,控制上述采集过程、采集电压, 外部微控制器直接与触摸控制芯片通讯直接获得触点的电压或坐标。XPT2046芯片控制4线电阻触摸屏,STM32与XPT2046采用SPI通讯获取采集得的电压,然后转换成坐标。

    电容屏原理
    与电阻式触摸屏不同,电容式触摸屏不需要通过压力使触点变形,再通过触点处电压值来检测坐标,它的基本原理是利用充电时间检测电容大小,从而通过检测出电容值的变化来获知触摸信号。
    电容屏的最上层是玻璃(不会像电阻屏那样形变), 核心层部分也是由ITO材料构成的,导电材料在屏幕里构成了静电网,静电网由多行X轴电极和多列Y轴电极构成,两个电极之间会形成电容。 触摸屏工作时,X轴电极发出AC交流信号,而交流信号能穿过电容,即通过Y轴能感应出该信号,当交流电穿越时电容会有充放电过程,检测该充电时间可获知电容量。 若手指触摸屏幕,会影响触摸点附近两个电极之间的耦合,从而改变两个电极之间的电容量,若检测到某电容的电容量发生了改变, 即可获知该电容处有触摸动作。

    电容屏ITO工作过程及有效原理
    在这里插入图片描述
    X轴电极与Y轴电极在交叉处形成电容,即这两组电极构成了电容的两极,这样的结构覆盖了整个电容屏,每个电容单元在触摸屏中都有其特定的物理位置, 即电容的位置就是它在触摸屏的XY坐标。检测触摸的坐标时,第1条X轴的电极发出激励信号,而所有Y轴的电极同时接收信号, 通过检测充电时间可检测出各个Y轴与第1条X轴相交的各个互电容的大小,各个X轴依次发出激励信号,重复上述步骤,即可得到整个触摸屏二维平面的所有电容大小。 当手指接近时,会导致局部电容改变,根据得到的触摸屏电容量变化的二维数据表,可以得知每个触摸点的坐标,因此电容触摸屏支持多点触控。最终STM32通过IIC协议与电容屏芯片进行通讯来获得具体的坐标。
    电容触摸屏可看作是多个电容按键组合而成,就像机械按键中独立按键和矩阵按键的关系一样,甚至电容触摸屏的坐标扫描方式与矩阵按键都是很相似的。

    电容触摸屏芯片

    内部结构框图在这里插入图片描述
    解释如下
    在这里插入图片描述
    ADC用来检测电压;DSP处理数据。

    上电时序与I2C设备地址:GT5688触控芯片有两个备选的I2C通讯地址,这是由芯片的上电时序设定的。上电时序有Reset引脚和INT引脚生成,若Reset引脚从低电电平转变到高电平期间,INT引脚为高电平的时候,触控芯片使用的I2C设备地址为0x28/0x29(8位写、读地址), 7位地址为0x14;若Reset引脚从低电电平转变到高电平期间,INT引脚一直为低电平,则触控芯片使用的I2C设备地址为0xBA/0xBB(8位写、读地址),7位地址为0x5D。

    选择设备地址
    在这里插入图片描述

    寄存器配置
    上电复位后,GT5688芯片需要通过外部主控芯片加载寄存器配置,设定它的工作模式,这些配置通过I2C信号线传输到GT5688, 它的配置寄存器地址都由两个字节来表示,这些寄存器的地址从0x8047-0x8135,一般来说,我们实际配置的时候会按照GT5688生产厂商给的默认配置来控制芯片, 仅修改部分关键寄存器。

    (此处使用旧型号芯片GT9157的寄存器表截图来进行说明,这两个型号大部分兼容)在这里插入图片描述
    寄存器介绍如下:
    (1) 配置版本寄存器
    0x8047配置版本寄存器,它包含有配置文件的版本号,若新写入的版本号比原版本大,或者版本号相等,但配置不一样时, 才会更新配置文件到寄存器中。其中配置文件是指记录了寄存器0x8048-0x80FE控制参数的一系列数据。
    为了保证每次都更新配置,我们一般把配置版本寄存器设置为“0x00”,这样版本号会默认初始化为‘A’, 这样每次我们修改其它寄存器配置的时候,都会写入到GT5688中。
    (2) X、Y分辨率
    0x8048-0x804B寄存器用于配置触控芯片输出的XY坐标的最大值,为了方便使用,我们把它配置得跟液晶面板的分辨率一致, 这样就能使触控芯片输出的坐标一一对应到液晶面板的每一个像素点了。
    (3) 触点个数
    0x804C触点个数寄存器用于配置它最多可输出多少个同时按下的触点坐标,这个极限值跟触摸屏面板有关, 如我们本章实验使用的触摸面板最多支持5点触控。
    (4) 模式切换
    0x804D模式切换寄存器中的X2Y位可以用于交换XY坐标轴;而INT触发方式位可以配置不同的触发方式, 当有触摸信号时,INT引脚会根据这里的配置给出触发信号。
    (5) 配置校验
    0x80FF配置校验寄存器用于写入前面0x8047-0x80FE寄存器控制参数字节之和的补码,GT5688收到前面的寄存器配置时, 会利用这个数据进行校验,若不匹配,就不会更新寄存器配置。
    (6) 配置更新
    0x8100配置更新寄存器用于控制GT5688进行更新,传输了前面的寄存器配置并校验通过后, 对这个寄存器写1,GT5688会更新配置。

    读取坐标
    坐标寄存器
    上述寄存器主要是由外部主控芯片给GT5688写入配置的,而它则使用图 坐标信息寄存器 中的寄存器向主控器反馈信息。
    在这里插入图片描述
    (1) 产品ID及版本
    0x8140-0x8143 寄存器存储的是产品ID,上电后我们可以利用I2C读取这些寄存器的值来判断I2C是否正常通讯, 这些寄存器中包含有“5688”字样; 而0x8144-0x8145则保存有固件版本号,不同版本可能不同。
    (2) X/Y分辨率
    0x8146-0x8149寄存器存储了控制触摸屏的分辨率,它们的值与我们前面在配置寄存器写入的XY控制参数一致。 所以我们可以通过读取这两个寄存器的值来确认配置参数是否正确写入。
    (3) 状态寄存器
    0x814E地址的是状态寄存器,它的Buffer status位存储了坐标状态,当它为1时,表示新的坐标数据已准备好,可以读取, 0表示未就绪,数据无效,外部控制器读取完坐标后,须对这个寄存器位写0 。number of touch points位表示当前有多少个触点。
    (4) 坐标数据
    从地址0x814F-0x8156的是触摸点1的坐标数据,从0x8157-0x815E的是触摸点2的坐标数据,依次还有存储3-10触摸点坐标数据的寄存器。 读取这些坐标信息时,我们通过它们的track id来区分笔迹,多次读取坐标数据时,同一个track id号里的数据属于同一个连续的笔划轨迹。
    读坐标流程
    上电、配置完寄存器后,GT5688就会开监测触摸屏,若我们前面的配置使INT采用中断上升沿报告触摸信号的方式,整个读取坐标信息的过程如下:
    (1) 待机时INT引脚输出低电平;
    (2) 有坐标更新时,INT引脚输出上升沿;
    (3) INT输出上升沿后,INT 脚会保持高直到下一个周期(该周期可由配置 Refresh_Rate 决定)。 外部主控器在检测到INT的信号后,先读取状态寄存器(0x814E)中的number of touch points位获当前有多少个触摸点, 然后读取各个点的坐标数据,读取完后将 bufferstatus位写为 0。外部主控器的这些读取过程要在一个周期内完成,该周期由0x8056地址的Refresh_Rate寄存器配置;
    (4) 上一步骤中INT输出上升沿后,若主控未在一个周期内读走坐标, 下次 GT5688即使检测到坐标更新会再输出一个 INT 脉冲但不更新坐标;
    (5) 若外部主控一直未读走坐标, 则 GT5688会一直输出 INT 脉冲。

    在这里插入图片描述
    其中的PD3和PD7没有硬件I2C功能,所以需要软件模拟的方式模拟I2C
    代码相关
    1.I2C配置
    I2C的GPIO配置时(下为I2C__GPIO_Config()部分函数体)

        /*配置SCL引脚 */   
        GPIO_InitStructure.GPIO_Pin = GTP_I2C_SCL_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
        GPIO_Init(GTP_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);
        /*配置SDA引脚 */
        GPIO_InitStructure.GPIO_Pin = GTP_I2C_SDA_PIN;
        GPIO_Init(GTP_I2C_SDA_GPIO_PORT, &GPIO_InitStructure); 
      /*配置RST引脚,下拉推挽输出 */   
      GPIO_InitStructure.GPIO_Pin = GTP_RST_GPIO_PIN;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
      GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
      GPIO_Init(GTP_RST_GPIO_PORT, &GPIO_InitStructure);  
      /*配置 INT引脚,下拉推挽输出,方便初始化 */   
      GPIO_InitStructure.GPIO_Pin = GTP_INT_GPIO_PIN;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    

    SDA和SCL引脚都应该设置为浮空开漏输出,而RST和INT应该设置为下拉推挽输出。INT引脚需要接收选择时序的,因此需要设置为推挽输出模式。(下拉即为默认值为低电平,方便初始化)

    配置完GPIO,选择好时序后,再次配置I2C,将INT设置为下拉推挽输出,方便初始化(下为I2C_ResetChip()部分函数体)

    GPIO_InitStructure.GPIO_Pin = GTP_INT_GPIO_PIN;
    	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    	  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;  
    	  GPIO_Init(GTP_INT_GPIO_PORT, &GPIO_InitStructure);
    

    初始化完后紧接着就把INT引脚设置为浮空输入模式,方便接收中断信号

    /*把INT引脚设置为浮空输入模式,以便接收触摸中断信号*/
    	  GPIO_InitStructure.GPIO_Pin = GTP_INT_GPIO_PIN;
    	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    	  GPIO_Init(GTP_INT_GPIO_PORT, &GPIO_InitStructure);
    

    对于整个I2C_ResetChip()函数:

    void I2C_ResetChip(void)
    {
    	  GPIO_InitTypeDef GPIO_InitStructure;
    
      /*配置 INT引脚,下拉推挽输出,方便初始化 */   
    	  GPIO_InitStructure.GPIO_Pin = GTP_INT_GPIO_PIN;
    	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    	  	  //设置为下拉,方便初始化
    	  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;       
    
    	  //INT的GPIO初始化配置
    	  GPIO_Init(GTP_INT_GPIO_PORT, &GPIO_InitStructure);
    
    	  /*初始化GT5688,rst为高电平,int为低电平,
    	  则gt5688的设备地址被配置为0xBA*/
    
    	  /*设置复位引脚 复位为低电平,为初始化做准备*/
    	  GPIO_ResetBits (GTP_RST_GPIO_PORT,GTP_RST_GPIO_PIN);
    	  Delay(0x0FFFFF);
    
    	  /*拉高一段时间,进行初始化*/
    	  GPIO_SetBits (GTP_RST_GPIO_PORT,GTP_RST_GPIO_PIN);
    	  Delay(0x0FFFFF);
    //上面两个操作实现了选择设置地址为0xBA/0xBB时序
    
    	  /*把INT引脚设置为浮空输入模式,以便接收触摸中断信号*/
    	  GPIO_InitStructure.GPIO_Pin = GTP_INT_GPIO_PIN;
    	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    	  GPIO_Init(GTP_INT_GPIO_PORT, &GPIO_InitStructure);
    }
    
    //复位引脚中断引脚设置部分define如下
    /*复位引脚*/
    #define GTP_RST_GPIO_PORT                GPIOD
    #define GTP_RST_GPIO_CLK                 RCC_AHB1Periph_GPIOD
    #define GTP_RST_GPIO_PIN                 GPIO_Pin_6
    /*中断引脚*/
    #define GTP_INT_GPIO_PORT                GPIOG
    #define GTP_INT_GPIO_CLK                 RCC_AHB1Periph_GPIOG
    #define GTP_INT_GPIO_PIN                 GPIO_Pin_8
    #define GTP_INT_EXTI_PORTSOURCE          EXTI_PortSourceGPIOG
    #define GTP_INT_EXTI_PINSOURCE           EXTI_PinSource8
    #define GTP_INT_EXTI_LINE                EXTI_Line8
    #define GTP_INT_EXTI_IRQ                 EXTI9_5_IRQn
    

    I2C中断引脚配置

    void I2C_GTP_IRQEnable(void)
    {
      EXTI_InitTypeDef EXTI_InitStructure;  
      NVIC_InitTypeDef NVIC_InitStructure;
      GPIO_InitTypeDef GPIO_InitStructure;  
      /*配置 INT 为浮空输入 */   
      GPIO_InitStructure.GPIO_Pin = GTP_INT_GPIO_PIN;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
      GPIO_Init(GTP_INT_GPIO_PORT, &GPIO_InitStructure);  
      
      /* 连接 EXTI 中断源 到INT 引脚 */
      SYSCFG_EXTILineConfig(GTP_INT_EXTI_PORTSOURCE, GTP_INT_EXTI_PINSOURCE);
    
      /* 选择 EXTI 中断源 */
      EXTI_InitStructure.EXTI_Line = GTP_INT_EXTI_LINE;
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      EXTI_Init(&EXTI_InitStructure);  
      
      /* 配置中断优先级 */
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
      
    	/*使能中断*/
      NVIC_InitStructure.NVIC_IRQChannel = GTP_INT_EXTI_IRQ;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
    //中断define见上文
    }
    

    上三个函数运行

    void I2C_Touch_Init(void)
    {
      I2C_GPIO_Config(); 
     
      I2C_ResetChip();
    
      I2C_GTP_IRQEnable();
    }
    

    写软件I2C时,需要自己写函数。下面介绍几个相关函数。

    void i2c_Start(void)
    {
    	/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
    	I2C_SDA_1();//设置SDA引脚为高电平
    	I2C_SCL_1();//设置SCL引脚为高电平
    	i2c_Delay();
    	I2C_SDA_0();//设置SDA引脚为低电平
    	i2c_Delay();
    	I2C_SCL_0();//设置SCL引脚为低电平
    	i2c_Delay();
    }
    //相关宏
    //软件IIC使用的宏
    #define I2C_SCL_1()  GPIO_SetBits(GTP_I2C_SCL_GPIO_PORT, GTP_I2C_SCL_PIN)		/* SCL = 1 */
    #define I2C_SCL_0()  GPIO_ResetBits(GTP_I2C_SCL_GPIO_PORT, GTP_I2C_SCL_PIN)		/* SCL = 0 */
    
    #define I2C_SDA_1()  GPIO_SetBits(GTP_I2C_SDA_GPIO_PORT, GTP_I2C_SDA_PIN)		/* SDA = 1 */
    #define I2C_SDA_0()  GPIO_ResetBits(GTP_I2C_SDA_GPIO_PORT, GTP_I2C_SDA_PIN)		/* SDA = 0 */
    
    #define I2C_SDA_READ()  GPIO_ReadInputDataBit(GTP_I2C_SDA_GPIO_PORT, GTP_I2C_SDA_PIN)	/* 读SDA口线状态 */
    //i2c_Delay()函数:
    static void i2c_Delay(void)
    {
    	uint8_t i;
    
    	/* 
    	 	下面的时间是通过逻辑分析仪测试得到的。
        工作条件:CPU主频180MHz ,MDK编译环境,1级优化
          
    		循环次数为50时,SCL频率 = 333KHz 
    		循环次数为30时,SCL频率 = 533KHz,  
    	 	循环次数为20时,SCL频率 = 727KHz, 
      */
    	for (i = 0; i < 10*2; i++);
    }
    

    I2C硬件电路时序图在这里插入图片描述

    根据时序图,要先把SDA和SCL线都拉成高电平。延时后SDA由高变低,SCL没变化,则Start信号成功产生,为进行后续操作,SCL线也拉成低电平。SCL为高电平时SDA由高变低产生的这个时序信号就是I2C启动信号。
    类似的停止信号:

    void i2c_Stop(void)
    {
    	/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */
    	I2C_SDA_0();
    	I2C_SCL_1();
    	i2c_Delay();
    	I2C_SDA_1();
    }
    

    软件I2C实际就是CPU控制引脚电平发送I2C信号;硬件I2C就是通过控制STM32的寄存器产生I2C信号。
    其他常用软件I2C函数如下
    (1)
    i2c_SendByte(uint8_t _ucByte) CPU向I2C总线设备发送8bit数据
    形参:_ucByte : 等待发送的字节

    void i2c_SendByte(uint8_t _ucByte)
    {
    	uint8_t i;
    
    	/* 先发送字节的高位bit7 */
    	for (i = 0; i < 8; i++)
    	{		
    		if (_ucByte & 0x80)
    		{
    			I2C_SDA_1();
    		}
    		else
    		{
    			I2C_SDA_0();
    		}
    		i2c_Delay();
    		I2C_SCL_1();
    		i2c_Delay();	
    		I2C_SCL_0();
    		if (i == 7)
    		{
    			 I2C_SDA_1(); // 释放总线
    		}
    		_ucByte <<= 1;	/* 左移一个bit */
    		i2c_Delay();
    	}
    }
    

    形参为要发送的数据,8个数据位,如果这个数据位是1,SDA线产生高电平,是0产生低电平。
    (2)
    函数名: i2c_ReadByte(); CPU从I2C总线设备读取8bit数据
    返回值: 读到的数据

    uint8_t i2c_ReadByte(void)
    {
    	uint8_t i;
    	uint8_t value;
    
    	/* 读到第1个bit为数据的bit7 */
    	value = 0;
    	for (i = 0; i < 8; i++)
    	{
    		value <<= 1;
    		I2C_SCL_1();
    		i2c_Delay();
    		if (I2C_SDA_READ())
    		{
    			value++;
    		}
    		I2C_SCL_0();
    		i2c_Delay();
    	}
    	return value;
    }
    //通过SCL由高变低,对SDA引脚进行采样,采样其每个数据位,采样八个数据位则读到一个字节
    

    (3)
    i2c_WaitAck() ;功能: CPU产生一个时钟,并读取器件的ACK应答信号
    返回值: 返回0表示正确应答,1表示无器件响应

    uint8_t i2c_WaitAck(void)
    {
    	uint8_t re;
    
    	I2C_SDA_1();	/* CPU释放SDA总线 */
    	i2c_Delay();
    	I2C_SCL_1();	/* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
    	i2c_Delay();
    	if (I2C_SDA_READ())	/* CPU读取SDA口线状态 */
    	{
    		re = 1;
    	}
    	else
    	{
    		re = 0;
    	}
    	I2C_SCL_0();
    	i2c_Delay();
    	return re;
    }
    

    (4)
    i2c_Ack();功能 CPU产生一个ACK信号

    void i2c_Ack(void)
    {
    	I2C_SDA_0();	/* CPU驱动SDA = 0 */
    	i2c_Delay();
    	I2C_SCL_1();	/* CPU产生1个时钟 */
    	i2c_Delay();
    	I2C_SCL_0();
    	i2c_Delay();
    	I2C_SDA_1();	/* CPU释放SDA总线 */
    }
    

    (5)
    i2c_NAck();功能说明: CPU产生1个NACK信号

    void i2c_NAck(void)
    {
    	I2C_SDA_1();	/* CPU驱动SDA = 1 */
    	i2c_Delay();
    	I2C_SCL_1();	/* CPU产生1个时钟 */
    	i2c_Delay();
    	I2C_SCL_0();
    	i2c_Delay();	
    }
    

    (6)ReadBytes和WriteBytes

    #define I2C_DIR_WR	0		/* 写控制bit */
    #define I2C_DIR_RD	1		/* 读控制bit */
    
    /**
      * ClientAddr:从设备地址
      *	pBuffer:存放由从机读取的数据的缓冲区指针
      *	NumByteToRead:读取的数据长度
      */
    uint32_t I2C_ReadBytes(uint8_t ClientAddr,uint8_t* pBuffer, 
    uint16_t NumByteToRead)
    {
    	
    	/* 第1步:发起I2C总线启动信号 */
    	i2c_Start();
    	
    	/* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,
    	0表示写,1表示读 */
    	i2c_SendByte(ClientAddr | I2C_DIR_RD);	/* 此处是读指令 */
    	
    	/* 第3步:等待ACK */
    	if (i2c_WaitAck() != 0)
    	{
    		goto cmd_fail;	/* 器件无应答 */
    	}
    
    	while(NumByteToRead) 
      {
       if(NumByteToRead == 1)
        {
    			i2c_NAck();	/* 最后1个字节读完后,CPU产生NACK信号
    			(驱动SDA = 1) */
          
          /* 发送I2C总线停止信号 */
          i2c_Stop();
        }
        
       *pBuffer = i2c_ReadByte();
        
        /* 读指针自增 */
        pBuffer++; 
          
        /*计数器自减 */
        NumByteToRead--;
        
        i2c_Ack();	/* 中间字节读完后,CPU产生ACK信号(驱动SDA = 0) */  
      }
    
    	/* 发送I2C总线停止信号 */
    	i2c_Stop();
    	return 0;	/* 执行成功 */
    
    cmd_fail: /* 命令执行失败后,切记发送停止信号,
                  避免影响I2C总线上其他设备 */
    	/* 发送I2C总线停止信号 */
    	i2c_Stop();
    	return 1;
    }
    
    /**
      * ClientAddr:从设备地址
      *	pBuffer:缓冲区指针
      * NumByteToWrite:写的字节数
      */
    uint32_t I2C_WriteBytes(uint8_t ClientAddr,uint8_t* pBuffer,
      uint8_t NumByteToWrite)
    {
    	uint16_t m;	
    
      /* 第0步:发停止信号,启动内部写操作 */
      i2c_Stop();
      
      /* 通过检查器件应答的方式,判断内部写操作是否完成, 一般小于 10ms 			
        CLK频率为200KHz时,查询次数为30次左右
      */
      for (m = 0; m < 1000; m++)
      {				
        /* 第1步:发起I2C总线启动信号 */
        i2c_Start();
        
        /* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,
        0表示写,1表示读 */
        i2c_SendByte(ClientAddr | I2C_DIR_WR);	/* 此处是写指令 */
        
        /* 第3步:发送一个时钟,判断器件是否正确应答 */
        if (i2c_WaitAck() == 0)
        {
          break;
        }
      }
      if (m  == 1000)
      {
        goto cmd_fail;	/* EEPROM器件写超时 */
      }	
    	
      while(NumByteToWrite--)
      {
      /* 第4步:开始写入数据 */
      i2c_SendByte(*pBuffer);
    
      /* 第5步:检查ACK */
      if (i2c_WaitAck() != 0)
      {
        goto cmd_fail;	/* 器件无应答 */
      }
      
          pBuffer++;	/* 地址增1 */		
      }
    	
    	/* 命令执行成功,发送I2C总线停止信号 */
    	i2c_Stop();
    	return 0;
    
    cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 */
    	/* 发送I2C总线停止信号 */
    	i2c_Stop();
    	return 1;
    	}
    

    驱动GT5688芯片
    1.I2C_Transfer(struct i2c_msg *msgs,int num)函数

    static int I2C_Transfer( struct i2c_msg *msgs,int num)
    {
    	int im = 0;
    	int ret = 0;
    
    	GTP_DEBUG_FUNC();
    //下面的for实际就是执行num次
    	for (im = 0; ret == 0 && im != num; im++)
    	{
    		if ((msgs[im].flags&I2C_M_RD))																//根据flag判断是读数据还是写数据
    		{
    			ret = I2C_ReadBytes(msgs[im].addr, msgs[im].buf, msgs[im].len);		//IIC读取数据
    		} else
    		{
    			ret = I2C_WriteBytes(msgs[im].addr,  msgs[im].buf, msgs[im].len);	//IIC写入数据
    		}
    	}
    	if(ret)
    		return ret;
    	return im;   //正常完成的传输结构个数
    }
    
    //mag结构体定义
    struct i2c_msg {
    	uint8_t addr;		/*从设备的I2C设备地址 */
    	uint16_t flags;	/*控制标志*/
    	uint16_t len;		/*读写数据的长度			*/
    	uint8_t *buf;		/*存储读写数据的指针	*/
    };
    
    

    此函数就是STM32使用I2C传输数据必要的函数,应用关键在于读数据和写数据两个函数。此读取函数应用在其他方面时主要替换的是就是实现读数据写数据的这两个函数,让I2C读取数据和写入数据。
    GTP的输入输出函数:

    /**
      * @brief   从IIC设备中读取数据
      * @param
      *		@arg client_addr:设备地址
      *		@arg  buf[0~1]: 读取数据寄存器的起始地址
      *		@arg buf[2~len-1]: 存储读出来数据的缓冲buffer
      *		@arg len:    GTP_ADDR_LENGTH + read bytes count(寄存器地址长度+读取的数据字节数)
      * @retval  i2c_msgs传输结构体的个数,2为成功,其它为失败
      */
      #define GTP_ADDR_LENGTH       2
    static int32_t GTP_I2C_Read(uint8_t client_addr, uint8_t *buf, int32_t len)
    {
        struct i2c_msg msgs[2];
        int32_t ret=-1;
        int32_t retries = 0;
    
        GTP_DEBUG_FUNC();
        /*一个读数据的过程可以分为两个传输过程:
         * 1. IIC  写入 要读取的寄存器地址
         * 2. IIC  读取  数据
         * */
    
        msgs[0].flags = !I2C_M_RD;					//写入(非读即意思为写入)
        msgs[0].addr  = client_addr;					//IIC设备地址
        msgs[0].len   = GTP_ADDR_LENGTH;	//寄存器地址一般为2字节(即写入两字节的数据)
        msgs[0].buf   = &buf[0];						//buf[0~1]存储的是要读取的寄存器地址
        
        msgs[1].flags = I2C_M_RD;					//读取
        msgs[1].addr  = client_addr;					//IIC设备地址
        msgs[1].len   = len - GTP_ADDR_LENGTH;	//要读取的数据长度
        msgs[1].buf   = &buf[GTP_ADDR_LENGTH];	//buf[GTP_ADDR_LENGTH]之后的缓冲区存储读出的数据
    
        while(retries < 5)
        {
            ret = I2C_Transfer( msgs, 2);					//调用IIC数据传输过程函数,有2个传输过程
            if(ret == 2)break;
            retries++;
        }
        if((retries >= 5))
        {
            GTP_ERROR("I2C Read: 0x%04X, %d bytes failed, errcode: %d! Process reset.", (((uint16_t)(buf[0] << 8)) | buf[1]), len-2, ret);
        }
        return ret;
    }
    
    
    
    /**
      * @brief   向IIC设备写入数据
      * @param
      *		@arg client_addr:设备地址
      *	
      *		@arg  buf[0~1]: 要写入的数据寄存器的起始地址
      *		@arg buf[2~len-1]: 要写入的数据
      *		@arg len:    GTP_ADDR_LENGTH + write bytes count(寄存器地址长度+写入的数据字节数)
      * @retval  i2c_msgs传输结构体的个数,1为成功,其它为失败
      */
    static int32_t GTP_I2C_Write(uint8_t client_addr,uint8_t *buf,int32_t len)
    {
        struct i2c_msg msg;
        int32_t ret = -1;
        int32_t retries = 0;
    
        GTP_DEBUG_FUNC();
        /*一个写数据的过程只需要一个传输过程:
         * 1. IIC连续 写入 数据寄存器地址及数据
         * */
        msg.flags = !I2C_M_RD;			//写入
        msg.addr  = client_addr;			//从设备地址
        msg.len   = len;							//长度直接等于(寄存器地址长度+写入的数据字节数)
        msg.buf   = buf;						//直接连续写入缓冲区中的数据(包括了寄存器地址)
    //尝试发送五次
        while(retries < 5)
        {
            ret = I2C_Transfer(&msg, 1);	//调用IIC数据传输过程函数,1个传输过程
            if (ret == 1)break;
            retries++;
        }
        if((retries >= 5))
        {
    
            GTP_ERROR("I2C Write: 0x%04X, %d bytes failed, errcode: %d! Process reset.", (((uint16_t)(buf[0] << 8)) | buf[1]), len-2, ret);
    
        }
        return ret;
    }
    
    

    buf[0-1]: 读取数据寄存器的起始地址,buf[2~len-1]: 存储读出来数据的缓冲buffer。例如,往0x8143中写入0xFE,三个参数为——0xBA,
    (buf 0 0x81;buf 1 0x43;buf 2 0xFE),len 3;若要向0x8144写入0xFF向0x8143写入0xFE,则写如下:0xBA,(buf 0 0x81;buf 1 0x43;buf 2 0xFE,buf 3 0xFF),len 4.则读到了两个字节。
    GTP_I2C_Read(uint8_t client_addr, uint8_t *buf, int32_t len)函数的

     msgs[0].flags = !I2C_M_RD;					//写入(非读即意思为写入)
        msgs[0].addr  = client_addr;					//IIC设备地址
        msgs[0].len   = GTP_ADDR_LENGTH;	//寄存器地址一般为2字节(即写入两字节的数据)
        msgs[0].buf   = &buf[0];						//buf[0~1]存储的是要读取的寄存器地址
        
        msgs[1].flags = I2C_M_RD;					//读取
        msgs[1].addr  = client_addr;					//IIC设备地址
        msgs[1].len   = len - GTP_ADDR_LENGTH;	//要读取的数据长度
        msgs[1].buf   = &buf[GTP_ADDR_LENGTH];	//buf[GTP_ADDR_LENGTH]之后的缓冲区存储读出的数据
    

    部分,msgs[0]储存的是设备地址,msgs[1]储存的是后面的数据,而设备地址占两个字节,因此后面的数据占len - GTP_ADDR_LENGTH,读的数据也是地址后的 msgs[1].buf = &buf[GTP_ADDR_LENGTH];

    GTP_Init_Panel()函数分析

    int32_t GTP_Init_Panel(void)
    {
        int32_t ret = -1;
    
        int32_t i = 0;
        uint16_t check_sum = 0;
        int32_t retry = 0;
    
        const uint8_t* cfg_info;
        uint8_t cfg_info_len  ;
    		uint8_t* config;
    
        uint8_t cfg_num =0 ;		//需要配置的寄存器个数
    
        GTP_DEBUG_FUNC();
    	
    //uint8_t config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH]
    //                = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff};
    
    		config = (uint8_t *)malloc (GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH);
    
    		config[0] = GTP_REG_CONFIG_DATA >> 8;
    		config[1] =  GTP_REG_CONFIG_DATA & 0xff;
    	
        I2C_Touch_Init();//I2C初始化
    
        ret = GTP_I2C_Test();//数据测试
        if (ret < 0)
        {
            GTP_ERROR("I2C communication ERROR!");
    				return ret;
        } 
    		
    		
        GTP_Read_Version(); //获取触摸IC的版本号和型号
    		
    #if UPDATE_CONFIG
    		//根据IC的型号指向不同的配置
        if(touchIC == GT5688)
    		{
    			cfg_info =  CTP_CFG_GT5688; //指向寄存器配置
    			
    //#define CFG_GROUP_LEN(p_cfg_grp)  (sizeof(p_cfg_grp) / sizeof(p_cfg_grp[0]))
    //计算数组元素的宏
    			cfg_info_len = CFG_GROUP_LEN(CTP_CFG_GT5688);//计算配置表的大小
    		}
    		/*
            #define GTP_ADDR_LENGTH       2
            #define GTP_CONFIG_MIN_LENGTH 186
            #define GTP_CONFIG_MAX_LENGTH 256
            */
        memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH);
        //memset函数是c语言库函数,会把内存空间清零
        //在此处作用就是把指针指向的该数据地址的内存空间清零
        memcpy(&config[GTP_ADDR_LENGTH], cfg_info, cfg_info_len);
        //memcpy函数是c语言库函数,
        //在上文中的作用是复制cfg_info的内容到config[2]后面的内容里去
    
    		cfg_num = cfg_info_len;
    		
    		GTP_DEBUG("cfg_info_len = %d ",cfg_info_len);
    		GTP_DEBUG("cfg_num = %d ",cfg_num);
    		GTP_DEBUG_ARRAY(config,6);
    		
    /*
    //根据液晶扫描方向而变化的XY像素宽度
    //调用ILI9806G_GramScan函数设置方向时会自动更改
    uint16_t LCD_X_LENGTH = ILI9806G_MORE_PIXEL;
    uint16_t LCD_Y_LENGTH = ILI9806G_LESS_PIXEL;
    */
    		/*根据LCD的扫描方向设置分辨率*/
    		config[GTP_ADDR_LENGTH+1] = LCD_X_LENGTH & 0xFF;//取低字节
    		config[GTP_ADDR_LENGTH+2] = LCD_X_LENGTH >> 8;//取高字节
    		config[GTP_ADDR_LENGTH+3] = LCD_Y_LENGTH & 0xFF;//取低字节
    		config[GTP_ADDR_LENGTH+4] = LCD_Y_LENGTH >> 8;//取高字节
    		
    /*
    //液晶屏扫描模式,本变量主要用于方便选择触摸屏的计算参数
    //参数可选值为0-7
    //调用ILI9806G_GramScan函数设置方向时会自动更改
    //LCD刚初始化完成时会使用本默认值
    uint8_t LCD_SCAN_MODE =6;
    */
    		/*根据扫描模式设置X2Y交换*/
    		switch(LCD_SCAN_MODE)
    		{
    		//其实就是配置控制xy坐标交换的寄存器,让其坐标交换
    		//#define X2Y_LOC        				(1<<3)
    			case 0:case 2:case 4: case 6:
    				config[GTP_ADDR_LENGTH+6] &= ~(X2Y_LOC);
    				break;
    			
    			case 1:case 3:case 5: case 7:
    				config[GTP_ADDR_LENGTH+6] |= (X2Y_LOC);
    				break;		
    		}
    
        //计算要写入checksum寄存器的值
        check_sum = 0;
    		
    		for (i = GTP_ADDR_LENGTH; i < (cfg_num+GTP_ADDR_LENGTH -3); i += 2) 
    		{
    			check_sum += (config[i] << 8) + config[i + 1];
    		}
    		
    		check_sum = 0 - check_sum;
    		GTP_DEBUG("Config checksum: 0x%04X", check_sum);
    		//更新checksum
    		//下面是往倒数第一个、第二个分别赋值check_sum的高字节
    		//最后在倒数第一个写1,寄存器更新上述数据,至此config变量重新配置
    		config[(cfg_num+GTP_ADDR_LENGTH -3)] = (check_sum >> 8) & 0xFF;
    		config[(cfg_num+GTP_ADDR_LENGTH -2)] = check_sum & 0xFF;
    		config[(cfg_num+GTP_ADDR_LENGTH -1)] = 0x01;
        //写入配置信息
        for (retry = 0; retry < 5; retry++)
        {
            ret = GTP_I2C_Write(GTP_ADDRESS, config , cfg_num + GTP_ADDR_LENGTH+2);
            if (ret > 0)
            {
                break;
            }
        }
        Delay(0xfffff);				//延迟等待芯片更新		
    
    
        //下面代码平时不使用,调试模式才时使用
        //使用时if后的0改为1,使用调试模式
    #if 0	//读出写入的数据,检查是否正常写入
        //检验读出的数据与写入的是否相同
    	{
        uint16_t i;
        uint8_t buf[300];
         buf[0] = config[0];
         buf[1] =config[1];    //寄存器地址
         
        GTP_DEBUG_FUNC();
    
        ret = GTP_I2C_Read(GTP_ADDRESS, buf, sizeof(buf));
       
        GTP_DEBUG("read ");
    
        GTP_DEBUG_ARRAY(buf+2,cfg_num+2);
    
        GTP_DEBUG("write ");
    
        GTP_DEBUG_ARRAY(config,cfg_num);
    
        //不对比版本号
        for(i=1;i<cfg_num+GTP_ADDR_LENGTH-3;i++)
        {
    
          if(config[i] != buf[i])
          {
            GTP_ERROR("Config fail ! i = %d ",i);
            free(config);
            return -1;
          }
        }
        if(i==cfg_num+GTP_ADDR_LENGTH-3)
        GTP_DEBUG("Config success ! i = %d ",i);
    	}
    #endif
      free(config);//释放调用的空间
      #endif
      /*使能中断,这样才能检测触摸数据*/
      I2C_GTP_IRQEnable();//发生触摸时Init引脚产生上升沿或下降沿,引起中断
    
      GTP_Get_Info();//获取配置后的信息:分辨率版本号等,具体函数体见下文
    
      return 0;
    }
    

    debug 的define

    // Log define
    #define GTP_INFO(fmt,arg...)           printf("<<-GTP-INFO->> "fmt"\n",##arg)
    #define GTP_ERROR(fmt,arg...)          printf("<<-GTP-ERROR->> "fmt"\n",##arg)
    #define GTP_DEBUG(fmt,arg...)          do{\
                                             if(GTP_DEBUG_ON)\
                                             printf("<<-GTP-DEBUG->> [%d]"fmt"\n",__LINE__, ##arg);\
    																					}while(0)
    
    #define GTP_DEBUG_ARRAY(array, num)    do{\
                                             int32_t i;\
                                             uint8_t* a = array;\
                                             if(GTP_DEBUG_ARRAY_ON)\
                                             {\
                                                printf("<<-GTP-DEBUG-ARRAY->>\n");\
                                                for (i = 0; i < (num); i++)\
                                                {\
                                                    printf("0x%02X,", (a)[i]);\
                                                    if ((i + 1 ) %10 == 0)\
                                                    {\
                                                        printf("\n");\
                                                    }\
                                                }\
                                                printf("\n");\
                                            }\
                                           }while(0)
    
    #define GTP_DEBUG_FUNC()               do{\
                                             if(GTP_DEBUG_FUNC_ON)\
                                             printf("<<-GTP-FUNC->> Func:%s@Line:%d\n",__func__,__LINE__);\
                                           }while(0)
    
    																			 
    																			 
    #define GTP_SWAP(x, y)                 do{\
                                             typeof(x) z = x;\
                                             x = y;\
                                             y = z;\
                                           }while (0)
    
    //
    

    check_sum计算的校验码位置
    在这里插入图片描述

    上面函数中的GTP_Read_Version()函数:
    此函数就是初始化时读取设备的ID号版本号打印出来。

    int32_t GTP_Read_Version(void)
    {
        int32_t ret = -1;
        uint8_t buf[8] = {GTP_REG_VERSION >> 8, GTP_REG_VERSION & 0xff};    
        //寄存器地址,定义第一字节第二字节为设备寄存器地址,读取设备id号
    
        GTP_DEBUG_FUNC();
    
        ret = GTP_I2C_Read(GTP_ADDRESS, buf, sizeof(buf));
        if (ret < 0)
        {
            GTP_ERROR("GTP read version failed");
            return ret;
        }
        if (buf[2] == '5')//从两个字节的设备地址后的字节开始读取
        {
            GTP_INFO("IC1 Version: %c%c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[5], buf[7], buf[6]);//打印IC的版本号lowbyte和highbyte
    				
    				//GT5688芯片
    				if(buf[2] == '5' && buf[3] == '6' && buf[4] == '8'&& buf[5] == '8')
    					touchIC = GT5688;
        }        
        else if (buf[5] == 0x00)
        {
            GTP_INFO("IC2 Version: %c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[7], buf[6]);
    				
    				//GT911芯片
    				if(buf[2] == '9' && buf[3] == '1' && buf[4] == '1')
    					touchIC = GT911;
        }
        else
        {
            GTP_INFO("IC3 Version: %c%c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[5], buf[7], buf[6]);
    				
    				//GT9157芯片
    				if(buf[2] == '9' && buf[3] == '1' && buf[4] == '5' && buf[5] == '7')
    					touchIC = GT9157;
    		}
        return ret;
    }
    
    

    GTP_Get_Info()函数

    static int32_t GTP_Get_Info(void)
    {
        uint8_t opr_buf[10] = {0};
        int32_t ret = 0;
    
        uint16_t abs_x_max = GTP_MAX_WIDTH;
        uint16_t abs_y_max = GTP_MAX_HEIGHT;
        uint8_t int_trigger_type = GTP_INT_TRIGGER;
            
        opr_buf[0] = (uint8_t)((GTP_REG_CONFIG_DATA+1) >> 8);
        opr_buf[1] = (uint8_t)((GTP_REG_CONFIG_DATA+1) & 0xFF);
        
        ret = GTP_I2C_Read(GTP_ADDRESS, opr_buf, 10);
        if (ret < 0)
        {
            return FAIL;
        }
        
        abs_x_max = (opr_buf[3] << 8) + opr_buf[2];
        abs_y_max = (opr_buf[5] << 8) + opr_buf[4];
    		GTP_DEBUG("RES");   
    		GTP_DEBUG_ARRAY(&opr_buf[0],10);
    
        opr_buf[0] = (uint8_t)((GTP_REG_CONFIG_DATA+6) >> 8);
        opr_buf[1] = (uint8_t)((GTP_REG_CONFIG_DATA+6) & 0xFF);
        ret = GTP_I2C_Read(GTP_ADDRESS, opr_buf, 3);
        if (ret < 0)
        {
            return FAIL;
        }
        int_trigger_type = opr_buf[2] & 0x03;
        
        GTP_INFO("X_MAX = %d, Y_MAX = %d, TRIGGER = 0x%02x",
                abs_x_max,abs_y_max,int_trigger_type);
        
        return SUCCESS;    
    }
    

    上文产生中断时,执行中断服务函数

    void GTP_IRQHandler(void)
    {
    	if(EXTI_GetITStatus(GTP_INT_EXTI_LINE) != RESET) //确保是否产生了EXTI Line中断
    	{
    		LED2_TOGGLE;
        GTP_TouchProcess();    
    		EXTI_ClearITPendingBit(GTP_INT_EXTI_LINE);     //清除中断标志位
    	}  
    }
    

    其中执行 GTP_TouchProcess();

    void GTP_TouchProcess(void)
    {
      GTP_DEBUG_FUNC();//测试函数,不管
      Goodix_TS_Work_Func();//坐标获取函数,获取各个触点的坐标,寄存器如下
      
    }
    

    不完全图:不完全
    Goodix_TS_Work_Func();函数体如下

    #define GTP_READ_COOR_ADDR    0x814E//就是上文所说的寄存器地址
    static void Goodix_TS_Work_Func(void)
    {
        uint8_t  end_cmd[3] = {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF, 0};
        uint8_t  point_data[2 + 1 + 8 * GTP_MAX_TOUCH + 1]={GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF};
        uint8_t  touch_num = 0;
        uint8_t  finger = 0;
        static uint16_t pre_touch = 0;
        static uint8_t pre_id[GTP_MAX_TOUCH] = {0};
    
        uint8_t client_addr=GTP_ADDRESS;
        uint8_t* coor_data = NULL;
        int32_t input_x = 0;
        int32_t input_y = 0;
        int32_t input_w = 0;
        uint8_t id = 0;
     
        int32_t i  = 0;
        int32_t ret = -1;
    
        GTP_DEBUG_FUNC();
    
        ret = GTP_I2C_Read(client_addr, point_data, 12);//10字节寄存器加2字节地址
        if (ret < 0)
        {
            GTP_ERROR("I2C transfer error. errno:%d\n ", ret);
    
            return;
        }
        
        finger = point_data[GTP_ADDR_LENGTH];//状态寄存器数据
    
        if (finger == 0x00)		//没有数据,退出
        {
            return;
        }
    
        if((finger & 0x80) == 0)//判断buffer status位
        {
            goto exit_work_func;//坐标未就绪,数据无效
        }
    
        touch_num = finger & 0x0f;//坐标点数
        if (touch_num > GTP_MAX_TOUCH)
        {
            goto exit_work_func;//大于最大支持点数,错误退出
        }
    
        if (touch_num > 1)//不止一个点
        {
            uint8_t buf[8 * GTP_MAX_TOUCH] = {(GTP_READ_COOR_ADDR + 10) >> 8, (GTP_READ_COOR_ADDR + 10) & 0xff};
    
            ret = GTP_I2C_Read(client_addr, buf, 2 + 8 * (touch_num - 1));
            memcpy(&point_data[12], &buf[2], 8 * (touch_num - 1));			//复制其余点数的数据到point_data
        }
    
        
        
        if (pre_touch>touch_num)				//pre_touch>touch_num,表示有的点释放了
        {
            for (i = 0; i < pre_touch; i++)						//一个点一个点处理
             {
                uint8_t j;
               for(j=0; j<touch_num; j++)
               {
                   coor_data = &point_data[j * 8 + 3];
                   id = coor_data[0] & 0x0F;									//track id
                  if(pre_id[i] == id)
                    break;
    
                  if(j >= touch_num-1)											//遍历当前所有id都找不到pre_id[i],表示已释放
                  {
                     GTP_Touch_Up( pre_id[i]);
                  }
               }
           }
        }
    
    
        if (touch_num)
        {
            for (i = 0; i < touch_num; i++)						//一个点一个点处理
            {
                coor_data = &point_data[i * 8 + 3];
    
                id = coor_data[0] & 0x0F;									//track id
                pre_id[i] = id;
    
                input_x  = coor_data[1] | (coor_data[2] << 8);	//x坐标
                input_y  = coor_data[3] | (coor_data[4] << 8);	//y坐标
                input_w  = coor_data[5] | (coor_data[6] << 8);	//size
            
                {
    								/*根据扫描模式更正X/Y起始方向*/
    								switch(LCD_SCAN_MODE)
    								{
    									case 0:case 7:
    										input_y  = LCD_Y_LENGTH - input_y;
    										break;
    									
    									case 2:case 3: 
    										input_x  = LCD_X_LENGTH - input_x;
    										input_y  = LCD_Y_LENGTH - input_y;
    										break;
    									
    									case 1:case 6:
    										input_x  = LCD_X_LENGTH - input_x;
    										break;	
    									
    									default:
    									break;
    								}
    								
                    GTP_Touch_Down( id, input_x, input_y, input_w);//数据处理
                }
            }
        }
        else if (pre_touch)		//touch_ num=0 且pre_touch!=0
        {
          for(i=0;i<pre_touch;i++)
          {
              GTP_Touch_Up(pre_id[i]);
          }
        }
    
    
        pre_touch = touch_num;
    
    
    exit_work_func:
        {
            ret = GTP_I2C_Write(client_addr, end_cmd, 3);
            if (ret < 0)
            {
                GTP_INFO("I2C write end_cmd error!");
            }
        }
    
    }
    static void GTP_Touch_Up( int32_t id)
    {
    	
    
        /*处理触摸释放,用于触摸画板*/
        Touch_Button_Up(pre_x[id],pre_y[id]);
    
    		/*****************************************/
    		/*在此处添加自己的触摸点释放时的处理过程即可*/
    		/* pre_x[id],pre_y[id] 即为最新的释放点 ****/
    		/*******************************************/	
    		/***id为轨迹编号(多点触控时有多轨迹)********/
    	
    	
        /*触笔释放,把pre xy 重置为负*/
    	  pre_x[id] = -1;
    	  pre_y[id] = -1;		
      
        GTP_DEBUG("Touch id[%2d] release!", id);
    
    }
    
    static void GTP_Touch_Down(int32_t id,int32_t x,int32_t y,int32_t w)
    {
      
    	GTP_DEBUG_FUNC();
    
    	/*取x、y初始值大于屏幕像素值*/
        GTP_DEBUG("ID:%d, X:%d, Y:%d, W:%d", id, x, y, w);
    
    	
        /* 处理触摸按钮,用于触摸画板 */
        Touch_Button_Down(x,y); 
    	
    
        /*处理描绘轨迹,用于触摸画板 */
        Draw_Trail(pre_x[id],pre_y[id],x,y,&brush);
    	
    		/************************************/
    		/*在此处添加自己的触摸点按下时处理过程即可*/
    		/* (x,y) 即为最新的触摸点 *************/
    		/************************************/
    	
    		/*prex,prey数组存储上一次触摸的位置,id为轨迹编号(多点触控时有多轨迹)*/
        pre_x[id] = x; pre_y[id] =y;
    	
    }
    

    应用层
    Palette_Init(uint8_t LCD_Mode)函数

    void Palette_Init(uint8_t LCD_Mode)
    {
      
      uint8_t i;
    	
    	ILI9806G_GramScan ( LCD_Mode );
    
      /* 整屏清为白色 */
    	LCD_SetBackColor(CL_WHITE);//设置背景为白色	
      ILI9806G_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);//清屏	
    
       
      /* 初始化按钮 */
      Touch_Button_Init();
      
      /* 描绘按钮 */
      for(i=0;i<BUTTON_NUM;i++)
      {
        button[i].draw_btn(&button[i]);
      }
      
    	
      /* 初始化画笔 */
      brush.color = CL_BLACK;
      brush.shape = LINE_SINGLE_PIXCEL;
    	
    	LCD_SetTextColor(brush.color);
    
    
    }
    void LCD_SetBackColor(uint16_t Color)
    {
      CurrentBackColor = Color;
    }
    
    void ILI9806G_Clear ( uint16_t usX, uint16_t usY, uint16_t usWidth, uint16_t usHeight )
    {
    	ILI9806G_OpenWindow ( usX, usY, usWidth, usHeight );
    
    	ILI9806G_FillColor ( usWidth * usHeight, CurrentBackColor );		
    	
    }
    /*画刷形状列表*/
    typedef enum 
    {
      LINE_SINGLE_PIXCEL = 0,   //单像素线
      
      LINE_2_PIXCEL,  //2像素线
      
      LINE_4_PIXCEL,  //4像素线
      
      LINE_6_PIXCEL,  //6像素线
      
      LINE_8_PIXCEL,  //8像素线
      
      LINE_16_PIXCEL, //16像素线
      
      LINE_20_PIXCEL, //20像素线
      
      LINE_WITH_CIRCLE,  //珠子连线
        
      RUBBER,           //橡皮
    
    }SHAPE;
    
    
    #if 1     //按钮栏在左边
      #define BUTTON_START_X      0
      #define PALETTE_START_X   (COLOR_BLOCK_WIDTH*2+1)
      #define PALETTE_END_X     LCD_X_LENGTH
    
    #else     //按钮栏在右边,(存在触摸按键时也会的bug仅用于测试触摸屏左边界)
      #define BUTTON_START_X     ( LCD_X_LENGTH-2*COLOR_BLOCK_WIDTH)
      #define PALETTE_START_X   0
      #define PALETTE_END_X     (LCD_X_LENGTH-2*COLOR_BLOCK_WIDTH)
    
    void Touch_Button_Init(void)//只列出部分button,button是按钮结构体数组
    {
      /*第一列,主要为颜色按钮*/
      button[0].start_x = BUTTON_START_X;
      button[0].start_y = 0;
      button[0].end_x = BUTTON_START_X+COLOR_BLOCK_WIDTH ;
      button[0].end_y = COLOR_BLOCK_HEIGHT;
      button[0].para = CL_BLACK;
      button[0].touch_flag = 0;  
      button[0].draw_btn = Draw_Color_Button ;
      button[0].btn_command = Command_Select_Color ;
      
      button[1].start_x = BUTTON_START_X;
      button[1].start_y = COLOR_BLOCK_HEIGHT;
      button[1].end_x = BUTTON_START_X+COLOR_BLOCK_WIDTH ;
      button[1].end_y = COLOR_BLOCK_HEIGHT*2;
      button[1].para = CL_GREY;
      button[1].touch_flag = 0;  
      button[1].draw_btn = Draw_Color_Button ;
      button[1].btn_command = Command_Select_Color ;
    //button结构体
    typedef struct 
    {
      uint16_t start_x;   //按键的x起始坐标  
      uint16_t start_y;   //按键的y起始坐标
      uint16_t end_x;     //按键的x结束坐标 
      uint16_t end_y;     //按键的y结束坐标
      uint32_t para;      //颜色按钮中表示选择的颜色,笔迹形状按钮中表示选择的画刷
      uint8_t touch_flag; //按键按下的标志
        
      void (*draw_btn)(void * btn);     //按键描绘函数
      void (*btn_command)(void * btn);  //按键功能执行函数,例如切换颜色、画刷
     
    }Touch_Button;
    
    //绘制函数
    /**
    * @brief  Draw_Color_Button 颜色按钮的描绘函数
    * @param  btn Touch_Button 类型的按键参数
    * @retval 无
    */
    static void Draw_Color_Button(void *btn)
    {
      Touch_Button *ptr = (Touch_Button *)btn;
      
      /*释放按键*/
      if(ptr->touch_flag == 0)
      {
    		/*背景为功能键相应的颜色*/
    		LCD_SetColors(ptr->para,CL_WHITE);
        ILI9806G_DrawRectangle(ptr->start_x,
                          ptr->start_y,
                          ptr->end_x - ptr->start_x,
    											ptr->end_y - ptr->start_y,1);
      }
      else  /*按键按下*/
      {
        /*白色背景*/
    		LCD_SetColors(CL_WHITE,CL_WHITE);
        ILI9806G_DrawRectangle(ptr->start_x,
                          ptr->start_y,
                          ptr->end_x - ptr->start_x,
    											ptr->end_y - ptr->start_y,1);
      } 
        /*按钮边框*/
    		LCD_SetColors(CL_BLUE4,CL_WHITE);
        ILI9806G_DrawRectangle(ptr->start_x,
    									ptr->start_y,
    									ptr->end_x - ptr->start_x,
    									ptr->end_y - ptr->start_y,0);
      
    }
    /**
     * @brief  在 ILI9806G 显示器上画一个矩形
     * @param  usX_Start :在特定扫描方向下矩形的起始点X坐标
     * @param  usY_Start :在特定扫描方向下矩形的起始点Y坐标
     * @param  usWidth:矩形的宽度(单位:像素)
     * @param  usHeight:矩形的高度(单位:像素)
     * @param  ucFilled :选择是否填充该矩形
      *   该参数为以下值之一:
      *     @arg 0 :空心矩形
      *     @arg 1 :实心矩形 
     * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
     * @retval 无
     */
    void ILI9806G_DrawRectangle ( uint16_t usX_Start, uint16_t usY_Start, uint16_t usWidth, uint16_t usHeight, uint8_t ucFilled )
    {
    	if ( ucFilled )
    	{
    		ILI9806G_OpenWindow ( usX_Start, usY_Start, usWidth, usHeight );
    		ILI9806G_FillColor ( usWidth * usHeight ,CurrentTextColor);	
    	}
    	else
    	{
    		ILI9806G_DrawLine ( usX_Start, usY_Start, usX_Start + usWidth - 1, usY_Start );
    		ILI9806G_DrawLine ( usX_Start, usY_Start + usHeight - 1, usX_Start + usWidth - 1, usY_Start + usHeight - 1 );
    		ILI9806G_DrawLine ( usX_Start, usY_Start, usX_Start, usY_Start + usHeight - 1 );
    		ILI9806G_DrawLine ( usX_Start + usWidth - 1, usY_Start, usX_Start + usWidth - 1, usY_Start + usHeight - 1 );		
    	}
    
    }
    
    
    展开全文
  • 与传统的机械式按键相比,电容式触摸感应按键不仅美观而且耐用、寿命长,它颠覆了传统意义上的机械按键控制,只要轻轻碰触,就可以实现对按键的开关控制、量化调节甚至方向控制,现在电容式触摸感应按键己广泛用于...
  • 主板对于一些爱好电脑的朋友应该都不陌生,主板又...电脑开机后显示器指示灯亮,但无信号输入,无自检声,键盘灯通电时一闪即灭,系统也不能正常启动运行。这个问题很是棘手,因为除了这个简单的现象,没有其他可以...
  • 电容分类的N种详解

    2019-10-21 22:10:35
    关注、星标公众号,不错过精彩内容前两天给大家分享了《》,今天的给大家分享关于电容的N种详解。一、瓷介电容器(CC)1.结构用陶瓷材料作介质,在陶瓷表面涂覆一层金属(银)薄...
  • 【热门】进口EPCOS电容器原厂品质 zxbr66z【热门】进口EPCOS电容器原厂品质 ARALA以太网收发器支持同步以太网提供恢复时钟输出数据网络线路一侧。他们有不同的优势标准运算放大器类型在单一的供应的应用程序。这...
  • CBB61是一种CBB电容,CBB是聚丙烯电容的意思,61是它的型号,它是一种普遍用于交流市电电源供电的单相电动机的起动和运转电容,我们称之为启动电容(有时候也称为电容)。在电动水泵,各种交流风扇、交流排气扇,...
  • Maxwell技术公司日前推出了两款24伏超级电容器发动机启动模块(ESM),高电压ESM改善了设备正常运行效率,并提升了供应客车以及工业车辆(如吊车、挖土机、推土机、平地机、摊铺机、越野载货车、移动式压缩机及其它柴油...
  • 详解常见的电容

    2021-10-16 15:38:49
    1:瓷介电容器 此电容器用陶瓷材料作介质,在陶瓷表面涂覆一层金属(银)薄膜,再经高温烧结后作为电极而成。瓷介电容器又分为1类电介质(NPO、CCG)、2类电介质(X7R、2X1)和3类电介质(Y5V、2F4)瓷介电容器。 ...
  • 电容屏驱动技术

    千次阅读 2016-04-08 10:28:20
    转自:http://www.cnblogs.com/lexuele/p/4689666.html目录一 电容屏介绍 二 input输入子系统三 mtk ctp 软件控制流程四 mtk平台调试ctp需要修改的地方 一、电容屏介绍介绍 1、电容式触摸屏的类型主要有两种: (1...
  • 有机薄膜电容

    2014-07-24 10:53:27
    有机薄膜电容器,又称金属化聚丙烯电容器。公司都主要以从事生产:CBB65 ,CBB61 ,CBB60 电容器为主
  • 一、电容式触摸屏检测原理 基本原理是利用充电时间检测电容大小,从而通过检测出电容值的变化来获知触摸信号。电容屏的最上层是玻璃(不会像电阻屏那样形变),核心层部分也是由ITO材料构成的,这些导电材料在屏幕里...
  • 有时会看到有一个电容量较大电解电容并联了一个小电容,这时大电容通低频,小电容通高频。电容的作用就是通高阻低,通高频阻低频。电容越大低频越容易通过,电容越大高频越容易通过。具体用在滤波中,大电容(1000uF)...
  • N种电容分类的详解

    2020-03-05 08:37:15
    一、瓷介电容器(CC) 1.结构 用陶瓷材料作介质,在陶瓷表面涂覆一层金属(银)薄膜,再经高温烧结后作为电极而成。瓷介电容器又分 1 类电介质(NPO、CCG) );2 类电介质(X7R、2X1)和 3 类电介质(Y5V...
  • 【硬见小百科】二十种电容分类详解! 一、瓷介电容器(CC) 【硬见小百科】二十种电容分类详解! 1.结构 用陶瓷材料作介质,在陶瓷表面涂覆一层金属(银)薄膜,再经高温烧结后作为电极而成。瓷介电容器又分 1 类电...
  • 材料:带线电风扇启动电容------- CBB 耐压450V---- 2.2uF 和1.5uF 数量 各2个以上,改刀一把,剪刀,电胶布 步骤:拆开电扇档位开关部位外壳;找到定时开关,用剪刀剥开两端导线外皮(不是剪断哦),接上电容...
  • 一、瓷介电容器(CC) 1.结构 用陶瓷材料作介质,在陶瓷表面涂覆一层金属(银)薄膜,再经高温烧结后作为电极而成。瓷介电容器又分 1 类电介质(NPO、CCG) );2 类电介质(X7R、2X1)和 3 类电介质(Y5V、2F4)瓷...
  • 电容分类的N种详解,有图有“真相” 电子发烧友网今天 一、瓷介电容器(CC) 1.结构 用陶瓷材料作介质,在陶瓷表面涂覆一层金属(银)薄膜,再经高温烧结后作为电极而成。瓷介电容器又分 1 类电介质(NPO...
  • 作者:ittbank,整理:晓宇微信公众号:芯片之家(ID:chiphome-dy)一、电容电容是电子设备中大量使用的电子元件之一,广泛应用于隔直,耦合, 旁路,滤波,调谐回路, 能...
  • 关注、星标公众号,直达精彩内容01瓷介电容器此电容器用陶瓷材料作介质,在陶瓷表面涂覆一层金属(银)薄膜,再经高温烧结后作为电极而成。瓷介电容器又分为1类电介质(NPO、CCG)、2类电介质...
  • 电脑启动不了怎么办 电脑无法启动的原因与解决办法发布时间:2012-09-29 16:06:00 作者:佚名 我要评论电脑无法启动怎么办?近期发现不少电脑用户在问这个问题,大部分使用电脑的朋友应该都遇到过电脑无法启动,并且...
  • STM32----电容触摸屏,OLED屏和LCD屏

    千次阅读 2019-07-27 21:01:30
    电容触摸屏 OLED屏 LCD屏 电容触摸屏 充放电电路原理: 电路充放电公式: 电容触摸按键原理: R:外接电容充放电电阻。 Cs:TPAD和PCB间的杂散电容。 Cx:手指按下时,手指和TPAD之间的电容。 ...
  • 有两种型号! IQS127D和IQS127S!IQS127D是双输出,一路输出为接近检测的输出,另一路为触摸检测的输出;而IQS127S则有一个用来保护天线上的信号的有源驱动屏蔽脚和一个输出脚(可配置为是接近输出还是触摸输
  • 晶振电路中如何选择电容C1,C2?

    万次阅读 2016-11-07 13:54:15
    晶振电路中如何选择电容C1,C2? (1):因为每一种晶振都有各自的特性,所以最好按制造厂商所提供的数值选择外部元器件。 (2):在许可范围内,C1,C2值越低越好。C值偏大虽有利于振荡器的稳定,但将会...
  • 一、瓷介电容器(CC)1.结构用陶瓷材料作介质,在陶瓷表面涂覆一层金属(银)薄膜,再经高温烧结后作为电极而成。瓷介电容器又分 1 类电介质(NPO、CCG));2 类电介质(X7R、2X1)和 3 类电介质(Y5V、2F4)瓷介...
  • 第5章 emWin上手之电阻触摸和电容触摸 本章教程为大家讲解LTDC应用之LCD电阻触摸芯片STMPE811的4点和2点触摸校准和电容触摸芯片FT5X06、GT911和GT811的使用。 目录 5.1 初学者重要提示 5.2 电阻触摸和电容触摸...
  • 第5章 ThreadX GUIX上手之电阻触摸和电容触摸 本章教程为大家讲解LTDC应用之LCD电阻触摸芯片STMPE811的4点和2点触摸校准和电容触摸芯片FT5X06、GT911和GT811的使用。 目录 第5章 ThreadX GUIX上手之电阻触摸和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,097
精华内容 1,238
关键字:

启动电容型号