本帖最后由 vdso.l 于 2024-8-29 22:31 编辑
时隔多日,终于有时间来填个坑,尝试将程序改成 PWM 硬件捕获方式。
一、翻阅STC8H手册,摘录PWM捕获相关信息
STC8H 系列的单片机内部集成了8通道16位高级PWM定时器,分成两组周期可不同的PWM,分别命名为 PWMA 和 PWMB。 以PWMA为例,摘出对此次PWM捕获有用的信息: 1)PWMA 有 PWMIP/PWM2P/PWM3P/PWM4P 这4路通道有捕获和测量脉宽功能 1.1)对外部信号进行捕获时,可选择上升沿捕获或者下降沿捕获 1.2)如果需要同时捕获上升沿和下降沿,则可将输入信号同时接入到两路PWM(比如:PWMIP/PWM2P),使能其中一路捕获上升沿,另外一路捕获下降沿即可,可同时捕获信号的周期值和占空比值 2)PWMA 计数时钟频率灵活可调,分频值可以是 1~65535 之间的任意值,可通过寄存器 PWMA_PSCRH 和 PWMA_PSCRL 配置,防止计数周期溢出
如图,红线部分为信号捕捉的路径配置:
1)让PWM1P通道的IC1捕捉PWM的上升沿(对应TI1FP1,PWMA_CCR1计数),计数间隔即为PWM周期长度T_period(T_on + T_off); 2)让PWM2P通道的IC2捕捉PWM的下降沿(对应TI1FP2,PWMA_CCR2计数),与上一次PWM1P的计数间隔即为PWM高电平长度T_on。 总结:是让PWM1P进来的TI1信号在滤波和边沿检测后分成两路,分别送给IC1、IC2(属于PWM2P链路的一环)去计数; 所以PWM2P在这里的作用,并不是其引脚输入,而是其部分链路被用来做PWM1P的“交叉通道”,实现对一路PWM信号的两种方式捕捉/计数
二、程序步骤规划
===================== 配置引脚 ===================== 1、【GPIO】配置PWMA输入捕获 PWM1P通道的引脚及模式(高阻输入),PWM1P -> P1.0 ===================== 配置链路 ===================== 2、【滤波器】设置PWMA_CCMR1的IC1F -> 滤波处理 3、【捕获选择】设置PWMA_CCER1的CC1P -> 捕获发生在TI1F的上升沿(对应TI1FP1),设置PWMA_CCER1的CC2P -> 捕获发生在TI1F的下降沿(对应TI1FP2) 4、【映射选择】设置PWMA_CCMR1的CC1S -> IC1映射到TI1FP1,设置PWMA_CCMR2的CC2S -> IC2映射到TI1FP2 这一步很关键,很容易看走眼~ 5、【从模式】从模式触发动作 -> 遇到TI1FP1, 复位计数器值(每次上升沿都能自动清零计数器,不用进中断,不用软件处理,提高效率) 6、【分频系数】设置 PWMA_CCMR1 的 IC1PSC,设置 PWMA_CCMR2 的 IC2PS 由于本程序不打算设置中断,所以采样需要密集一些 :)
===================== 使能捕捉和计数 ===================== 7、【使能捕获】设置 PWMA_CCER1 的 CC1E -> 使能 通道1 的输入捕获,设置 PWMA_CCER1的CC2E -> 使能 通道2 的输入捕获 8、【使能计数】设置PWMA_CR1的CENA -> 使能计数器
三、程序代码示意
四、测试用例上机验证
测出的频率和占空比与理论值基本吻合
五、总体感觉
好处是:相比之前的软件测量方法(查询法、中断法),代码简洁了一些;同时还能少一根数据线。
弊端是:涉及寄存器配置项较多,查阅手册花了不少时间,因为手册里把『输入、输出』的配置都合在一起写了,需要自己去梳理+刨去干扰信息;
接下来:再埋个坑,下次准备用『库函数』来重写下代码,相信程序的可读性会更好些。
回见~~
|