您的位置 首页 知识

使用电位计代替旋转开关设计方案

有时,基于微控制器的产品需要使用旋转开关。由于很多微控制器都内置了ADC,在找不到旋转开关或旋转开关价格过高时,可以使用低成本电位计来替代旋转开关(图1)。尽管仅需执行少量指令即可将电位计设定值数字化

  有时,依据微控制器的产品需求运用旋转开关。因为许多微控制器都内置了ADC,在找不到旋转开关或旋转开关价格过高时,能够运用低成本电位计来代替旋转开关(图1)。

  虽然仅需履行少数指令即可将电位计设定值数字化,使其体现得像开关相同,但一个急需解决的问题是,在电气噪声或机械噪声的影响下,在某一个值和下一个值之间的切换阈值处,数值会不稳定。该问题的解决办法是为每次转化引进上、下两个迟滞阈值,这样一来,电位计就需求在另一个开关状况有用前跳过阈值。针对每次更新的开关状况,都会有新的一对阈值替换之前的阈值。如此,迟滞效应能够完成各状况间的彻底切换。

  

  图1:代替多掷开关

  这一办法具有下述许多优势:单端口引脚对旋转开关的多端口引脚、成本低、更易取得且可完成去颤动切换。该办法的不足之处在于会失掉制动感。设定点的另一特性是其可设置在任一方位,例如用以补偿电位计在呼应过程中呈现的非线性改动。

  迟滞一般稍高于会导致不希望切换的任何噪声。主张在电位计触点与地之间设置一个%&&&&&%器,以滤除触点噪声(图1)。

  图2列出了算法。一旦用ADC对电位计设定值进行了数字化操作,该数值就将与下阈值比较,若低于下阈值,开关状况会逐步下降并约束至零。若电位计设定值高于上阈值,开关状况会逐步增大并约束至最大值。若开关状况发生改动,则上、下阈值会进行更新,并停止子程序。

  

  图2:流程图

  为保证该迟滞算法起作用,有必要定时读取电位计设定值,并与上一次开关状况进行比较。这样做旨在将从不同状况跨过阈值或处于相同值的电位计设定值与相同状况区分隔。

  此处还需求核算出采样率的最小值,可由电位计旋转率最大值除以开关状况数得到。例如,假定单匝电位计旋钮在0.25s内完好旋转一圈,一起假定有七种状况,那么最低扫描率为28Hz.若电位计数值采样周期低于最小值,即便切换方向正确,核算得出的开关状况也或许不正确。假使未以较快的速率继续改动电位计设定值,则随后的采样会对切换状况进行校对。

  以七种开关状况为例创立一个阈值列表。假定有一个8位ADC。首要,ADC的256步规模被分割为七种开关状况。各开关状况的宽度为ADC规模除以状况数,即:256/7=36.6.对其四舍五入,将各状况的宽度定为36,可是两个外端状况需添加至38,以使总宽度为256。

  下一步是确认各开关状况的鸿沟。关于状况0,鸿沟为0~37(包括两头)。状况1从38开端到73完毕,其他开关状况依此类推。依据添加或下降至鸿沟的迟滞数值确认阈值。此处运用4这一迟滞值。迟滞量既不得大于宽度,也不得低于预期的噪声。因而,上鸿沟加4即可得出上阈值,下鸿沟减4即可得出下阈值,如表1所示。从该例可发现,从状况2切换为状况1需求使电位计数值下降至比切换点数值74小4,因而下阈值为70。相反,从状况1切换为状况2需求使电位计数值上升至比切换点数值73高4,因而上限阈值为77。用于程序代码的表格仅需标明上、下阈值,在此例中仅需14个字节。

  表1 阈值

  

  代码示例(见下)支撑Silicon Labs的C8051F310(8051架构),但也能够很容易地改编用于其他微控制器。

  ;POT2SW INITIALIZATION

  MOV UPRVAL, #00H;set upper value to opposite end to force the code to run

  MOV LWRVAL, #0FFH;set lower value to opposite end to force the code to run

  MOV SWPOS, #03H;initialize switch position to middle

  MOV POSMAX, #06H;set maximum SWITCH position value

  ;SUBROUTINES

  POT2SW:;CALCULATE SWITCH POSITION VALUE FROM POTENTIOMETER VALUE IN ACC

  ;check if pot setting is below lower threshold

  CLR C

  MOV B, A ;save pot setting to register B

  SUBB A, LWRVAL;potval – lwrval

  JNC P2S1 ;no carry means potval >= lwrval

  DEC SWPOS ;carry means potval < lwrval, so decrement switch position value

  ;check if switch position is < zero

  MOV A, POSMAX;load maximum switch position value

  CLR C

  SUBB A, SWPOS;max switch value – switch position

  JNC P2S2

  MOV SWPOS, #00H;reset switch position value to zero since underflow

  SJMP P2S2

  P2S1: ;check if pot setting is above upper theshold

  CLR C

  MOV A, UPRVAL

  SUBB A, B ;uprval – potval

  JNC P2S2 ;no carry means potval <= uprval

  INC SWPOS ;carry means potval >uprval, so increment switch position value

  ;check if switch position is > max

  MOV A, POSMAX;load maximum xwitch position value

  CLR C

  SUBB A, SWPOS

  JNC P2S2

  MOV SWPOS, POSMAX;reset curve number to max curve value since overflow

  P2S2: ;read lower and upper thresholds using switch position value

  MOV A, SWPOS ;multiply switch position value by 2

  MOV B, #02H

  MUL AB

  MOV B, A ;save multiplied value as table offset

  MOV DPTR, #HYSTBL;load base address of table pointer

  MOVC A, @A+DPTR;look up table value from base address + offset

  MOV LWRVAL, A;read lower threshold value

  MOV A, B

  INC DPTR ;increment base address

  MOVC A, @A+DPTR

  MOV UPRVAL, A;read upper threshold value

  RET

  HYSTBL:;TABLE OF LOWER & UPPER THRESHOLDS FOR SEVEN POSITION SWITCH

  DB00D,41D;Switch state 0

  DB34D,77D;Switch state 1

  DB70D,113D;Switch state 2

  DB106D,149D;Switch state 3

  DB142D,185D;Switch state 4

  DB178D,221D;Switch state 5

  DB214D,255D;Switch state 6

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/241608.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部