ESP32:往MicroPython集成PCNT以支持硬件正交编码器

背景

官方发布的1.23依然没有在ESP32中集成PCNT功能。考虑到硬件的PCNT模块可以提供4倍的编码精度(对比使用PIn IRQ),还能提供硬件去毛刺。

还是自己集成一下吧。

实际上Github上早在2022年1月的时候就已经有人建议了将PCNT加入正式版本的功能里面,但是官方一直没有动作:

ESP32: Add Quadrature Encoder and Pulse Counter classes. by IhorNehrutsa · Pull Request #8766 · micropython/micropython (github.com)作者的代码在这个连接:

IhorNehrutsa/micropython at ESP32_PCNT_Encoder_Counter (github.com)

代码质量很高。但是考虑到IDF和MP的版本更新,我还是决定自己在新的发布版本中将这个功能加到里面。

差异性分析

在文件差异这里可以看到作者的代码和官方代码的差异性:

提一句,这个代码的使用说明和实际的代码是有差异(估计是后来改了一部分)的,需要去看源代码确认。

实际上需要改的就是ports/esp32下面的8个文件,而且machine_encoder.c和machine_encoder.h的两个代码是完全新增的,可以原作者那边下载回来;然后去micropython那边下载1.23的代码回来。

代码修改

对比是精确到行的,所以点开代码一个个该就好了,需要注意,有一些文件改的地方不止一处,别只改一处就算了,否则编译会大概率出错。

全部改好之后,编译一次。MP的编译最好在linux,笔者是在ubuntu,有很多相关的文章,我就不重复了。

//idf 环境变量
cd esp-idf
source export.sh
//编译mpy交叉交叉编译器
cd ~/micropython/mpy-cross
make
//配置板子信息
cd ~/micropython/ports/esp32
idf.py -D MICROPY_BOARD=ESP32_GENERIC_S3_R2N4 menuconfig
//编译
make BOARD=ESP32_GENERIC_S3_R2N4

注意安自己的实际条件改下board和path。我是直接买的ESP32-S3-R2FH4,集成2M PSRAM和4M FLASH的(主要是这个性价比高),所以我新建了一个板,和你想要的版本可能是不一样的。

然后就报错了(情理之中)。

第一个warning是说pcnt.h这个驱动快过期了,让你用pulse_cnt.h,实际上这个影响不大(我注释了这个include依然能过,问题是在STATIC,C的保留字应该是小写的 static。去看看官方的machine_pwm.c,用的也是static。那就在上面加一个宏定义好了:

这下就能编译出来了。

功能测试:

from machine import Encoder,Pin

encL = Encoder(0,
              phase_a = Pin(33,mode=Pin.IN),
              phase_b = Pin(34,mode=Pin.IN),
              x124=4,
              filter_ns = 10_000,
              );
encR = Encoder(1,
              phase_a = Pin(35,mode=Pin.IN),
              phase_b = Pin(36,mode=Pin.IN),
              x124=4,
              filter_ns = 10_000,
              );

while True:
    print (f'{encL.value()},{encR.value()}')
    import  time
    time.sleep(1)
    

代码直接使用了两个正交编码器,接入的是平衡车的左右电机的编码器。测试代码有效,可以识别正传反转,而且4x之后精度确实很高。

固件下载

【免费】ESP32S3MICROPYTHON1.23集成PCNT功能4MFLASH资源-CSDN文库

相关推荐

  1. esp32c6 micropython固件首发

    2024-06-09 14:08:03       22 阅读
  2. (五)ESP32基于MicroPython平台——IO口中断触发

    2024-06-09 14:08:03       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-09 14:08:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-09 14:08:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-09 14:08:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-09 14:08:03       18 阅读

热门阅读

  1. 力扣2799.统计完全子数组的数目

    2024-06-09 14:08:03       11 阅读
  2. lua中大数相乘的问题

    2024-06-09 14:08:03       11 阅读
  3. LeetCode 第401场周赛个人题解

    2024-06-09 14:08:03       12 阅读
  4. 二叉树的统一迭代法-前序中序后序-力扣

    2024-06-09 14:08:03       12 阅读
  5. Qt图表类介绍

    2024-06-09 14:08:03       9 阅读