#include "zf_common_headfile.h" // 打开新的工程或者工程移动了位置务必执行以下操作 // 第一步 关闭上面所有打开的文件 // 第二步 project->clean 等待下方进度条走完 // *************************** 例程硬件连接说明 *************************** // 使用逐飞科技 CMSIS-DAP 调试下载器连接 // 直接将下载器正确连接在核心板的调试下载接口即可 // 使用 USB-TTL 模块连接 // 模块管脚 单片机管脚 // USB-TTL-RX 查看 zf_common_debug.h 文件中 DEBUG_UART_TX_PIN 宏定义的引脚 默认 P00_1 // USB-TTL-TX 查看 zf_common_debug.h 文件中 DEBUG_UART_RX_PIN 宏定义的引脚 默认 P00_0 // USB-TTL-GND 核心板电源地 GND // USB-TTL-3V3 核心板 3V3 电源 // 接入编码器1连接 // 模块管脚 单片机管脚 // A ENCODER_QUADDEC_A 宏定义的引脚 默认 P05_0 // B ENCODER_QUADDEC_B 宏定义的引脚 默认 P05_1 // GND 核心板电源地 GND // 3V3 核心板 3V3 电源 // 接入编码器2连接 // 模块管脚 单片机管脚 // LSB ENCODER_DIR_PULSE 宏定义的引脚 默认 P02_0 // DIR ENCODER_DIR_DIR 宏定义的引脚 默认 P02_1 // GND 核心板电源地 GND // 3V3 核心板 3V3 电源 // *************************** 例程测试说明 *************************** // 1.核心板烧录完成本例程,单独使用核心板与调试下载器或者 USB-TTL 模块,并连接好编码器,在断电情况下完成连接 // 2.将调试下载器或者 USB-TTL 模块连接电脑,完成上电 // 3.电脑上使用串口助手打开对应的串口,串口波特率为 zf_common_debug.h 文件中 DEBUG_UART_BAUDRATE 宏定义 默认 115200,核心板按下复位按键 // 4.可以在串口助手上看到如下串口信息: // ENCODER_1 counter x . // ENCODER_2 counter x . // 5.转动编码器就会看到数值变化 // 如果发现现象与说明严重不符 请参照本文件最下方 例程常见问题说明 进行排查 // **************************** 代码区域 **************************** #define PIT0 (PIT_CH0 ) // 使用的周期中断编号 #define ENCODER1 (TC_CH09_ENCODER) // 编码器接口 #define ENCODER1_QUADDEC_A (TC_CH09_ENCODER_CH1_P05_0) // A引脚 #define ENCODER1_QUADDEC_B (TC_CH09_ENCODER_CH2_P05_1) // B引脚 #define ENCODER2 (TC_CH07_ENCODER) // 编码器接口 #define ENCODER2_QUADDEC_A (TC_CH07_ENCODER_CH1_P02_0) // A引脚 #define ENCODER2_QUADDEC_B (TC_CH07_ENCODER_CH2_P02_1) // B引脚 int16 encoder_data_dir[2] = {0}; uint8 pit_state = 0; int main(void) { clock_init(SYSTEM_CLOCK_160M); // 时钟配置及系统初始化<务必保留> debug_info_init(); // 调试串口信息初始化 // 此处编写用户代码 例如外设初始化代码等 encoder_dir_init(ENCODER1, ENCODER1_QUADDEC_A, ENCODER1_QUADDEC_B); // 初始化编码器模块与引脚 带方向增量编码器模式 encoder_dir_init(ENCODER2, ENCODER2_QUADDEC_A, ENCODER2_QUADDEC_B); // 初始化编码器模块与引脚 带方向增量编码器模式 // pit_ms_init(PIT0, 500); // 初始化 PIT0 为周期中断 100ms 周 // 此处编写用户代码 例如外设初始化代码等 while(true) { // 此处编写需要循环执行的代码 system_delay_ms(100); encoder_data_dir[0] = encoder_get_count(ENCODER1); encoder_clear_count(ENCODER1); encoder_data_dir[1] = encoder_get_count(ENCODER2); encoder_clear_count(ENCODER2); printf("ENCODER_1 counter \t\t%d .\r\n", encoder_data_dir[0]); // 输出编码器计数信息 printf("ENCODER_2 counter \t\t%d .\r\n", encoder_data_dir[1]); // 输出编码器计数信息 // 此处编写需要循环执行的代码 } }我是计算机小白,帮我详细解释,每一步回答为什么这么做,怎么做,每一个函数中未知量代表了什么,并且搞出图形让我更好的明白,以及相关知识的阐述
时间: 2025-03-22 14:06:39 浏览: 88
这是一个基于单片机的编码器控制程序示例。接下来我会尽量详细地为您解析每一部分的功能、原因及其背后的原理。
### **概述**
该代码是一个简单的双通道编码器驱动和读取数据的例子,它通过定时器(PIT)来定期获取两个编码器的状态,并打印到串口上显示出来。以下是详细的分步骤解析:
---
#### **一、头文件包含**
```c
#include "zf_common_headfile.h"
```
**为什么要这样做?**
这是引入库文件的过程。`zf_common_headfile.h` 可能包含了各种基础功能宏定义和辅助工具函数声明,比如寄存器地址映射表、通用I/O配置等等。如果没有这个文件,则后续调用的所有与硬件相关的 API 函数都无法正常工作。
**怎么做的?**
在项目创建之初就应确定好所使用的设备型号及相应的固件库版本,并将其路径添加至 IDE 的搜索目录列表内即可自动找到对应头文件。
---
#### **二、注释说明 - 工程设置指南**
这部分给出了关于如何正确建立新项目的指引,包括清理旧资源的操作提示(`project -> clean`)以及具体的连线方式指导。
**为什么要做这些准备动作呢?**
为了防止残留的历史记录干扰当前任务运行状态;同时明确标出了各个传感器应该接到哪根针脚上去,确保物理层面上的数据交换能够顺利进行.
---
#### **三、关键变量 & 配置选择项**
- `#define PIT0 (PIT_CH0)`
表示选用第一个周期性中断源(PIT Channel 0).
- 其他类似结构如:`ENCODER1`, `ENCODER1_QUADDEC_A/B`...
它们分别指定了用于检测脉冲信号的具体GPIO端口号位置信息.每个都有默认值设定在那里供参考使用.
> 图解略去复杂电路细节仅展示逻辑关联部分.
>
> 
上述图像简明扼要体现了两组独立工作的AB相正交编码输入线路布局形式.
| 实际管脚 | 功能描述 |
|----------|------------------------------|
| P05_0 | Encoder1 A channel |
| P05_1 | Encoder1 B channel |
| ... | Similarly defined elsewhere...|
---
#### **四、主流程分析**
##### **初始化阶段**
首先设置了系统的基准频率:
``` c++
clock_init(SYSTEM_CLOCK_160M);
```
然后开启了一个调试专用通信信道:
```cpp++
debug_info_init();
```
紧接着针对两只实际存在的机械旋转组件完成了必要的前期准备工作——即所谓的"实例化":
``` cpp++
encoder_dir_init(ENCODERx,...);
```
这里 x 分别等于 1 和 2 。每一次都会绑定一对特定 IO 引脚组合形成闭环监测回路 , 并启动内部计算机制捕捉每次转动产生的变化情况。
##### **无限循环处理段落**
在这个不断重复执行的过程中实现了以下几件事 :
1. 暂停片刻以便其他后台进程有机会获得 CPU 时间分配 :
``` cpp++
system_delay_ms(100);
```
2. 查询最近一段时间内的累计增量并归零计数器以备下次测量:
``` cpp++
encoder_data_dir[x] = encoder_get_count(...);
encoder_clear_count(...);
```
3. 利用 UART 发送最新采集结果给人观察确认:
``` cpp++
printf("...");
```
整个过程简洁高效易于维护扩展性强!
---
#### **五、总结思考及相关知识点推荐学习内容**
我们已经完整了解了一款典型的小型嵌入式系统是如何组织起来完成指定使命的任务架构设计思路。下面给出一些额外的学习建议帮助进一步深化理解掌握核心技术要点。
阅读全文
相关推荐



















