打印
[技术问答]

HC32F460KETA PWM 一堆问题需要技术支持

[复制链接]
1551|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 woai32lala 于 2024-10-23 19:34 编辑

HC32F460KETA PWM 一堆问题需要技术支持
使用TIMA_4_PWM3和PWM4管脚   对应PB8和PB9,两个通道之间有影响,一个通道输出PWM,另一个通道也输出一样的波形,被折磨很久,想问一下没有没有技术支持//PWM 初始化
/* TIMERA unit and clock definition */

#define TIMERA_TUBE_HEAT_UNIT                   (M4_TMRA4)   //管道加热
#define TIMERA_AIR_CHAMBER_UNIT                 (M4_TMRA4)   //气室加热


#define TIMERA_TUBE_HEAT_CLOCK          (PWC_FCG2_PERIPH_TIMA4)
#define TIMERA_AIR_CHAMBER_CLOCK        (PWC_FCG2_PERIPH_TIMA4)


/* TIMERA_6 channel 6 Port/Pin definition */   
#define TIMERA_UNIT_TUBE_HEAT_CH               (TimeraCh4)
#define TIMERA_UNIT_TUBE_HEAT_CH_PORT          (PortB)
#define TIMERA_UNIT_TUBE_HEAT_CH_PIN           (Pin09)
#define TIMERA_UNIT_TUBE_HEAT_CH_FUNC          (Func_Tima0)

/* TIMERA_5 channel 5 Port/Pin definition */   
#define TIMERA_UNIT_AIR_CHAMBER_CH             (TimeraCh3)
#define TIMERA_UNIT_AIR_CHAMBER_CH_PORT        (PortB)
#define TIMERA_UNIT_AIR_CHAMBER_CH_PIN         (Pin08)
#define TIMERA_UNIT_AIR_CHAMBER_CH_FUNC        (Func_Tima0)  




static void heat_pwm_init(void)
{
    stc_timera_base_init_t stcTimeraInit;
    stc_timera_compare_init_t stcTimerCompareInit;
    stc_irq_regi_conf_t stcIrqRegiConf;
    stc_timera_hw_startup_config_t stcTimeraHwConfig;
    stc_port_init_t stcPortInit;

    /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcTimeraInit);
    MEM_ZERO_STRUCT(stcIrqRegiConf);
    MEM_ZERO_STRUCT(stcTimerCompareInit);
    MEM_ZERO_STRUCT(stcTimeraHwConfig);
    MEM_ZERO_STRUCT(stcPortInit);

    /* Configuration peripheral clock */
    PWC_Fcg2PeriphClockCmd(TIMERA_TUBE_HEAT_CLOCK, Enable);
    PWC_Fcg2PeriphClockCmd(TIMERA_AIR_CHAMBER_CLOCK, Enable);


    /* Configuration TIMERA compare pin */
    PORT_SetFunc(TIMERA_UNIT_TUBE_HEAT_CH_PORT, TIMERA_UNIT_TUBE_HEAT_CH_PIN, TIMERA_UNIT_TUBE_HEAT_CH_FUNC, Disable);
    PORT_SetFunc(TIMERA_UNIT_AIR_CHAMBER_CH_PORT, TIMERA_UNIT_AIR_CHAMBER_CH_PIN, TIMERA_UNIT_AIR_CHAMBER_CH_FUNC, Disable);

    /* Configuration timera unit 1 base structure */
    stcTimeraInit.enClkDiv = TimeraPclkDiv1;
    stcTimeraInit.enCntMode = TimeraCountModeSawtoothWave;//TimeraCountModeTriangularWave;
    stcTimeraInit.enCntDir = TimeraCountDirUp;
    stcTimeraInit.enSyncStartupEn = Disable;
    stcTimeraInit.u16PeriodVal = 5000;                    //20Khz
    TIMERA_BaseInit(TIMERA_TUBE_HEAT_UNIT, &stcTimeraInit);
    TIMERA_BaseInit(TIMERA_AIR_CHAMBER_UNIT, &stcTimeraInit);



    /* Configuration timera unit 1 compare structure */
//    stcTimerCompareInit.u16CompareVal = 5000;        //占空比70%   //stcTimeraInit.u16PeriodVal * 5u / 10u;        //占空比70%
    stcTimerCompareInit.enStartCountOutput = TimeraCountStartOutputHigh;
    stcTimerCompareInit.enStopCountOutput = TimeraCountStopOutputLow;
    stcTimerCompareInit.enCompareMatchOutput = TimeraCompareMatchOutputLow;//TimeraCompareMatchOutputReverse;
    stcTimerCompareInit.enPeriodMatchOutput = TimeraPeriodMatchOutputHigh;//TimeraPeriodMatchOutputKeep;
    stcTimerCompareInit.enSpecifyOutput = TimeraSpecifyOutputInvalid;        //该寄存器可用于实现PWM输出占空比0%或100%
    stcTimerCompareInit.enCacheEn = Enable;
    stcTimerCompareInit.enTriangularTroughTransEn = Enable;
    stcTimerCompareInit.enTriangularCrestTransEn = Disable;
    stcTimerCompareInit.u16CompareCacheVal = stcTimerCompareInit.u16CompareVal;
    /* Configure Channel 1 */
    TIMERA_CompareInit(TIMERA_TUBE_HEAT_UNIT, TIMERA_UNIT_TUBE_HEAT_CH, &stcTimerCompareInit);
    TIMERA_CompareInit(TIMERA_AIR_CHAMBER_UNIT, TIMERA_UNIT_AIR_CHAMBER_CH, &stcTimerCompareInit);


    TIMERA_CompareCmd(TIMERA_TUBE_HEAT_UNIT, TIMERA_UNIT_TUBE_HEAT_CH, Enable);
    TIMERA_CompareCmd(TIMERA_AIR_CHAMBER_UNIT, TIMERA_UNIT_AIR_CHAMBER_CH, Enable);
//    TIMERA_CompareCacheCmd(TIMERA_AIR_CHAMBER_UNIT, TIMERA_UNIT_AIR_CHAMBER_CH, Enable);


    TIMERA_Cmd(TIMERA_TUBE_HEAT_UNIT,Enable);
    TIMERA_Cmd(TIMERA_AIR_CHAMBER_UNIT,Enable);



    real.tube.TIMERAx  = TIMERA_TUBE_HEAT_UNIT;
    real.tube.enChannel = TIMERA_UNIT_TUBE_HEAT_CH;

    real.air_charmber.TIMERAx  = TIMERA_AIR_CHAMBER_UNIT;
    real.air_charmber.enChannel = TIMERA_UNIT_AIR_CHAMBER_CH;


}

int pwm_out = 2000;


                TIMERA_SetCompareValue(real.tube.TIMERAx, real.tube.enChannel,(pwm_out + pwm_out));
                TIMERA_SetCompareValue(real.air_charmber.TIMERAx, real.air_charmber.enChannel,pwm_out);


这两个各种组合都试了,都受影响


黄色是air_charmber,这个波形经常条,偶尔有一个正确波形

使用特权

评论回复
沙发
wubangmi| | 2024-10-24 08:49 | 只看该作者
你认真研究下缓存功能,换成两个通道都用缓存来传送比较值

使用特权

评论回复
板凳
p0gon9y| | 2024-11-13 20:58 | 只看该作者
在使用HC32F460KETA单片机的PWM功能时,如果两个通道(例如TIMA_4_PWM3和PWM4)共用同一个定时器(例如TIMA4),那么它们之间确实可能会有相互影响。

使用特权

评论回复
地板
q1d0mnx| | 2024-11-17 12:33 | 只看该作者
具体来说,如果两个通道的PWM输出引脚(例如PB8和PB9)配置不当,可能会导致一个通道的PWM输出影响另一个通道的PWM输出。

使用特权

评论回复
5
q1ngt12| | 2024-11-17 13:44 | 只看该作者
两个通道共用同一个定时器,但配置不当,导致输出波形相同。确保每个通道的配置独立,特别是周期和占空比的配置。

使用特权

评论回复
6
su1yirg| | 2024-11-17 14:52 | 只看该作者
引脚复用配置错误,导致两个通道的输出引脚共用同一个物理引脚。确保每个通道的输出引脚配置正确。

使用特权

评论回复
7
suw12q| | 2024-11-17 15:31 | 只看该作者
定时器时钟配置错误,导致PWM输出不正确。确保定时器时钟配置正确。

使用特权

评论回复
8
t1ngus4| | 2024-11-17 16:50 | 只看该作者
在使用HC32F460KETA单片机的PWM功能时,如果两个通道共用同一个定时器,确保每个通道的配置独立,特别是周期和占空比的配置。

使用特权

评论回复
9
b5z1giu| | 2024-11-17 17:17 | 只看该作者
建议确保引脚复用配置正确,避免两个通道的输出引脚共用同一个物理引脚。

使用特权

评论回复
10
cen9ce| | 2024-11-17 18:33 | 只看该作者
这个确实没遇到过,主要也没这么使用过,你看看IO复用是否正确?

使用特权

评论回复
11
ex7s4| | 2024-11-18 07:31 | 只看该作者
我觉得是不是复用的时钟或者AFIO的通道配置错了?

使用特权

评论回复
12
d1ng2x| | 2024-11-18 08:21 | 只看该作者
按理来说不应该这样,因为定时器3和4应该不在一起才对啊

使用特权

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

本版积分规则

107

主题

535

帖子

5

粉丝