# 8.脉冲测量与校准实验 你好,我是小鱼,有了上节的理论,这一节我们编写代码来尝试下是否能够读取到电机上编码器的脉冲数,并通过实验测试出小车的输出轴转速和编码器脉冲的比值。 ## 一、新建工程并导入开源库 新建`example25_encoder` ![image-20230301220741662](8.%E8%84%89%E5%86%B2%E6%B5%8B%E9%87%8F%E4%B8%8E%E6%A0%A1%E5%87%86%E5%AE%9E%E9%AA%8C/imgs/image-20230301220741662.png) 添加依赖 ```ini [env:featheresp32] ; 这是一个环境配置标签,指定了代码将运行的硬件平台和框架 platform = espressif32 ; 指定了使用的平台为Espressif 32 board = featheresp32 ; 指定使用的硬件板为Feather ESP32 framework = arduino ; 指定使用的框架为Arduino lib_deps = ; 列出所有依赖库的URL,这些库将被下载和安装 https://github.com/fishros/Esp32PcntEncoder.git ; ESP32 编码器驱动库 ``` 这里我们使用的是`Esp32PcntEncoder`开源库,这个库调用了`ESP32`的脉冲计算外设进行编码器脉冲的计算,使用非常简单。 ## 二、代码实现 编写代码 ```cpp #include #include Esp32PcntEncoder encoders[2]; // 创建一个数组用于存储两个编码器 void setup() { // 1.初始化串口 Serial.begin(115200); // 初始化串口通信,设置通信速率为115200 // 2.设置编码器 encoders[0].init(0, 32, 33); // 初始化第一个编码器,使用GPIO 32和33连接 encoders[1].init(1, 26, 25); // 初始化第二个编码器,使用GPIO 26和25连接 } void loop() { delay(10); // 等待10毫秒 // 读取并打印两个编码器的计数器数值 Serial.printf("tick1=%d,tick2=%d\n", encoders[0].getTicks(), encoders[1].getTicks()); } ``` 上面这段代码使用了`ESP32PcntEncoder`库来读取两个旋转编码器的计数器数值。其中,函数`setup()`用于初始化串口和编码器;函数`loop()`用于读取并打印两个编码器的计数器数值。以下是代码的详细解释: 1. 首先包含了两个头文件`Arduino.h`和`Esp32PcntEncoder.h`,用于编写`Arduino`程序和使用`ESP32PcntEncoder`库。 2. 在全局变量中创建了一个长度为2的`Esp32PcntEncoder`数组,用于存储两个编码器。 3. 函数setup()用于初始化串口和编码器。在本代码中,首先通过`Serial.begin()`函数初始化串口,设置通信速率为`115200`。然后通过`encoders[0].init()`和`encoders[1].init()`函数分别初始化了两个编码器。其中,函数init()需要传入三个参数,分别是编码器的`ID`、引脚A的`GPIO`编号和引脚B的`GPIO`编号。在本代码中,第一个编码器的`ID`为`0`,引脚A连接的`GPIO`为`32`,引脚B连接的`GPIO`为`33`;第二个编码器的`ID`为`1`,引脚A连接的`GPIO`为`26`,引脚B连接的`GPIO`为`25`。 4. 函数loop()用于读取并打印两个编码器的计数器数值。在本代码中,首先通过delay()函数等待10毫秒。然后通过`encoders[0].getTicks()`和`encoders[1].getTicks()`函数分别读取了两个编码器的计数器数值。最后通过`Serial.printf()`函数将这两个数值打印。 ## 三、下载测试 将代码下载进入开发板,打开串口监视器,查看输出。 ![image-20230302013218396](8.%E8%84%89%E5%86%B2%E6%B5%8B%E9%87%8F%E4%B8%8E%E6%A0%A1%E5%87%86%E5%AE%9E%E9%AA%8C/imgs/image-20230302013218396.png) ## 四、脉冲/圈计算 为了计算一个脉冲轮子前进的距离,我们可以通过手动将轮子旋转10圈,然后利用前面的公式进行计算。 这里小鱼将轮子转动10圈后得到脉冲数为`19419`,也就是说当前电机1941.8个脉冲/圈 ![image-20230302013559003](8.%E8%84%89%E5%86%B2%E6%B5%8B%E9%87%8F%E4%B8%8E%E6%A0%A1%E5%87%86%E5%AE%9E%E9%AA%8C/imgs/image-20230302013559003.png) 根据公式可以算出,一个脉冲轮子前进的距离为 $$ D = 65*PI/(19419/10)\\ =0.1051566 $$ 接着我们可以利用公式计算速度。