本人正在做一个电机控制的PWM程序,遇到一些关于HAL效率极限的问题。芯片是STM32F107, 主频72MHz
代码中间有一段需要换相和暂停PWM功能,采用TIM1定时器溢出中断,然后用switch进行轮训,其中一个轮训的片段主要代码部分:
- case 2:{
- HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
- HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_RESET);
-
- HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_SET);
-
-
-
- q6851_TIM1_PWM_OverturnOCPolarityToHigh(PULSE, TIM_CHANNEL_2);
- //HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
-
-
- break;
- void q6851_TIM1_PWM_OverturnOCPolarityToHigh(uint16_t dutycycle, uint32_t Channel)
- {
- TIM_OC_InitTypeDef sConfigOC;
-
- sConfigOC.OCMode = TIM_OCMODE_PWM1;
- sConfigOC.Pulse = dutycycle;
- sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
- sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW;
- sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
- sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
- sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
- // HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);
- HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, Channel);
- HAL_TIM_PWM_Start(&htim1, Channel);
- }
复制代码
问题主要是前两句。
PE8相当于使能端,必须在关闭PWM之后拉低。
理想输出近似于“修正后PWM2”图,但是在周期末尾会产生一段2us脉冲波,在控制电路中这样的存在很危险,希望大佬能给点建议如何消除或者缩短这个过程,有没有其他更加高效的办法。
如果上述问题描述不清晰还需有补充,可以写在下面
上面的代码就是在定时器中断了,做6步电机驱动,这是其中的一步,其他的与这段相似只是相位不同。有什么具体的操作推荐么
我這個是 stm8 的例子,一開始調試用的是 #if 0 段的代碼,後來爲了省空間,和提升性能,就用 #else 段的代碼代替,
代替的代碼是跟入庫的代碼,看哪些有用到,然後拷貝出來的,同時要對着手冊看寄存器定義。
Screenshot_2019-04-28_16-51-54.png (110.43 KB, 下载次数: 0)
下载附件
2019-4-28 16:52 上传
STM32 還有一個 LL HAL 的更底層的接口可用,大多也是直接訪問寄存器。
沒辦法,不熟就只能去熟悉它。。。
想當年,我學 STM32 的時候,把手冊手抄一份,就熟悉了。。。
462641800.jpg (704.34 KB, 下载次数: 0)
下载附件
2019-4-28 17:34 上传
TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE |
TIM_CCER_CC4E;
这样就简洁了
一周热门 更多>