编码电位器驱动原理

脉冲电位器的工作原理

从外观看,脉冲电位器与普通电位器一样都是三个引脚,但在其内部与引脚12相连的是两个长短不一的金属静片,与引脚3相连的是一周有1224个齿的金属动片。当脉冲电位器旋转时可出现四种状态:即引脚3与引脚1相连,引脚3与引脚2及引脚1全相连;引脚3与引脚2相连,引脚3与引脚2及引脚1全断开。

在实际使用中,一般将引脚3接地作为数据输入端。而引脚12作为数据输出端与单片机I/O 口相连。如图2中所示,将引脚1与单片机的P1.0相连,引脚2与单片机的P1.1相连。当脉冲电位器左旋或右旋时,P1.0P1.1就会周期性地产生图1所示的波形,如果是12点的脉冲电位器旋转一圈就会产生12组这样的波形,24点的脉冲电位器就会产生24组这样的波形;一组波形(或一个周期)包含了4个工作状态。因此只要检测出P1.0P1.1的波形,就能识别脉冲电位器是否旋转是左旋还是右旋。

 

脉冲电位器接口编程方法

1.脉冲电位器旋转的识别

进一步分析右的波形并按时间轴展开可以看出,虽然脉冲电位器左旋和右旋的波形都相同。但左旋时,在第1状态,脚1先比脚2变为低电平;在第2状态,脚2也变为低电平;在第3状态,脚1先比脚2变为高电平;在第4状态,脚2也变为高电平;脉冲电位器右旋时,脚1和脚2输出波形的变化规律正好与左旋相反。故可根据时间识别法(比较P1.0P1.1低电平出现和结束的时差)来识别脉冲电位器是左旋还是右旋。

在动态扫描中,因采样频率操作速度等因素的影响,实际上很难测出P1.0P1.1的波形;也很难测准P1.0P1.1低电平出现和结束的时差,只能快速地对P1.0P1.1电平采样。对应图1所示波形按时间轴展开,每当P1.0P1.1的组合电平依次为01 00 10 11四种状态码组成一个字节即4BH 时,就表示左旋一位音量减1。而每当P1.0P1.1的组合电平依次为10 00 01 11四种状态码组成一个字节即87H时;就表示右旋一位音量加1.这里将“4BH”称为左旋一位的特征码,“87H”称为右旋一位的特征码。编程的任务就是要在脉冲电位器旋转过程中识别出这两种特征码,并以此为依据,对音量进行增减控制。实际编程时可以用不同的方法识别出这两种特征码。但我们在实践中经过比较,用状态(位置)采样法实现编程是较为理想的一种方法。这种方法对采样频率和操作速度没有特别要求,也可不用定时器和中断资源,只需在主程序里面就能完成,而且具有编程简单抗干扰能力强工作可靠的优点。

由于脉冲电位器在工作过程中有三种情形:一是没有被旋转而停留在某一状态(位置);二是虽然被旋转但没有完成一个周期(4个状态)而停留在某一状态;三是不停地被旋转而超过一个周期。状态(位置)采样法就是要准确地跟踪识别和记录脉冲电位器变化的每一个状态值(包括位置值和它对应的特征码)。程序一开始就要识别出脉冲电位器所处的现态位置和其对应的特征码;随后不断跟踪扫描记录脉冲电位器的每一变化过程。显然,脉冲电位器只有旋转到第4个状态才有一个我们所需要的特征码出现,程序根据这个特征码的性质再对音量进行加减控制。
2.根据以上原理进行,我自己写的代码
进入代码的时间片我约定的是1ms,也可以更快,Shuttle_Key_IO是采样引脚1和引脚2
可以中断,可以主程序轮训,通过四个步骤
-引脚1和引脚2全是高电平,复位后,刚开始默认状态
-当手动旋转的时候,出现引脚1和引脚2高、低电平状态
引脚1高引脚2低:表示左转
引脚2低引脚1高:表示右转
-当出现引脚1和引脚2全是低电平
表示当前旋转状态稳定
-引脚1和引脚2全是高电平,又恢复到复位状态,准备新的采样的到来


以下的代码是通过四个步骤,最终采样到一次旋钮动作
switch(Shuttle_Key_IO)
 {
  case 0:
         switch( Shuttle_Key_buf)
{                 
 case 2:
    if((*Key_Data) > data3)
 (*Key_Data)--;
else
{
 (*Key_Data) = data4;
                  back_data=2;
 } 
                 break;    
          case 1:
    if((*Key_Data) < data1)
 (*Key_Data)++;
else
{
     (*Key_Data) = data2;
                  back_data=1;
 } 
                 break;
 default:break;
}
         Shuttle_Key_buf =0x0F;
         break;
  case 1: 
  case 2:
         if(Shuttle_Key_buf==0xFF)
          Shuttle_Key_buf = Shuttle_Key_IO;
         break;
  case 3:
         Shuttle_Key_buf =0xFF;break;
  default:break; 
 }

发布了67 篇原创文章 · 获赞 13 · 访问量 37万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章