跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YTM32B1L系列
  4. 使用ptmr产生1S定时器,在定时器内让PTC2和PTC3交叉输出PWM(20KHZ,占空比20%)和高电平,程序出现卡死

使用ptmr产生1S定时器,在定时器内让PTC2和PTC3交叉输出PWM(20KHZ,占空比20%)和高电平,程序出现卡死

已定时 已固定 已锁定 已移动 YTM32B1L系列
11 帖子 3 发布者 171 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • R 离线
    R 离线
    ryw3509
    写于2024年9月24日 02:15 最后由 编辑
    #1

    static void Board_Init(void)
    {
    Clock_Sys_Init();
    Pins_Drv_Init();
    Uart_Print_Init();
    ADC_DMA_Init();
    Ptmr_Drv_Init();
    }

    void Ptmr_Drv_Init(void)
    {
    pTMR_DRV_Init(pTMR0_INST,&PTMR_Config);
    pTMR_DRV_InitChannel(pTMR0_INST,pTMR0_CH0,&ptmr_channel_0);
    pTMR_DRV_InitChannel(pTMR0_INST,pTMR0_CH1,&ptmr_channel_1);
    pTMR_DRV_InitChannel(pTMR0_INST,pTMR0_CH2,&ptmr_channel_2);
    pTMR_DRV_InitChannel(pTMR0_INST,pTMR0_CH3,&ptmr_channel_3);
    INT_SYS_EnableIRQ(pTMR0_IRQn);

    INT_SYS_InstallHandler(pTMR0_IRQn, ptmr0_interrupt_isr, NULL);
    pTMR_DRV_StartTimerChannels(pTMR0_INST, pTMR0_CH0);
    pTMR_DRV_StartTimerChannels(pTMR0_INST, pTMR0_CH1);
    pTMR_DRV_StartTimerChannels(pTMR0_INST, pTMR0_CH2);
    pTMR_DRV_StartTimerChannels(pTMR0_INST, pTMR0_CH3);
    

    }

    void ptmr0_interrupt_isr(void)
    {
    if (pTMR_DRV_GetInterruptFlagTimerChannels(pTMR0_INST, pTMR0_CH0))
    {
    pTMR_DRV_ClearInterruptFlagTimerChannels(pTMR0_INST, pTMR0_CH0);
    PRINTF("pTMR CH0 ISR\n");
    PMM_Mode_IN1();
    }

    void PMM_Mode_IN1(void)//IN1 PWM mode
    {
    //引脚初始化
    PRINTF("main_motor_forward_PMM_Mode_IN1 start\n");
    g_pin_mux_InitConfigArr0[10].base = PCTRLC;
    g_pin_mux_InitConfigArr0[10].pinPortIdx = 2U;
    g_pin_mux_InitConfigArr0[10].pullConfig = PCTRL_INTERNAL_PULL_NOT_ENABLED;
    g_pin_mux_InitConfigArr0[10].driveSelect = PCTRL_LOW_DRIVE_STRENGTH;
    g_pin_mux_InitConfigArr0[10].passiveFilter = false;
    g_pin_mux_InitConfigArr0[10].mux = PCTRL_MUX_ALT2;
    g_pin_mux_InitConfigArr0[10].direction = GPIO_INPUT_DIRECTION;
    g_pin_mux_InitConfigArr0[10].intConfig = PCTRL_DMA_INT_DISABLED;
    g_pin_mux_InitConfigArr0[10].rateSelect = PCTRL_FAST_SLEW_RATE;
    g_pin_mux_InitConfigArr0[10].clearIntFlag = false;
    g_pin_mux_InitConfigArr0[10].digitalFilter = false;
    g_pin_mux_InitConfigArr0[10].filterConfig.width = 0;
    g_pin_mux_InitConfigArr0[10].gpioBase = GPIOC;
    g_pin_mux_InitConfigArr0[10].direction = GPIO_INPUT_DIRECTION;
    g_pin_mux_InitConfigArr0[10].initValue=0;
    PINS_Init(&g_pin_mux_InitConfigArr0[10]);
    PRINTF("000 000\n");
    g_pin_mux_InitConfigArr0[11].base = PCTRLC;
    g_pin_mux_InitConfigArr0[11].pinPortIdx = 3U;
    g_pin_mux_InitConfigArr0[11].pullConfig = PCTRL_INTERNAL_PULL_NOT_ENABLED;
    g_pin_mux_InitConfigArr0[11].driveSelect = PCTRL_LOW_DRIVE_STRENGTH;
    g_pin_mux_InitConfigArr0[11].passiveFilter = false;
    g_pin_mux_InitConfigArr0[11].mux = PCTRL_MUX_AS_GPIO;
    g_pin_mux_InitConfigArr0[11].direction = GPIO_INPUT_DIRECTION;
    g_pin_mux_InitConfigArr0[11].intConfig = PCTRL_DMA_INT_DISABLED;
    g_pin_mux_InitConfigArr0[11].rateSelect = PCTRL_FAST_SLEW_RATE;
    g_pin_mux_InitConfigArr0[11].clearIntFlag = false;
    g_pin_mux_InitConfigArr0[11].digitalFilter = false;
    g_pin_mux_InitConfigArr0[11].filterConfig.width = 0;
    g_pin_mux_InitConfigArr0[11].gpioBase = GPIOC;
    g_pin_mux_InitConfigArr0[11].direction = GPIO_OUTPUT_DIRECTION;
    g_pin_mux_InitConfigArr0[11].initValue=0;
    PINS_Init(&g_pin_mux_InitConfigArr0[11]);
    PRINTF("111 111\n");
    ETMR_PWM_Config0.pwmChannelConfig->hwChannelId = 2;
    ETMR_PWM_Config0.pwmChannelConfig->polarity = eTMR_POLARITY_NORMAL;
    ETMR_PWM_Config0.pwmChannelConfig->pwmSrcInvert = false;
    ETMR_PWM_Config0.pwmChannelConfig->align = eTMR_PWM_RIGHT_EDGE_ALIGN;
    ETMR_PWM_Config0.pwmChannelConfig->channelInitVal = 0;
    ETMR_PWM_Config0.pwmChannelConfig->typeOfUpdate = eTMR_PWM_UPDATE_IN_DUTY_CYCLE;
    ETMR_PWM_Config0.pwmChannelConfig->dutyCycle = 0x0000;
    ETMR_PWM_Config0.pwmChannelConfig->offset = 0;
    ETMR_PWM_Config0.pwmChannelConfig->enableSecondChannelOutput = false;
    ETMR_PWM_Config0.pwmChannelConfig->secondChannelPolarity = eTMR_POLARITY_NORMAL;
    PRINTF("222 222\n");
    eTMR_DRV_Init(eTMR0_INST,&ETMR_CM_Config0,&ETMR_CM_Config0_State);
    PRINTF("333 333\n");
    eTMR_DRV_InitPwm(eTMR0_INST,&ETMR_PWM_Config0);```
    PRINTF("444 444\n");
    /* PWM is generated when eTMR enable, the duty cycle is configured in the initial function /
    eTMR_DRV_Enable(eTMR0_INST);
    OSIF_TimeDelay(10);
    PRINTF("555 555\n");
    /
    The following code shows how to switch the different duty cycle /
    /
    channel 2 duty cycle is 20%(0x1000U)~80%(0x6666U) */
    eTMR_DRV_UpdatePwmChannel(eTMR0_INST, 2, 0x1000U, 0);
    eTMR_DRV_SetLdok(0);
    OSIF_TimeDelay(10);
    PRINTF("main_motor_forward_PMM_Mode_IN1 end\n");
    }

    测试LOG:
    pTMR CH0 ISR
    main_motor_forward_PMM_Mode_IN1 start
    000 000
    111 111
    222 222
    333 333
    444 444

    我这里要实现的控制逻辑:
    在定时器1S内,前7S,PTC2输出PWM,PTC3输出高电平;接着5S,PTC2和PTC3全部输出高电平;再接着7S,PTC2输出高电平,PTC3输出PWM,再接着5S,PTC2和PTC3全部输出高电平,这样一个循环过程。

    若是要实现这个过程,在1S定时任务就涉及到引脚初始化和PWM输出初始化,现在在定时器1S初始化PTC2输出PWM,PTC3输出高电平时,程序就出现了问题,请工程师协助分析下问题原因?谢谢~

    1 条回复 最后回复
    0
    • D 离线
      D 离线
      Diga
      写于2024年9月24日 02:26 最后由 编辑
      #2

      你说的这个过程可以全程用 PWM 实现。例如0%占空比就是低电平,100%占空比就是高电平,你可以在你的定时器中断里去更新 PWM 的占空比与频率,就不用修改引脚配置了,Task 也会比较简单

      R 1 条回复 最后回复 2024年9月24日 03:08
      0
      • R 离线
        R 离线
        ryw3509
        在 2024年9月24日 03:08 回复了 Diga 最后由 编辑
        #3

        Diga 你好!

        按照你所述,我这里做了调整,现在遇到一个新的问题:
        void Etmr_Drv_Init(void)
        {
        eTMR_DRV_Init(eTMR0_INST,&ETMR_CM_Config0,&ETMR_CM_Config0_State);
        eTMR_DRV_InitPwm(eTMR0_INST,&ETMR_PWM_Config0);
        /* PWM is generated when eTMR enable, the duty cycle is configured in the initial function */
        eTMR_DRV_Enable(eTMR0_INST);
        OSIF_TimeDelay(10);

        /* The following code shows how to switch the different duty cycle */
        /* channel 2 duty cycle is 20% */
        eTMR_DRV_UpdatePwmChannel(eTMR0_INST, 2, 0x8000U, 0);
        /* channel 3 duty cycle is 20% */
        eTMR_DRV_UpdatePwmChannel(eTMR0_INST, 3, 0x8000U, 0);
        eTMR_DRV_SetLdok(0);
        OSIF_TimeDelay(10);
        

        // PRINTF("CH2 output 20KHZ duty 20, CH3 output 20KHZ duty 20\n");
        }
        按照当前配置,正常应该是输出高电平,但是实测全部是低电平,将两路的0x8000U更改为0x0000U,输出的也是低电平,请问怎么回事啊?

        谢谢~

        1 条回复 最后回复
        0
        • R 离线
          R 离线
          ryw3509
          写于2024年9月24日 03:12 最后由 编辑
          #4

          eTMR_DRV_UpdatePwmChannel(eTMR0_INST, 2, 0x4000U, 0);
          eTMR_DRV_UpdatePwmChannel(eTMR0_INST, 3, 0x8000U, 0);
          按照这样的配置,2输出的占空比为50%,频率为20K的波形,但3输出的还是低电平。

          1 条回复 最后回复
          0
          • D 离线
            D 离线
            Diga
            写于2024年9月24日 03:12 最后由 编辑
            #5

            此时输出别的占空比波形正确嘛?会不会引脚的PINMUX被修改了,或者引脚接错了

            R 1 条回复 最后回复 2024年9月24日 03:14
            0
            • R 离线
              R 离线
              ryw3509
              在 2024年9月24日 03:14 回复了 Diga 最后由 编辑
              #6

              Diga 经过实测,只要不是0x8000U和0x0000U,输出的波形都是正常的。

              1 条回复 最后回复
              0
              • Q 离线
                Q 离线
                qinzhao
                写于2024年9月24日 03:20 最后由 编辑
                #7

                0x8000是100%占空比,0是0%占空比。极性反了就相反

                1 条回复 最后回复
                0
                • D 离线
                  D 离线
                  Diga
                  写于2024年9月24日 03:20 最后由 编辑
                  #8

                  这个是因为 YTM32B1LE0 无法通过 SDK 直接输出 100%占空比,设置 0x0 or 0x8000 都是0%PWM。
                  云途有个相关 Errata,里面有介绍如何真正输出 100% PWM,可以向云途的 FAE或销售咨询获取

                  R 1 条回复 最后回复 2024年9月24日 03:23
                  0
                  • R 离线
                    R 离线
                    ryw3509
                    在 2024年9月24日 03:23 回复了 Diga 最后由 编辑
                    #9

                    Diga 参考了例程,里面有这样的说明:
                    /* The following code shows how to switch the different duty cycle /
                    /
                    channel 2 duty cycle is 50% /
                    eTMR_DRV_UpdatePwmChannel(0, 2, 0x4000U, 0);
                    /
                    channel 3 duty cycle is 50% */
                    eTMR_DRV_UpdatePwmChannel(0, 3, 0x4000U, 0);
                    eTMR_DRV_SetLdok(0);
                    OSIF_TimeDelay(10);

                    **/* channel 2 100% duty cycle, here is the workaround for 100% duty cycle */
                    eTMR0->CH[2].VAL0 = 0;
                    eTMR0->CH[2].VAL1 = eTMR0->MOD + 1;
                    eTMR_DRV_SetLdok(0);
                    OSIF_TimeDelay(10);**
                    

                    按照这样的配置,通道2输出的是100%占空比,也就是高电平了。
                    通道3是50%占空比。

                    1 条回复 最后回复
                    0
                    • R 离线
                      R 离线
                      ryw3509
                      写于2024年9月25日 08:19 最后由 编辑
                      #10

                      留存记录:
                      卡死原因:在定时器内加入了延时导致。

                      D 1 条回复 最后回复 2024年9月25日 08:53
                      0
                      • D 离线
                        D 离线
                        Diga
                        在 2024年9月25日 08:53 回复了 ryw3509 最后由 编辑
                        #11

                        ryw3509 OSIF_TimeDelay() 延时是通过 Systick 来计数的,通常 Systick 优先级设置成比模块中断低或者相等。如果在模块中断中调用该函数,由于Systick 无法抢占当前中断,内部的一个 Counter 计数不会变化,这个函数会死等,也就是卡死。

                        1 条回复 最后回复
                        0

                        4/11

                        2024年9月24日 03:12

                        topic:navigator.unread, 7
                      • 云途论坛规则/Yuntu Forum Rules

                        发帖前请查看

                      • YCT离线License申请流程

                        帮助没办法联网的电脑使用YCT

                      • YT CONFIG TOOL调查问卷

                        帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

                      • demo
                        11
                        can
                        8
                        lin stack
                        5
                        yt-link
                        5
                        vscode
                        3
                        adc模块
                        2
                        i2c
                        2
                        uuid
                        2
                        Online Users
                        • 登录

                        • 登录或注册以进行搜索。
                        4 / 11
                        • 第一个帖子
                          4/11
                          最后一个帖子
                        0
                        • 版块
                        • 最新
                        • 标签
                        • 热门