基于TCUT1600X01的驱动实现分析

TCUT1600X01原理介绍
The TCUT1600X01 is a compact transmissive sensor that includes an infrared emitter and two phototransistor detectors, located face-to-face in a surface mount package.The tall dome design supports additional mechanical room for vertical signal encoding.
1.两个NPN扮演物理上的两个测试点,通过两个测试点的电平变化模拟按键滚轮的前后方向。
2.红外线控制NPN的基极,通过基极控制NPN导通,NPN的导通产生电压变化。
3.MCU根据接收到的电压变化产生中断。

机械结构介绍
1.机械结构为带有6个扇叶的圆盘,扇叶和空隙将圆盘分为12个区域,每个区域的角度为30°。
2.旋转滚轮的过程中红外线被周期遮挡,遮挡会使NPN出现低电平。
3.

roll up -> -> -> -> -> -> ->
1 1 0 0 1 1 0 0
0 1 1 0 0 1 1 0
roll down <- <- <- <- <- <- <-

软件设计介绍
1.两个回调函数分别代表两个硬件通道,每个硬件通道触发对应的中断事件
2.软件设计需要通过两个通道的高低电平变化去判断方向
3.通道1:

Eventtype2A()
{ bstateOfEncoder = InputA ^ InputB;
  switch(automateState)
{ 
  case wait_event:
  if(bstateOfEncoder == HIGH)
  {
    automateState = wait_event_b;
  }
  else
  {
  }
  break;
  
  case wait_event_b;
  if(bstateOfEncoder == LOW)
  {
    automateState = wait_event;
  }
  else
  {
  }
  break;
  
  case wait_event_a;
  if(bstateOfEncoder == LOW)
  {
    automateState = wait_event;
    absoluteStepValue--;
  }
  else
  {
    automateState = wait_event_b;
  }
  break;

  default:
  automateState = wait_event;
  break;
}
}

4.通道2:

Eventtype2B()
{ bstateOfEncoder = InputA ^ InputB;
  switch(automateState)
{ 
  case wait_event:
  if(bstateOfEncoder == HIGH)
  {
    automateState = wait_event_a;
  }
  else
  {
  }
  break;
  
  case wait_event_b;
  if(bstateOfEncoder == LOW)
  {
    automateState = wait_event;
    Eventtype2A()
{ bstateOfEncoder = InputA ^ InputB;
  switch(automateState)
{ 
  case wait_event:
  if(bstateOfEncoder == HIGH)
  {
    automateState = wait_event_b;
  }
  else
  {
  }
  break;
  
  case wait_event_b;
  if(bstateOfEncoder == LOW)
  {
    automateState = wait_event;
    absoluteStepValue++;
  }
  else
  {
    automateState = wait_event_a;
  }
  break;
  
  case wait_event_a;
  if(bstateOfEncoder == LOW)
  {
    automateState = wait_event;
  }
  else
  {
  }
  break;

  default:
  automateState = wait_event;
  break;
}
}
  }
  else
  {
  }
  break;
  
  case wait_event_a;
  if(bstateOfEncoder == LOW)
  {
    automateState = wait_event;
    
  }
  else
  {
    automateState = wait_event_b;
  }
  break;

  default:
  automateState = wait_event;
  break;
}
}

5.最好的表现形式是timing diagram。代码核心为 B先高电平后A低电平为负方向逻辑,A先高电平后B低电平为正方向逻辑。

fec97762bf79fc5b1e50e597e054a19

posted @ 2025-06-29 19:48  日暮_途远  阅读(21)  评论(0)    收藏  举报