关于HAL库开关PWM的效率问题

2019-12-11 18:31发布

本人正在做一个电机控制的PWM程序,遇到一些关于HAL效率极限的问题。芯片是STM32F107, 主频72MHz
代码中间有一段需要换相和暂停PWM功能,采用TIM1定时器溢出中断,然后用switch进行轮训,其中一个轮训的片段主要代码部分:
  1. case 2:{
  2.                                         HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
  3.                                         HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_RESET);
  4.                                        
  5.                                         HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_SET);       
  6.                                        
  7.                                        
  8.                                        
  9.                                         q6851_TIM1_PWM_OverturnOCPolarityToHigh(PULSE, TIM_CHANNEL_2);
  10.                                         //HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
  11.                                        
  12.                                        
  13.                                         break;


  14. void q6851_TIM1_PWM_OverturnOCPolarityToHigh(uint16_t dutycycle, uint32_t Channel)
  15. {
  16.                 TIM_OC_InitTypeDef sConfigOC;
  17.                
  18.                 sConfigOC.OCMode = TIM_OCMODE_PWM1;
  19.                 sConfigOC.Pulse = dutycycle;
  20.                 sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
  21.                 sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW;
  22.                 sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  23.                 sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  24.                 sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  25.         //        HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);
  26.                 HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, Channel);
  27.                 HAL_TIM_PWM_Start(&htim1, Channel);
  28. }
复制代码
问题主要是前两句。
PE8相当于使能端,必须在关闭PWM之后拉低。
理想输出近似于“修正后PWM2”图,但是在周期末尾会产生一段2us脉冲波,在控制电路中这样的存在很危险,希望大佬能给点建议如何消除或者缩短这个过程,有没有其他更加高效的办法。
如果上述问题描述不清晰还需有补充,可以写在下面
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
22条回答
wangmengqiwo
1楼-- · 2019-12-14 01:41
20061002838 发表于 2019-4-28 18:03
使能TIM1的所有通道
禁止的话,htim1.Instance->CCER &= ~(TIM_CCER_CC1E | TIM_CCER_CC2E  ) .....
你需 ...

谢谢!我顺着去看看手册和库
wangmengqiwo
2楼-- · 2019-12-14 07:13
 精彩回答 2  元偷偷看……
dukelec
3楼-- · 2019-12-14 10:04
本帖最后由 dukelec 于 2019-4-28 18:16 编辑
20061002838 发表于 2019-4-28 18:04
你这个是什么字体? 看起来很好看


截圖是 Linux 系統(Gentoo 發行版,xfce4 桌面)上運行 Eclipse,
字體是 Linux 的基礎字體 Monospace

Screenshot_2019-04-28_18-08-50.png (46.45 KB, 下载次数: 0)

下载附件

2019-4-28 18:10 上传

20061002838
4楼-- · 2019-12-14 13:39
dukelec 发表于 2019-4-28 18:11
截圖是 Linux 系統(Gentoo 發行版,xfce4 桌面)上運行 Eclipse,
字體是 Linux 的基礎字體 Monospace
...

谢谢,我找下这个字体试试看
20061002838
5楼-- · 2019-12-14 15:06
wangmengqiwo 发表于 2019-4-28 18:07
你的意思是不使用callback函数而是直接把这段代码放在.it的文件里,对吗

他的意思是在cubemx上面设置,不生成TIM1的中断函数,用你自己写的
yunhuisong
6楼-- · 2019-12-14 20:30
wangmengqiwo 发表于 2019-4-28 18:07
你的意思是不使用callback函数而是直接把这段代码放在.it的文件里,对吗

你看看从中断函数到callback函数花了多长时间。拿个IO从进中断反转一下,进callback再反转一下,看看用来多久,如果是这个导致,那就自己重写中断函数,别用cubemx生成的

一周热门 更多>