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

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YT SDK
  4. MC03_MID_DEMO

MC03_MID_DEMO

已定时 已固定 已锁定 已移动 YT SDK
1 帖子 1 发布者 30 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • ysogY 离线
    ysogY 离线
    ysog YunTu
    编写于 最后由 编辑
    #1

    demo工程:
    MC0_MID_DEMO.zip
    背景

    • MC03Etmr没有MID模式,如何实现动态频率调整
      解决方案描述
      采用双通道协同的工作方式:
    • 通道2(eTMR_CH2):配置为PWM输出模式
    • 通道5(eTMR_CH5):配置为输出比较模式,用于产生周期中点中断
    • 用周期中点中断作为同步基准点,在当前PWM周期运行至一半时,更新下一个完整周期的PWM参数,实现动态调整
      步骤
      ETMR模块配置
      PWM输出通道选择CH2,频率为10000HZ
      37a4ae3d-3db7-4e8f-b31e-3bb322a078d7-image.png
      Output Compare通道选择CH5
      时钟源为FXOSC(24000000HZ)
      设置初始VAL0 VAL1值为 (240000000/100000)/2 = 1200
      51ead5b4-bac1-4f86-ba96-293b24ce3749-image.png
      代码
      这两个数组定义了一组PWM周期及其对应的中断触发点:
      // PWM周期值(计数器计数值)
      uint32_t eTMR_values[] = {10000, 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000};
      // 对应的中断触发点(周期一半的计数值)
      uint32_t values[] = {2400, 2667, 3000, 3429, 4000, 4800, 6000, 8000, 12000, 24000};
    /* USER CODE BEGIN Header */
    /* you can remove the copyright */
    
    /*
     *  Copyright 2020-2023 Yuntu Microelectronics Co., Ltd.
     *  All rights reserved.
     * 
     *  SPDX-License-Identifier: BSD-3-Clause
     * 
     * @file main.c
     * @brief 
     * 
     */
    
    /* USER CODE END Header */
    #include "sdk_project_config.h"
    /* Includes ------------------------------------------------------------------*/
    
    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    #include "osif.h"
    #include <stdint.h>
    /* USER CODE END Includes */
    
    /* Private typedef -----------------------------------------------------------*/
    /* USER CODE BEGIN PTD */
    /* USER CODE END PTD */
    
    /* Private define ------------------------------------------------------------*/
    /* USER CODE BEGIN PD */
    #define ETMR_INST           0
    #define ETMR_CHANNEL_INDEX0 2
    #define ETMR_CHANNEL_INDEX1 3
    
    volatile uint8_t i = 0;
    uint32_t eTMR_values[] = {
        10000,        
        9000,
        8000,
        7000,
        6000,
        5000,
        4000,
        3000,
        2000,
        1000
    };
    
    uint32_t values[] = {
        2400,     // 10000 -> 2400
        2667,     // 9000 -> 2667
        3000,     // 8000 -> 3000
        3429,     // 7000 -> 3429
        4000,     // 6000 -> 4000
        4800,     // 5000 -> 4800
        6000,     // 4000 -> 6000
        8000,     // 3000 -> 8000
        12000,    // 2000 -> 12000
        24000     // 1000 -> 24000
    };
    /* USER CODE END PD */
    
    /* Private macro -------------------------------------------------------------*/
    /* USER CODE BEGIN PM */
    /* USER CODE END PM */
    
    /* Private variables ---------------------------------------------------------*/
    /* USER CODE BEGIN PV */
    /* USER CODE END PV */
    
    /* Private function declare --------------------------------------------------*/
    /* USER CODE BEGIN PFDC */
    /* USER CODE END PFDC */
    static void Board_Init(void);
    
    /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
    
    void eTMR0_Ovf_IRQHandler(void)
    {
        eTMR_DRV_ClearTofFlag(0);
    }
    
    void eTMR0_Ch4_Ch5_IRQHandler(void)
    {
        /* Clear interrupt flag */
        eTMR_DRV_ClearChnFlag(0, 1 << 5);   
        if(i <= 10)
        {
            PINS_DRV_TogglePins(GPIOD, (1<<5));
            eTMR_DRV_UpdatePwmPeriod(ETMR_INST, ETMR_CHANNEL_INDEX0, eTMR_values[i]);
            eTMR0->CH[5].VAL0 = values[i] / 2;
            eTMR0->CH[5].VAL1 = values[i] / 2;
            eTMR_DRV_SetLdok(ETMR_INST);
            i++;
        }
        else
            i = 100;
    
       
        /* Add your code here */
    }
    
    /* USER CODE END 0 */
    
    /**
     * @brief  The application entry point.
     * @retval int
     */
    int main(void)
    {
        /* USER CODE BEGIN 1 */
        /* USER CODE END 1 */ 
        Board_Init();
        /* USER CODE BEGIN 2 */
        /* PWM is generated when eTMR enable, the duty cycle is configured in the initial function */
        INT_SYS_EnableIRQ(eTMR0_Ch4_Ch5_IRQn);
        eTMR_DRV_Enable(ETMR_INST);
    
        /* USER CODE END 2 */
    
        /* Infinite loop */
        /* USER CODE BEGIN WHILE */
        while (1)
        {
            /* USER CODE END WHILE */
            /* USER CODE BEGIN 3 */
        }
        /* USER CODE END 3 */
    }
    
    static void Board_Init(void)
    {
        CLOCK_SYS_Init(g_clockManConfigsArr,CLOCK_MANAGER_CONFIG_CNT,g_clockManCallbacksArr,CLOCK_MANAGER_CALLBACK_CNT);
        if(STATUS_SUCCESS != CLOCK_SYS_UpdateConfiguration(CLOCK_MANAGER_ACTIVE_INDEX,CLOCK_MANAGER_POLICY_AGREEMENT))
        {
            /* USER CODE BEGIN ERROR_HANDLER 1 */
            SystemSoftwareReset();
            /* USER CODE END ERROR_HANDLER 1 */
        }
        PINS_DRV_Init(NUM_OF_CONFIGURED_PINS0,g_pin_mux_InitConfigArr0);
        eTMR_DRV_Init(0,&ETMR_CM_Config0,&ETMR_CM_Config0_State);
        eTMR_DRV_InitPwm(0,&ETMR_PWM_Config0);
        eTMR_DRV_InitOutputCompare(0,&ETMR_OC_Config0);
    }
    
    /* USER CODE BEGIN 4 */
    /* USER CODE END 4 */
    
    
    1 条回复 最后回复
    0

  • 云途开发生态介绍

    快速上手云途开发生态

  • 云途论坛规则/Yuntu Forum Rules

    发帖前请查看

  • YT CONFIG TOOL调查问卷

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

  • can
    20
    demo
    20
    uds
    13
    lin stack
    11
    md14
    6
    fbl
    5
    yt-link
    5
    adc模块
    4
    Online Users
    yt0503Y
    yt0503
    northN
    north
    • 登录

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