[技术问答]

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

[复制链接]
4740|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。
时钟配置:
        Sysctrl_SetRCLTrim(SysctrlRclFreq32768);
        Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
        Sysctrl_SysClkSwitch(SysctrlClkRCL);

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


ADT4配置:
    Sysctrl_SetPeripheralGate(SysctrlPeripheralAdvTim, TRUE);     //ADT外设时钟使能
   
    stcAdtBaseCntCfg.enCntMode = AdtSawtoothMode;
    stcAdtBaseCntCfg.enCntDir = AdtCntUp;
    stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0;
    Adt_Init(M0P_ADTIM4, &stcAdtBaseCntCfg);                      //ADT载波、计数模式、时钟配置
   
    Adt_SetPeriod(M0P_ADTIM4, 99);                         //周期值
   
    Adt_SetCompareValue(M0P_ADTIM4, AdtCompareA, 49);    //通用比较基准值寄存器A设置   
    Adt_SetCompareValue(M0P_ADTIM4, AdtCompareB, 49);    //通用比较基准值寄存器B设置
   
    Adt_EnableValueBuf(M0P_ADTIM4, AdtCHxA, FALSE);    //缓存传送A使能 GCMCR--->GCMAR,三角波A模式在下溢点传送
    Adt_EnableValueBuf(M0P_ADTIM4, AdtCHxB, FALSE);
   
    stcAdtTIM4ACfg.enCap = AdtCHxCompareOutput;    //比较输出模式
    stcAdtTIM4ACfg.bOutEn = TRUE;                  //CHA输出使能
    stcAdtTIM4ACfg.enPerc = AdtCHxPeriodKeep;      //计数值与周期匹配时CHA电平保持不变
    stcAdtTIM4ACfg.enCmpc = AdtCHxCompareInv;      //计数值与比较值A匹配时,CHA电平翻转
    stcAdtTIM4ACfg.enStaStp = AdtCHxStateSelSS;    //CHA起始结束电平由STACA与STPCA控制
    stcAdtTIM4ACfg.enStaOut = AdtCHxPortOutLow;    //CHA起始电平为低
    stcAdtTIM4ACfg.enStpOut = AdtCHxPortOutLow;    //CHA结束电平为低
    Adt_CHxXPortCfg(M0P_ADTIM4, AdtCHxA, &stcAdtTIM4ACfg);   //端口CHA配置
   
    stcAdtTIM4BCfg.enCap = AdtCHxCompareOutput;
    stcAdtTIM4BCfg.bOutEn = TRUE;
    stcAdtTIM4BCfg.enPerc = AdtCHxPeriodKeep;
    stcAdtTIM4BCfg.enCmpc = AdtCHxCompareInv;
    stcAdtTIM4BCfg.enStaStp = AdtCHxStateSelSS;
    stcAdtTIM4BCfg.enStaOut = AdtCHxPortOutLow;
    stcAdtTIM4BCfg.enStpOut = AdtCHxPortOutLow;    //CHB结束电平为低
    Adt_CHxXPortCfg(M0P_ADTIM4, AdtCHxB, &stcAdtTIM4BCfg);   //端口CHB配置

//    Adt_SetDTUA(M0P_ADTIM4, 0x2000);  //CNT向上计数时的死区时间,GCMBR = GCMAR - DTUAR
//    Adt_SetDTDA(M0P_ADTIM4, 0x2000);  //CNT向下计数时的死区时间,GCMBR = GCMAR - DTDAR
//    Adt_CfgDT(M0P_ADTIM4, TRUE, TRUE); //中断使能,并且DTUAR和DTDAR自动相等
   
    Adt_ClearAllIrqFlag(M0P_ADTIM4);          //清标志位
//    Adt_CfgIrq(M0P_ADTIM4, AdtUDFIrq, TRUE);  //下溢中断配置
//    EnableNvic(ADTIM4_IRQn, IrqLevel3, TRUE); //使能AdvTimer4 中断
    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

粉丝