完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
void HAL_tiM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{ if (htim->Instance == TIM4) { if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { ccr_cur = __HAL_TIM_GET_COMPARE(&htim4, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 0); //dbug 不能清零捕获计算器 dbug_data = __HAL_TIM_GET_COMPARE(&htim4, TIM_CHANNEL_1); //dbug 读取仍然为ccr_cur的值 。。。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。。。。。。。。 |
|
相关推荐
9个回答
|
|
你这个用法就是错的,根本没理解这两个函数的功能。
__HAL_TIM_SET_COMPARE()是设置CCRx,一般是用在PWM输出的,控制PWM占空比。 而__HAL_TIM_GET_COMPARE()是用来读取CCRx的,一般用于捕获处理。 你可能对捕获的过程不是很清楚。 捕获是当设定的事件(如上升沿)发生时,CNT的值被复制到CCRx中。 在使用捕获功能时,清零CCRx并没有什么意义,此时对CCRx的写入是无效的。 所以你调用__HAL_TIM_SET_COMPARE()就没有效果。 |
|
|
|
捕获的意思不是“跳变时间点”么,我的理解是这个返回的值是一个时间点,要拿到下一个跳变时间点才能获得脉宽,才算是完成捕获……是不是这样的?
|
|
|
|
你不调用函数,直接修改寄存器,然后再读寄存器看看。
|
|
|
|
电平跳变的时候 自动把定时器计数器time_cnt读取,并且放入捕获寄存器time_ccr。理论上应该是应该直接清零定时器计数器,调用__HAL_TIM_SET_COUNTER(&htim4, 0); 那么__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 0); 这个函数不知道起什么作用,看意思好像是清除捕获寄存器的值。 |
|
|
|
我的本意是让计数器从0重新计数。 应该是直接清除定时器的计数寄存器。 不知道__HAL_TIM_SET_COMPARE这个函数有什么用 |
|
|
|
zhuqunwei 发表于 2019-2-19 12:37 进去看下原函数就知道了,是不是强制比较啊,就是直接设置电平,强制产生一次中断,很多单片机的捕获都有这个功能,另外,清零就是直接给计数器清零 |
|
|
|
|
|
|
|
|
|
楼主解决没
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
使用stm32l451片子,对ad7606进行3通道100k采样值跳动问题?
436 浏览 1 评论
STM32进行DMA数据转运,为什么只有A组最后一位数据被转运到B组去?
1356 浏览 2 评论
1671 浏览 3 评论
1279 浏览 0 评论
嵌入式开发 Win11安装ST-Link 提示 设备描述符请求失败 怎么处理?
1411 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-20 05:20 , Processed in 0.665625 second(s), Total 60, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191