如何在STM32上将绝对编码器输出转换为增量正交编码器输出?

时间:2019-12-04 03:57:30

标签: arduino stm32 gray-code

我有一个绝对编码器(Hengstler AC58编码器),它通过SSI协议(encoder datasheet)输出13位格雷码(单圈)。我正在尝试将此接口连接到我的STM32F303K8开发板。我的电路(尽管与该问题无关紧要)包括RS422驱动器(即SN75176BP差分驱动器/接收器)。因此,我可以将编码器与MCU之间所需的IO从4个(差分)信号(时钟+,时钟-,数据+,数据-)减少到两个(仅时钟和数据)。

MCU将为编码器提供350kHz时钟。从这里开始,随着时钟的每个上升沿从编码器中输出13个数据位。观察到一个单稳态触发器周期(大约20uS),以防止重新读取相同的数据。在每个单稳态触发器周期之后重复此过程(协议在数据手册中有更详尽的说明)。我当前的代码(理想情况下)将此数据转换为最大值为8192(2 ^ 13)的整数。因此,这个问题的范围仅限于将此值(或其他等效数据类型)转换为A,B和Z正交信号。

我已经在Mbed编译器中编写了一个框架代码(尚未测试),该代码将这13位格雷代码转换为二进制,然后转换为十进制。

我正在尝试通过尽可能少的修改将此接口连接到现有基础结构。现有的基础设施是一个FPGA(NI cRIO),我可以使用3个GPIO引脚。这3个GPIO已用于连接“传统”增量式编码器,它们分别输出A相,B相和Z索引。然后,FPGA将这些信号解释为速度/位置信息。基本上,我想避免更改FPGA代码,而是将绝对编码器的输出转换为FPGA已经可以解释的增量(正交)输出。我发现各种Arduino论坛似乎都在做类似的事情(see here)。我还设法找到了似乎合理的STM32变体(see here)。但是,这看起来很复杂而且有错误。

我是不是用这个主意树了错误的树?任何帮助将不胜感激。预先感谢!

NB:我也可以使用Arduino Nano,但是我不确定16MHz时钟是否足够快用于此应用程序。

0 个答案:

没有答案