本帖最后由 DebugLab 于 2024-9-13 09:32 编辑
此实验涉及 PWMA 的『基本功能、双通道捕获、主从模式』等知识点。
注:相关内容之前有写在《【学习打卡】8H8K64U 基于面包板的最小系统 - 简易电容测试仪》回复中
不过似乎被『淹没』了。。。
为了便于交流,特此单独发个帖 
1、翻阅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信号的两种方式捕捉/计数
2、程序步骤规划
===================== 配置引脚 ===================== 2.1、【GPIO】配置PWMA输入捕获 PWM1P通道的引脚及模式(高阻输入),PWM1P -> P1.0 ===================== 配置链路 ===================== 2.2、【滤波器】设置PWMA_CCMR1的IC1F -> 滤波处理 2.3、【捕获选择】设置PWMA_CCER1的CC1P -> 捕获发生在TI1F的上升沿(对应TI1FP1),设置PWMA_CCER1的CC2P -> 捕获发生在TI1F的下降沿(对应TI1FP2) 2.4、【映射选择】设置PWMA_CCMR1的CC1S -> IC1映射到TI1FP1,设置PWMA_CCMR2的CC2S -> IC2映射到TI1FP2 这一步很关键,很容易看走眼~ 2.5、【从模式】从模式触发动作 -> 遇到TI1FP1, 复位计数器值(每次上升沿都能自动清零计数器,不用进中断,不用软件处理,提高效率) 2.6、【分频系数】设置 PWMA_CCMR1 的 IC1PSC,设置 PWMA_CCMR2 的 IC2PS 由于本程序不打算设置中断,所以采样需要密集一些 :)
===================== 使能捕捉和计数 ===================== 2.7、【使能捕获】设置 PWMA_CCER1 的 CC1E -> 使能 通道1 的输入捕获,设置 PWMA_CCER1的CC2E -> 使能 通道2 的输入捕获 2.8、【使能计数】设置PWMA_CR1的CENA -> 使能计数器
3、程序代码示意
4、测试用例上机验证
测出的频率和占空比与理论值基本吻合
5、总体感觉
优点是:相比之前的软件测量方法(查询法、中断法),代码简洁了一些;同时还能少一根数据线。
难点是:涉及寄存器配置项较多,查阅手册花了不少时间;另外手册里把『输入、输出』的配置都合在一起写了,需要自己去梳理+刨去干扰信息。
谢谢观看~~
|