金牌会员
 
- 积分
- 2357
- 金钱
- 2357
- 注册时间
- 2019-10-29
- 在线时间
- 380 小时
|
10金钱
本帖最后由 chenyuan 于 2022-4-12 16:42 编辑
背景:在关闭定时器1通道2中断,然后在开启其中断时,发现输出的波形有杂波,如图1,
在图1中,第2 3 端口配置的是定时器1-CH1和CH2N,然后先是关闭定时器1对应通道的中断,然后在开启对应中断
对应函数:
- HAL_TIM_OC_Stop_IT(&htim1, TIM_CHANNEL_1);
- HAL_TIMEx_OCN_Stop_IT(&htim1, TIM_CHANNEL_2);//该引脚配置的是 TIM1_CH2N
- HAL_TIM_OC_Start_IT(&htim1, TIM_CHANNEL_1);
- 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(也会有杂波)
新建工程的重要代码:
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- cnt_ch2n++;
- if(cnt_ch2n>10)
- {
- if(flag==0){
- flag=1;
- // HAL_TIM_OC_Start_IT(&htim1, TIM_CHANNEL_1);
- // HAL_TIM_OC_Start_IT(&htim1, TIM_CHANNEL_4);
- // __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0);
- HAL_TIMEx_OCN_Start_IT(&htim1, TIM_CHANNEL_2);//该引脚配置的是 TIM1_CH2N
-
- }
- else if(flag==1)
- {
- flag=0;
- // while(HAL_GPIO_ReadPin(CH3_GPIO_Port, CH3_Pin)==GPIO_PIN_SET){}
- // __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0);
- // HAL_TIM_OC_Stop_IT(&htim1, TIM_CHANNEL_1);
- // HAL_TIM_OC_Stop_IT(&htim1, TIM_CHANNEL_4);
- HAL_TIMEx_OCN_Stop_IT(&htim1, TIM_CHANNEL_2);//该引脚配置的是 TIM1_CH2N
-
- }
- cnt_ch2n=0;
- }
- HAL_Delay(50);
- }
- void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
- {
-
- if(pwmflag == 1)//pwm标记 默认为1
- {
- if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14) == GPIO_PIN_RESET)//读取该定时器对应引脚电平
- {
- TEMP = __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_2) + 100;//刚开始执行一次 为了快速进入周期变化
- pwmflag = 1;
- TEMP = (TEMP>TIM_PERIOD) ? (TEMP-TIM_PERIOD) : (TEMP);//比较值大于重装载值 减去重装载值
- __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2,TEMP); //设置比较值
- }
- else
- {
- TEMP =__HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_2) + (4864);//(高电平时间)2048是4096分辨率的中心值 4864是中点的比较值 64000*1.52/20=4864 (1.52是舵机中点的占空比 20是波形周期)
- pwmflag = 0;
- TEMP = (TEMP>TIM_PERIOD) ? (TEMP-TIM_PERIOD) : (TEMP);//比较值大于重装载值 减去重装载值
- __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, TEMP); //设置比较值
- }
- }
- else if(pwmflag == 0)
- {
- TEMP = __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_2) + (64000-(4864));//设置比较值,保证周期一定,为timch->period(低电平时间)
- TEMP = TEMP > TIM_PERIOD ? TEMP - TIM_PERIOD : TEMP;//比较值大于重装载值 减去重装载值
- __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, TEMP);
- pwmflag = 1;
- }
-
- }
复制代码
关于测试工程见附件,
同时测试发现,在同时关闭或开启定时器1-CH1和CH2N的中断时,没有出现杂波
请问各位大佬有知道是怎么回事的吗?
有碰到过这种现象吗?
谢谢啦!
|
最佳答案
查看完整内容[请看2#楼]
这个问题,目前的解决方法是
()
这样就是输出PWM波完成后,在关闭,避免了PWM还在输出高电平时,突然关闭定时器,从而造成杂波
缺点就是可能不是立刻就关闭了定时器输出,如在输出高电平时,假设我让点击按键,让其关闭输出,可能还会输出一个波形才会再关闭
|