[技术问答]

460 timer42 wu通道互补输出

[复制链接]
10717|13
手机看帖
扫描二维码
随时随地手机跟帖
luohao316|  楼主 | 2021-7-28 16:58 | 显示全部楼层 |阅读模式
用相同的配置,分析设置 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
好像是一个端口可以同时设置两个功能,看不懂。

使用特权

评论回复
评论
martinhu 2021-8-2 13:21 回复TA
最后一个参数是第二功能脚,所有IO只能配一个第二功能,一般用不着 
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配置如下试试
4408961078122d8907.png
三角波,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 ,谢谢

使用特权

评论回复
评论
martinhu 2021-9-18 10:23 回复TA
那个是寄存器操作,不带库的, 
忘了停止| | 2021-9-26 21:33 | 显示全部楼层
伸手党,给你代码你也看不懂

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

82

帖子

0

粉丝