请教一下AI8H2K32U的T11定时器问题
想用T11做外部计数用,用来采集风扇的转速,最高速度大概在160Hz。不需要中断,一秒查询一次,发现哪怕停止计数功能,每次进入都会有8个脉冲,这是怎么回事?代码如下:
T11H=0;
T11L=0;
T11CR =0xc0; //定时器11用于对风扇转速计数
每秒查询一次,查询完就会将T11H和T11L置0。
您好,
关于您在使用国芯AI8H2K32U芯片的T11定时器进行外部计数,采集风扇转速时遇到的问题,我将从硬件配置、计数原理、可能干扰源及解决方案等方面进行分析,并提出改进建议。
一、问题描述回顾
您希望使用T11定时器作为外部计数器,用于采集风扇转速信号(最大频率约160Hz),每秒读取一次计数值并清零。在测试过程中发现,即使关闭了计数功能(即停止定时器),每次读取时仍会“残留”8个计数脉冲。此现象与预期不符,可能存在信号干扰、配置不当或硬件行为理解偏差等问题。
二、T11定时器功能简述
根据AI8H2K32U的参考手册,T11为16位可编程定时器/计数器模块,支持以下几种工作模式:
定时模式(内部时钟源)
计数模式(外部输入引脚提供时钟)
PWM输出模式
输入捕获模式
您当前配置为外部计数模式,即通过T11CLK引脚(或指定引脚)输入的外部信号进行递增计数。配置语句如下:
c
T11CR = 0xc0;
该配置的含义如下(根据手册):
T11CR = 0b11:选择外部时钟源(计数模式)
T11CR:可能为预分频设置或其它控制位,具体请参考数据手册
三、问题分析
1. 计数器未真正停止
即使您认为已“关闭”了计数功能,但若未正确配置T11CR寄存器来停止计数器,其仍可能继续运行。例如:
若只是清除了T11H和T11L,但T11CR未修改为停止状态,则计数仍在继续。
若T11CR仍为外部时钟源模式(如0b11),则计数器仍在对输入信号计数。
建议操作顺序应为:
c
T11CR = 0x00; // 先停止计数器
T11H = 0;
T11L = 0;
然后再根据需要重新启动计数。
2. 外部信号存在干扰或毛刺
即使风扇停止转动,其输出的霍尔信号或光栅信号可能仍存在:
机械抖动:风扇停转时,霍尔元件可能因磁场残留或机械振动产生误触发。
电气噪声:外部信号线上存在干扰,可能被误判为有效脉冲。
未使用硬件消抖:许多MCU提供输入滤波或消抖机制,若未启用,可能导致误计数。
建议措施:
在硬件上加入RC低通滤波器或施密特触发器,对输入信号进行整形。
启用芯片内部的输入滤波功能(如有)。
软件上可做简单的去抖判断,例如两次采样间隔中变化小于一定次数则视为无效。
3. 定时器读写时序问题
在16位定时器读写过程中,若操作顺序不当,可能导致读取不一致或写入失败。例如:
先读写T11H,再读写T11L,可能导致读取到不一致的值(如高位更新而低位未更新)。
清零操作应在计数器停止后进行,否则可能清零失败。
建议采用如下标准流程:
```c
// 停止计数
T11CR = 0x00;
// 读取计数值
count = (T11H
[本文内容由国芯人工智能辅助生成,仅供参考] 干扰的问题肯定是可以排除了,现在就算拔掉风扇,数字为8,依然有值,这个就明显不对了,电路图如下,风扇的第三脚内部实际是一个三极管开路输出。
程序如下:
未复现,上传可复现问题工程看看
ercircle 发表于 2025-10-21 16:08
未复现,上传可复现问题工程看看
原简单的测试工程文件。
深山老妖 发表于 2025-10-21 19:45
原简单的测试工程文件。
未见停止1s重新读数测试代码?使用上面传的例程是否可复现呢?
ercircle 发表于 2025-10-21 20:00
未见停止1s重新读数测试代码?使用上面传的例程是否可复现呢?
用上面的例程,在我的板子上是可以复现的。 深山老妖 发表于 2025-10-21 21:35
用上面的例程,在我的板子上是可以复现的。
录个像看看,另外示波器看下捕获Pin实际电平。
上传完整原理图?
换核心板试试?
ercircle 发表于 2025-10-21 23:17
录个像看看,另外示波器看下捕获Pin实际电平。
上传完整原理图?
直接上完整的PCB文件。
页:
[1]