MC03_MID_DEMO
-
demo工程:
MC0_MID_DEMO.zip
背景- MC03Etmr没有MID模式,如何实现动态频率调整
解决方案描述
采用双通道协同的工作方式: - 通道2(eTMR_CH2):配置为PWM输出模式
- 通道5(eTMR_CH5):配置为输出比较模式,用于产生周期中点中断
- 用周期中点中断作为同步基准点,在当前PWM周期运行至一半时,更新下一个完整周期的PWM参数,实现动态调整
步骤
ETMR模块配置
PWM输出通道选择CH2,频率为10000HZ

Output Compare通道选择CH5
时钟源为FXOSC(24000000HZ)
设置初始VAL0 VAL1值为 (240000000/100000)/2 = 1200

代码
这两个数组定义了一组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 */ - MC03Etmr没有MID模式,如何实现动态频率调整
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...