luohao316 发表于 2021-7-28 16:58

460 timer42 wu通道互补输出

用相同的配置,分析设置 TIMER42   PA4 TIM4_2_OWH
PA5 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通道输出是没有互补的。不知道哪里设置有问题?



luohao316 发表于 2021-7-28 17:00

PORT_SetFunc(TIMER4_PWMU_H_PORT, TIMER4_PWMU_H_PIN, Func_Tim4, Disable);
奇怪的是这个端口功能设置,最后面是Disable
好像是一个端口可以同时设置两个功能,看不懂。

luohao316 发表于 2021-7-28 20:52

神奇了,在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);

luohao316 发表于 2021-8-2 08:58

使用三角波计数,可以正常改变占空比。但是 PWM 的分辨率降低了一倍。
改成锯齿波,功能就乱了。认为是OCMR 寄存器配置的问题。但怎么改也不管用。
这个TIMER4 芯片上的产生PWM波的套路有点特别。

martinhu 发表于 2021-8-2 13:22

本帖最后由 martinhu 于 2021-8-2 13:25 编辑

你把三个UVW的OCMRL配置如下试试

三角波,OCCRH/L 六个寄存器控制PWM,比如,OCCRUH控制U相上升计数时候的比较匹配点,OCCRUL控制向下计数时候的比较匹配点,
如果要输出左右对称的PWM,设置同一相的OCCRH/L寄存器的值相同

caigang13 发表于 2021-8-2 20:50

都timer42了?有42个定时器?

luohao316 发表于 2021-8-3 08:28

华大的FAE 都没有搞定,无语了。

martinhu 发表于 2021-8-3 09:05

luohao316 发表于 2021-8-3 08:28
华大的FAE 都没有搞定,无语了。

这个很简单啊,你找FAE了吗?

luohao316 发表于 2021-8-3 17:19

原来一直做支持的是代理商的FAE,得找原厂的才行。

luohao316 发表于 2021-8-3 17:23

caigang13 发表于 2021-8-2 20:50
都timer42了?有42个定时器?

有好几种TIMER   TIMERA TIMER4 TIMER6 等等
其中TIMER4 这种,有3 个 分别叫作TIMER41 TIMER42 TIMER43   

kfhzy 发表于 2021-9-17 21:12

martinhu 发表于 2021-8-2 13:22
你把三个UVW的OCMRL配置如下试试

三角波,OCCRH/L 六个寄存器控制PWM,比如,OCCRUH控制U相上升计数时候的 ...

你这个代码能发我一份么?带库的那种 vaov@163.com ,谢谢

忘了停止 发表于 2021-9-26 21:33

伸手党,给你代码你也看不懂
页: [1]
查看完整版本: 460 timer42 wu通道互补输出