460 timer42 wu通道互补输出
用相同的配置,分析设置 TIMER42 PA4 TIM4_2_OWHPA5 TIM4_2_OWL
PC4 TIM4_2_OUH
PC5 TIM4_2_OUL
/* Set OCO compare value */
TIMER4_OCO_WriteOccr(TIMER4_UNIT, TIMER4_OCOU_HIGH_CH, u8OcoOccrVal);
TIMER4_OCO_WriteOccr(TIMER4_UNIT, TIMER4_OCOU_LOW_CH, u8OcoOccrVal/2);
TIMER4_OCO_WriteOccr(TIMER4_UNIT, TIMER4_OCOW_HIGH_CH, u8OcoOccrVal);
TIMER4_OCO_WriteOccr(TIMER4_UNIT, TIMER4_OCOW_LOW_CH, u8OcoOccrVal/4);
/* Enable OCO */
TIMER4_OCO_OutputCompareCmd(TIMER4_UNIT, TIMER4_OCOU_HIGH_CH, Enable);
TIMER4_OCO_OutputCompareCmd(TIMER4_UNIT, TIMER4_OCOU_LOW_CH, Enable);
TIMER4_OCO_OutputCompareCmd(TIMER4_UNIT, TIMER4_OCOW_HIGH_CH, Enable);
TIMER4_OCO_OutputCompareCmd(TIMER4_UNIT, TIMER4_OCOW_LOW_CH, Enable);
/* Initialize PWM I/O */
PORT_SetFunc(TIMER4_PWMU_H_PORT, TIMER4_PWMU_H_PIN, Func_Tim4, Disable);
PORT_SetFunc(TIMER4_PWMU_L_PORT, TIMER4_PWMU_L_PIN, Func_Tim4, Disable);
PORT_SetFunc(TIMER4_PWMW_H_PORT, TIMER4_PWMW_H_PIN, Func_Tim4, Disable);
PORT_SetFunc(TIMER4_PWMW_L_PORT, TIMER4_PWMW_L_PIN, Func_Tim4, Disable);
/* Timer4 PWM: Initialize PWM configuration structure */
stcPwmInit.enRtIntMaskCmd = Enable;
stcPwmInit.enClkDiv = PwmPlckDiv1;
stcPwmInit.enOutputState = PwmHHoldPwmLReverse;
stcPwmInit.enMode = PwmThroughMode;
TIMER4_PWM_Init(TIMER4_UNIT, TIMER4_PWMU_CH, &stcPwmInit); /* Initialize timer4 pwm */
TIMER4_PWM_Init(TIMER4_UNIT, TIMER4_PWMW_CH, &stcPwmInit); /* Initialize timer4 pwm */
希望生成 两组互补的PWM输出。
结果 W 通道有互补的输出,U通道输出是没有互补的。不知道哪里设置有问题?
PORT_SetFunc(TIMER4_PWMU_H_PORT, TIMER4_PWMU_H_PIN, Func_Tim4, Disable);
奇怪的是这个端口功能设置,最后面是Disable
好像是一个端口可以同时设置两个功能,看不懂。 神奇了,在Enable OCO前,需要将每个通道的Occr都写入一个数。然后就正常了。
/* Set OCO compare value */
TIMER4_OCO_WriteOccr(TIMER4_UNIT, TIMER4_OCOU_HIGH_CH, u8OcoOccrVal);
TIMER4_OCO_WriteOccr(TIMER4_UNIT, TIMER4_OCOU_LOW_CH, u8OcoOccrVal/2);
TIMER4_OCO_WriteOccr(TIMER4_UNIT, TIMER4_OCOW_HIGH_CH, u8OcoOccrVal);
TIMER4_OCO_WriteOccr(TIMER4_UNIT, TIMER4_OCOW_LOW_CH, u8OcoOccrVal/4);
/* Enable OCO */
TIMER4_OCO_OutputCompareCmd(TIMER4_UNIT, TIMER4_OCOU_HIGH_CH, Enable);
TIMER4_OCO_OutputCompareCmd(TIMER4_UNIT, TIMER4_OCOU_LOW_CH, Enable);
TIMER4_OCO_OutputCompareCmd(TIMER4_UNIT, TIMER4_OCOW_HIGH_CH, Enable);
TIMER4_OCO_OutputCompareCmd(TIMER4_UNIT, TIMER4_OCOW_LOW_CH, Enable); 使用三角波计数,可以正常改变占空比。但是 PWM 的分辨率降低了一倍。
改成锯齿波,功能就乱了。认为是OCMR 寄存器配置的问题。但怎么改也不管用。
这个TIMER4 芯片上的产生PWM波的套路有点特别。 本帖最后由 martinhu 于 2021-8-2 13:25 编辑
你把三个UVW的OCMRL配置如下试试
三角波,OCCRH/L 六个寄存器控制PWM,比如,OCCRUH控制U相上升计数时候的比较匹配点,OCCRUL控制向下计数时候的比较匹配点,
如果要输出左右对称的PWM,设置同一相的OCCRH/L寄存器的值相同
都timer42了?有42个定时器? 华大的FAE 都没有搞定,无语了。 luohao316 发表于 2021-8-3 08:28
华大的FAE 都没有搞定,无语了。
这个很简单啊,你找FAE了吗? 原来一直做支持的是代理商的FAE,得找原厂的才行。 caigang13 发表于 2021-8-2 20:50
都timer42了?有42个定时器?
有好几种TIMER TIMERA TIMER4 TIMER6 等等
其中TIMER4 这种,有3 个 分别叫作TIMER41 TIMER42 TIMER43 martinhu 发表于 2021-8-2 13:22
你把三个UVW的OCMRL配置如下试试
三角波,OCCRH/L 六个寄存器控制PWM,比如,OCCRUH控制U相上升计数时候的 ...
你这个代码能发我一份么?带库的那种 vaov@163.com ,谢谢 伸手党,给你代码你也看不懂
页:
[1]