基于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低电平为正方向逻辑。


浙公网安备 33010602011771号