尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
小华芯片HC32F460之TMR6输出互补PWM
平台keil V5.31宏定义/* 引脚和定时器单元定义 */ // 第一路TMR6_1, PA8/PB13 #define TMR6_1_UNIT CM_TMR6_1 #define PWM1_PORT_A GPIO_PORT_A #define PWM1_PIN_A GPIO_PIN_08 #define PWM1_PORT_B GPIO_PORT_B #define PWM1_PIN_B GPIO_PIN_13 // 第二路TMR6_2, PA9/PB14 #define TMR6_2_UNIT CM_TMR6_2 #define PWM2_PORT_A GPIO_PORT_A #define PWM2_PIN_A GPIO_PIN_09 #define PWM2_PORT_B GPIO_PORT_B #define PWM2_PIN_B GPIO_PIN_14 // 第三路TMR6_3, PA10/PB15 #define TMR6_3_UNIT CM_TMR6_3 #define PWM3_PORT_A GPIO_PORT_A #define PWM3_PIN_A GPIO_PIN_10 #define PWM3_PORT_B GPIO_PORT_B #define PWM3_PIN_B GPIO_PIN_15 #define PWM_FUNC GPIO_FUNC_3 /* PWM 参数配置 */ #define PWM_FREQ_HZ 20000U // 20kHz PWM 频率 #define SYSTEM_CLOCK_HZ 200000000U // 200MHz 系统时钟 (PCLK0) #define PWM_PERIOD (SYSTEM_CLOCK_HZ / PWM_FREQ_HZ) // 10000 // 死区时间: 1us #define DEAD_TIME_NS 1000U #define DEAD_TIME_COUNT ((DEAD_TIME_NS * (SYSTEM_CLOCK_HZ / 1000000U)) / 1000U) // 200配置static void GPIO_ConfigSinglePin(uint8_t u8Port, uint16_t u16Pin) { stc_gpio_init_t stcGpioInit; GPIO_StructInit(stcGpioInit); stcGpioInit.u16PinDir PIN_DIR_OUT; stcGpioInit.u16PinOutputType PIN_OUT_TYPE_CMOS; stcGpioInit.u16PinDrv PIN_HIGH_DRV; stcGpioInit.u16PinAttr PIN_ATTR_DIGITAL; GPIO_SetFunc(u8Port, u16Pin, PWM_FUNC); GPIO_Init(u8Port, u16Pin, stcGpioInit); } void GPIO_Config(void) { // 配置 PA8, PA9, PA10 GPIO_ConfigSinglePin(PWM1_PORT_A, PWM1_PIN_A); GPIO_ConfigSinglePin(PWM2_PORT_A, PWM2_PIN_A); GPIO_ConfigSinglePin(PWM3_PORT_A, PWM3_PIN_A); // 配置 PB13, PB14, PB15 GPIO_ConfigSinglePin(PWM1_PORT_B, PWM1_PIN_B); GPIO_ConfigSinglePin(PWM2_PORT_B, PWM2_PIN_B); GPIO_ConfigSinglePin(PWM3_PORT_B, PWM3_PIN_B); } void TMR6_SinglePWM_Init(CM_TMR6_TypeDef *tmrUnit, uint32_t fcgPeriph, uint32_t period, uint32_t deadTime, uint8_t duty) { stc_tmr6_init_t stcTmr6Init; stc_tmr6_pwm_init_t stcPwmInit; // 1. 使能 Timer6 时钟 FCG_Fcg2PeriphClockCmd(fcgPeriph, ENABLE); // 2. 基础计数配置 TMR6_StructInit(stcTmr6Init); stcTmr6Init.u8CountSrc TMR6_CNT_SRC_SW; // 软件计数模式 stcTmr6Init.sw_count.u32CountMode TMR6_MD_SAWTOOTH; // 锯齿波模式 (向上计数) stcTmr6Init.sw_count.u32CountDir TMR6_CNT_UP; // 向上计数 stcTmr6Init.sw_count.u32ClockDiv TMR6_CLK_DIV1; // 不分频 stcTmr6Init.u32PeriodValue period; // 周期值 TMR6_Init(tmrUnit, stcTmr6Init); // 3. 死区时间配置 // 先使能死区功能 TMR6_DeadTimeFuncCmd(tmrUnit, ENABLE); // 配置死区寄存器向上计数阶段 TMR6_SetDeadTimeValue(tmrUnit, TMR6_DEADTIME_REG_UP_A, deadTime); TMR6_SetDeadTimeValue(tmrUnit, TMR6_DEADTIME_REG_UP_B, deadTime); // 配置死区寄存器向下计数阶段如果使用锯齿波模式此值可设相同 TMR6_SetDeadTimeValue(tmrUnit, TMR6_DEADTIME_REG_DOWN_A, deadTime); TMR6_SetDeadTimeValue(tmrUnit, TMR6_DEADTIME_REG_DOWN_B, deadTime); // 4. 配置 PWMA 通道主通道 TMR6_PWM_StructInit(stcPwmInit); stcPwmInit.u32CompareValue (period * duty) / 100; // 占空比 stcPwmInit.u32StartPolarity TMR6_PWM_LOW; // 计数开始输出低 stcPwmInit.u32StopPolarity TMR6_PWM_LOW; // 计数停止输出低 stcPwmInit.u32CompareMatchPolarity TMR6_PWM_HIGH; // 比较匹配翻转为高 stcPwmInit.u32PeriodMatchPolarity TMR6_PWM_LOW; // 周期匹配翻转为低 stcPwmInit.u32StartStopHold TMR6_PWM_START_STOP_CHANGE; TMR6_PWM_Init(tmrUnit, TMR6_CH_A, stcPwmInit); // 5. 配置 PWMB 通道互补通道极性相反 TMR6_PWM_StructInit(stcPwmInit); stcPwmInit.u32CompareValue (period * duty) / 100; stcPwmInit.u32StartPolarity TMR6_PWM_HIGH; // 与PWMA相反 stcPwmInit.u32StopPolarity TMR6_PWM_HIGH; // 与PWMA相反 stcPwmInit.u32CompareMatchPolarity TMR6_PWM_LOW; // 与PWMA相反 stcPwmInit.u32PeriodMatchPolarity TMR6_PWM_HIGH; // 与PWMA相反 stcPwmInit.u32StartStopHold TMR6_PWM_START_STOP_CHANGE; TMR6_PWM_Init(tmrUnit, TMR6_CH_B, stcPwmInit); // 6. 设置引脚功能为比较输出 TMR6_SetFunc(tmrUnit, TMR6_CH_A, TMR6_PIN_CMP_OUTPUT); TMR6_SetFunc(tmrUnit, TMR6_CH_B, TMR6_PIN_CMP_OUTPUT); // 7. 使能 PWM 输出 TMR6_PWM_OutputCmd(tmrUnit, TMR6_CH_A, ENABLE); TMR6_PWM_OutputCmd(tmrUnit, TMR6_CH_B, ENABLE); } void TMR6_AllPWM_Init(void) { // 初始化三路初始占空比50% TMR6_SinglePWM_Init(CM_TMR6_1, FCG2_PERIPH_TMR6_1, PWM_PERIOD, DEAD_TIME_COUNT, 50); TMR6_SinglePWM_Init(CM_TMR6_2, FCG2_PERIPH_TMR6_2, PWM_PERIOD, DEAD_TIME_COUNT, 50); TMR6_SinglePWM_Init(CM_TMR6_3, FCG2_PERIPH_TMR6_3, PWM_PERIOD, DEAD_TIME_COUNT, 50); }设置void TMR6_StartAll(void) { TMR6_Start(CM_TMR6_1); TMR6_Start(CM_TMR6_2); TMR6_Start(CM_TMR6_3); } void TMR6_StopAll(void) { TMR6_Stop(CM_TMR6_1); TMR6_Stop(CM_TMR6_2); TMR6_Stop(CM_TMR6_3); } void TMR6_SetDuty(CM_TMR6_TypeDef *tmrUnit, uint8_t duty) { uint32_t compareValue; if (duty 100) duty 100; compareValue (PWM_PERIOD * duty) / 100; // 更新 PWMA 和 PWMB 的比较值两者相同 TMR6_SetCompareValue(tmrUnit, TMR6_CMP_REG_A, compareValue); TMR6_SetCompareValue(tmrUnit, TMR6_CMP_REG_B, compareValue); } void TMR6_SyncStartAll(void) { // 使用软件同步功能同时启动 TMR6_1, TMR6_2, TMR6_3 TMR6_SWSyncStart(TMR6_SW_SYNC_ALL); } void TMR6_SyncStopAll(void) { TMR6_SWSyncStop(TMR6_SW_SYNC_ALL); }主函数int main(void) { // 系统时钟初始化 (假设已配置为200MHz) // SystemClock_Config(); /* Unlock peripherals or registers */ LL_PERIPH_WE(LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM); // 配置GPIO GPIO_Config(); // 初始化三路互补PWM TMR6_AllPWM_Init(); // 启动所有PWM方式1分别启动 // TMR6_StartAll(); // 或使用软件同步同时启动方式2推荐 TMR6_SyncStartAll(); while (1) { // 示例动态调整占空比 //// TMR6_SetDuty(CM_TMR6_1, 30); // 第一路 30% //// TMR6_SetDuty(CM_TMR6_2, 60); // 第二路 60% //// TMR6_SetDuty(CM_TMR6_3, 90); // 第三路 90% // delay_ms(1000); } }实验结果
RELATED

相关推荐

Windows网络性能测试终极指南:iperf3完整下载与3步安装教程

Windows网络性能测试终极指南:iperf3完整下载与3步安装教程

Windows网络性能测试终极指南:iperf3完整下载与3步安装教程 【免费下载链接】iperf3-win-builds iperf3 binaries for Windows. Benchmark your network limits. 项目地址: https://gitcode.com/gh_mirrors/ip/iperf3-win-builds 还在为网络速度不稳定而烦恼…

📅 2026/10/8 14:02:31
微信聊天记录备份恢复实战:从小米助手踩坑到可靠方案

微信聊天记录备份恢复实战:从小米助手踩坑到可靠方案

1. 一次数据丢失引发的“自救”行动那天下午,我像往常一样准备在手机上查找一份半年前和客户沟通的重要聊天记录,里面包含了项目需求的最终确认细节。当我熟练地打开微信,点开那个熟悉的头像,手指在屏幕上快速滑动时,心…

📅 2026/11/14 22:13:25
GPT 5.6混合专家模型架构解析与工程实践指南

GPT 5.6混合专家模型架构解析与工程实践指南

在实际 AI 技术演进中,每一次大模型版本的迭代都不仅仅是参数规模的提升,更是架构设计、训练方法、推理效率和实际应用场景的全面优化。GPT 5.6 作为备受关注的新一代语言模型,其核心价值在于如何将更强的性能转化为开发者和企业可落地的解决…

📅 2026/11/14 8:47:02
MORE NEWS

更多资讯

📰

校内能考电工证吗网上查询方法及复审流程全解析

校内能考电工证吗网上查询方法及复审流程全解析 证书过期了不知道怎么复审延期?网上查询又找不到入口?别急,今天我就从一个在南阳卧龙区培训机构摸爬滚打多年的老师傅角度,把电工证的报考、复审、继续教育、岗位风险、薪资水平等关键点讲清楚,让你少走弯…

📰

奉贤高压电工证多少钱官方回应来了,证书过期了不知道怎么复审延期?

奉贤高压电工证多少钱官方回应来了,证书过期了不知道怎么复审延期? 证书过期了不知道怎么复审延期?你不是一个人。最近不少周口房建工程的从业者都遇到了这个问题,特别是高压电工证这种高风险岗位的证书,一旦过期,不仅影响工作,还可能面临法律风险。…

📰

宜兴张渚电工证千万别踩坑,工地太忙根本没时间复习考试

宜兴张渚电工证千万别踩坑,工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这几乎是所有一线电工的真实写照。尤其是像宜兴张渚这样的施工集中地,电工证是上岗的“硬门槛”,可偏偏考试内容多、复习时间少,很多人因此踩了坑。别以为只要会拉线、…

📰

江浦哪里可以学电工证保姆级教程:怕考不过白交培训费就看这篇

江浦哪里可以学电工证保姆级教程:怕考不过白交培训费就看这篇 怕考不过白交培训费?江浦哪里可以学电工证,这可能是你最关心的问题。电工证不是随随便便就能拿下来的,报名流程、考试内容、复审规则,每一步都藏着门道。今天这篇保姆级教程,从江浦地区的培…

📰

绥化电工证哪家售后好怎么网上查询学历不高也能报

绥化电工证哪家售后好怎么网上查询学历不高也能报 你是不是总担心自己学历不高,根本报不上电工证?其实不然,很多电工证报考条件里对学历要求并不高,关键是你得知道怎么 网上查询…

📰

泉州市电工证培训电话官方回应:学历不高也能报考的真相

泉州市电工证培训电话官方回应:学历不高也能报考的真相 你是不是也担心自己学历不高,报不了电工证?别急,官方回应来了,告诉你一个好消息—— 学历门槛并不高…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬