OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6242|回复: 6

关于定时器输出比较(OC_CH1和OC_CH2N)的使用问题?

[复制链接]

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
发表于 2022-4-12 16:24:03 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 chenyuan 于 2022-4-12 16:42 编辑

背景:在关闭定时器1通道2中断,然后在开启其中断时,发现输出的波形有杂波,如图1,
在图1中,第2 3 端口配置的是定时器1-CH1和CH2N,然后先是关闭定时器1对应通道的中断,然后在开启对应中断
对应函数:
  1. HAL_TIM_OC_Stop_IT(&htim1, TIM_CHANNEL_1);   
  2. HAL_TIMEx_OCN_Stop_IT(&htim1, TIM_CHANNEL_2);//该引脚配置的是  TIM1_CH2N

  3. HAL_TIM_OC_Start_IT(&htim1, TIM_CHANNEL_1);
  4. HAL_TIMEx_OCN_Start_IT(&htim1, TIM_CHANNEL_2);//该引脚配置的是  TIM1_CH2N
复制代码
结果发现,重新开启后会出现杂波。

测试:

1.为此 我在关闭前设置比较值为0,然后在关闭,然后在开启前设置比较值0,再开启。
2.当我一直不开启CH2N的中断,出现的波形无杂波(参考图1,端口3一直为低电平,其他的端口正常,开关中断无杂波)

但是还是一样会有杂波

我以为会是我工程中其他的影响到的,然后我重新创建了一个工程,配置定时器1的几个通道(创建了两个工程,一个工程是定时器1的CH1 CH2 CH3 CH4,另一个工程是定时器1的CH1 CH2N CH3 CH4),如图2
对比两个工程,发现就引脚配置有区别,其他的都是一样的,初步判断CH1和CH2N没有什么区别。

3.在新建的工程中,我让CH2N定时开关中断,CH1一直开启中断,然后在中断回调函数中对CH2N的比较值进行修改(让其在20ms的周期,输出1.52ms的高电平)
新建工程采集的现象如图3(也会有杂波)
新建工程的重要代码:
  1. while (1)
  2.   {
  3.     /* USER CODE END WHILE */

  4.     /* USER CODE BEGIN 3 */
  5.     cnt_ch2n++;
  6.   if(cnt_ch2n>10)
  7.   {
  8.   if(flag==0){
  9.     flag=1;

  10. //    HAL_TIM_OC_Start_IT(&htim1, TIM_CHANNEL_1);
  11. //    HAL_TIM_OC_Start_IT(&htim1, TIM_CHANNEL_4);
  12. //    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0);
  13.      HAL_TIMEx_OCN_Start_IT(&htim1, TIM_CHANNEL_2);//该引脚配置的是  TIM1_CH2N
  14.    
  15.   }
  16.   else if(flag==1)
  17.   {
  18.     flag=0;
  19. //    while(HAL_GPIO_ReadPin(CH3_GPIO_Port, CH3_Pin)==GPIO_PIN_SET){}
  20. //     __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0);
  21. //    HAL_TIM_OC_Stop_IT(&htim1, TIM_CHANNEL_1);   
  22. //    HAL_TIM_OC_Stop_IT(&htim1, TIM_CHANNEL_4);
  23.    HAL_TIMEx_OCN_Stop_IT(&htim1, TIM_CHANNEL_2);//该引脚配置的是  TIM1_CH2N
  24.   
  25.   }
  26.   cnt_ch2n=0;
  27.   }
  28.   HAL_Delay(50);
  29.   }



  30. void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
  31. {
  32.   
  33.   if(pwmflag == 1)//pwm标记  默认为1
  34.                 {
  35.                         if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14) == GPIO_PIN_RESET)//读取该定时器对应引脚电平
  36.                         {
  37.                                 TEMP =  __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_2) + 100;//刚开始执行一次 为了快速进入周期变化
  38.                                 pwmflag = 1;                        
  39.                                 TEMP = (TEMP>TIM_PERIOD) ? (TEMP-TIM_PERIOD) : (TEMP);//比较值大于重装载值 减去重装载值
  40.                                 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2,TEMP);        //设置比较值                        
  41.                         }
  42.                         else
  43.                         {
  44.                                         TEMP =__HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_2) + (4864);//(高电平时间)2048是4096分辨率的中心值 4864是中点的比较值  64000*1.52/20=4864  (1.52是舵机中点的占空比 20是波形周期)
  45.                                 pwmflag = 0;
  46.                                 TEMP = (TEMP>TIM_PERIOD) ? (TEMP-TIM_PERIOD) : (TEMP);//比较值大于重装载值 减去重装载值
  47.                                 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, TEMP);        //设置比较值        
  48.                         }
  49.                 }                        
  50.                 else if(pwmflag == 0)
  51.                 {
  52.                                 TEMP =        __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_2) + (64000-(4864));//设置比较值,保证周期一定,为timch->period(低电平时间)
  53.                         TEMP = TEMP > TIM_PERIOD ? TEMP - TIM_PERIOD : TEMP;//比较值大于重装载值 减去重装载值
  54.                         __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, TEMP);               
  55.                  pwmflag = 1;
  56.                 }
  57.                
  58. }
复制代码

关于测试工程见附件,
同时测试发现,在同时关闭或开启定时器1-CH1和CH2N的中断时,没有出现杂波

请问各位大佬有知道是怎么回事的吗?

有碰到过这种现象吗?
谢谢啦!


图3.png
图2.png
图1.png

time1.rar

7.5 MB, 下载次数: 0

最佳答案

查看完整内容[请看2#楼]

这个问题,目前的解决方法是 () 这样就是输出PWM波完成后,在关闭,避免了PWM还在输出高电平时,突然关闭定时器,从而造成杂波 缺点就是可能不是立刻就关闭了定时器输出,如在输出高电平时,假设我让点击按键,让其关闭输出,可能还会输出一个波形才会再关闭
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2022-4-12 16:24:04 | 显示全部楼层
这个问题,目前的解决方法是
(
  1. while(1)
  2. {
  3. if((上次关闭了定时器输出) &&(读取该端口电平==低))
  4. {
  5. 进行开启定时器输出
  6. }
  7. if((上次开启了定时器输出) &&(读取该端口电平==低)&&(关闭模式))
  8. {
  9. 设置比较值为最大
  10. 进行关闭定时器输出
  11. }
  12. }
复制代码
)

这样就是输出PWM波完成后,在关闭,避免了PWM还在输出高电平时,突然关闭定时器,从而造成杂波
缺点就是可能不是立刻就关闭了定时器输出,如在输出高电平时,假设我让点击按键,让其关闭输出,可能还会输出一个波形才会再关闭
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2022-4-13 15:38:22 | 显示全部楼层
顶.........
回复

使用道具 举报

14

主题

821

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2070
金钱
2070
注册时间
2021-7-17
在线时间
647 小时
发表于 2022-4-13 15:54:14 | 显示全部楼层
帮顶   
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2022-4-14 23:40:53 | 显示全部楼层
有可能是由于初始阶段,值不确定导致的异常。
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2022-4-15 09:33:16 | 显示全部楼层
正点原子 发表于 2022-4-14 23:40
有可能是由于初始阶段,值不确定导致的异常。

刚开始我也是怀疑这个,所以测试步骤:

等待端口输出电平为低
设置比较值为0
关闭定时器中断
..
设置比较值为0
开始定时器中断
但是结果:还是有杂波(而且就端口2 3有杂波(这是用的的定时器1,端口2-->定时器CH1,端口3-->定时器CH2N),其他端口输出没出现杂波(用的其他定时器输出))

后面还测试在开启定时器中断前,将定时器的计数值也赋0,还是一样会出现;

但是单独只开启一个时,关闭开启未出现杂波,如:
定时器1->CH1一直关闭中断,然后定时器1->CH2N周期性关闭或开启中断,没有杂波,或
定时器1->CH2N一直关闭中断,然后定时器1->CH1周期性关闭或开启中断,没有杂波
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2022-4-15 22:57:43 | 显示全部楼层
chenyuan 发表于 2022-4-15 09:33
刚开始我也是怀疑这个,所以测试步骤:

等待端口输出电平为低

可以单步仿真,用示波器,看下是哪行代码开始出现的问题
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 22:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表