[技术问答] HC32F073,内部高速时钟8M,使用ADT4输出PWM,为啥只能得到与...

[复制链接]
5438|5
 楼主| kfhzy 发表于 2021-7-20 09:21 | 显示全部楼层 |阅读模式
本帖最后由 kfhzy 于 2021-7-20 09:24 编辑

HC32F073,内部高速时钟8M,使用ADT4输出PWM,只能得到与配置值一半的时钟频率,我的PCLK配置为8M,ADT4的周期配置为100-1,按照计算应该是80kHz的PWM输出,可是实际输出只有40kHz,找了规格书,也没搞明白哪里弄错了,另外用TIM0进行计时,也用的PCLK,测试输出显示PCLK确实是8M。
时钟配置:
  1.         Sysctrl_SetRCLTrim(SysctrlRclFreq32768);
  2.         Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
  3.         Sysctrl_SysClkSwitch(SysctrlClkRCL);

  4.         ///< 加载目标频率的RCH的TRIM值
  5.         Sysctrl_SetRCHTrim(SysctrlRchFreq8MHz);
  6.         ///< 使能RCH(默认打开,此处可不需要再次打开)
  7.         //Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE);
  8.         ///< 时钟切换到RCH
  9.         Sysctrl_SysClkSwitch(SysctrlClkRCH);
  10.         ///< 关闭RCL时钟
  11.         Sysctrl_ClkSourceEnable(SysctrlClkRCL, FALSE);
  12.         
  13.         
  14.         SystemCoreClock = 8000000;


ADT4配置:
  1.     Sysctrl_SetPeripheralGate(SysctrlPeripheralAdvTim, TRUE);     //ADT外设时钟使能
  2.    
  3.     stcAdtBaseCntCfg.enCntMode = AdtSawtoothMode;
  4.     stcAdtBaseCntCfg.enCntDir = AdtCntUp;
  5.     stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0;
  6.     Adt_Init(M0P_ADTIM4, &stcAdtBaseCntCfg);                      //ADT载波、计数模式、时钟配置
  7.    
  8.     Adt_SetPeriod(M0P_ADTIM4, 99);                         //周期值
  9.    
  10.     Adt_SetCompareValue(M0P_ADTIM4, AdtCompareA, 49);    //通用比较基准值寄存器A设置   
  11.     Adt_SetCompareValue(M0P_ADTIM4, AdtCompareB, 49);    //通用比较基准值寄存器B设置
  12.    
  13.     Adt_EnableValueBuf(M0P_ADTIM4, AdtCHxA, FALSE);    //缓存传送A使能 GCMCR--->GCMAR,三角波A模式在下溢点传送
  14.     Adt_EnableValueBuf(M0P_ADTIM4, AdtCHxB, FALSE);
  15.    
  16.     stcAdtTIM4ACfg.enCap = AdtCHxCompareOutput;    //比较输出模式
  17.     stcAdtTIM4ACfg.bOutEn = TRUE;                  //CHA输出使能
  18.     stcAdtTIM4ACfg.enPerc = AdtCHxPeriodKeep;      //计数值与周期匹配时CHA电平保持不变
  19.     stcAdtTIM4ACfg.enCmpc = AdtCHxCompareInv;      //计数值与比较值A匹配时,CHA电平翻转
  20.     stcAdtTIM4ACfg.enStaStp = AdtCHxStateSelSS;    //CHA起始结束电平由STACA与STPCA控制
  21.     stcAdtTIM4ACfg.enStaOut = AdtCHxPortOutLow;    //CHA起始电平为低
  22.     stcAdtTIM4ACfg.enStpOut = AdtCHxPortOutLow;    //CHA结束电平为低
  23.     Adt_CHxXPortCfg(M0P_ADTIM4, AdtCHxA, &stcAdtTIM4ACfg);   //端口CHA配置
  24.    
  25.     stcAdtTIM4BCfg.enCap = AdtCHxCompareOutput;
  26.     stcAdtTIM4BCfg.bOutEn = TRUE;
  27.     stcAdtTIM4BCfg.enPerc = AdtCHxPeriodKeep;
  28.     stcAdtTIM4BCfg.enCmpc = AdtCHxCompareInv;
  29.     stcAdtTIM4BCfg.enStaStp = AdtCHxStateSelSS;
  30.     stcAdtTIM4BCfg.enStaOut = AdtCHxPortOutLow;
  31.     stcAdtTIM4BCfg.enStpOut = AdtCHxPortOutLow;    //CHB结束电平为低
  32.     Adt_CHxXPortCfg(M0P_ADTIM4, AdtCHxB, &stcAdtTIM4BCfg);   //端口CHB配置

  33. //    Adt_SetDTUA(M0P_ADTIM4, 0x2000);  //CNT向上计数时的死区时间,GCMBR = GCMAR - DTUAR
  34. //    Adt_SetDTDA(M0P_ADTIM4, 0x2000);  //CNT向下计数时的死区时间,GCMBR = GCMAR - DTDAR
  35. //    Adt_CfgDT(M0P_ADTIM4, TRUE, TRUE); //中断使能,并且DTUAR和DTDAR自动相等
  36.    
  37.     Adt_ClearAllIrqFlag(M0P_ADTIM4);          //清标志位
  38. //    Adt_CfgIrq(M0P_ADTIM4, AdtUDFIrq, TRUE);  //下溢中断配置
  39. //    EnableNvic(ADTIM4_IRQn, IrqLevel3, TRUE); //使能AdvTimer4 中断
  40.     Adt_StartCount(M0P_ADTIM4);
martinhu 发表于 2021-7-20 10:00 | 显示全部楼层
可能你没怎么看懂ADT的PWM调制原理,楼主这个匹配逻辑设置的问题,所有频率只有你想要的一半,这里是周期匹配和比较匹配,一个设置成输出低电平,一个设置成输出高电平就可以了,
具体哪个输出高或者低,根据你自己的需求,是占空比随着比较值成正比还是反比来确定。

7431460f62dd1e6b65.png

sgrtf661 发表于 2021-7-20 10:29 | 显示全部楼层
华大代理  QQ:409946461 可以技术支持[
 楼主| kfhzy 发表于 2021-7-20 11:56 | 显示全部楼层
martinhu 发表于 2021-7-20 10:00
可能你没怎么看懂ADT的PWM调制原理,楼主这个匹配逻辑设置的问题,所有频率只有你想要的一半,这里是周期匹 ...

多谢,频率的问题已经解决了,现在正在搞占空比。不知为什么,比较值设置为周期值一半的时候,得不到50%占空比,只有22%多
mutable 发表于 2021-7-20 13:09 | 显示全部楼层
路过,学习了解~~
martinhu 发表于 2021-7-20 19:08 | 显示全部楼层
kfhzy 发表于 2021-7-20 11:56
多谢,频率的问题已经解决了,现在正在搞占空比。不知为什么,比较值设置为周期值一半的时候,得不到50% ...

还是我刚才提到的那两个参数的设置,你原先的设置,只适合三角波调制的PWM,
锯齿波调制的PWM,是指定周期匹配和比较匹配的适合,输出高电平或者低电平,不要翻转。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

113

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部