[技术问答] HC32F460的Timer63 PWMB始终只输出40Hz的PWM

[复制链接]
 楼主| Ansersion 发表于 2020-4-18 12:25 | 显示全部楼层 |阅读模式
  1. void BuzzerInit(void)
  2. {
  3.     stc_timer6_basecnt_cfg_t         stcTIM6BaseCntCfg;
  4.     stc_timer6_port_output_cfg_t     stcTIM6PWMxCfg;
  5.     stc_port_init_t                  stcPortInit;
  6.         stc_clk_freq_t stcClkTmp;
  7.     stc_timer6_gcmp_buf_cfg_t        stcGCMPBufCfg;
  8.    
  9.         MEM_ZERO_STRUCT(stcTIM6BaseCntCfg);
  10.     MEM_ZERO_STRUCT(stcTIM6PWMxCfg);
  11.     MEM_ZERO_STRUCT(stcPortInit);
  12.     MEM_ZERO_STRUCT(stcClkTmp);
  13.     MEM_ZERO_STRUCT(stcGCMPBufCfg);
  14.    
  15.     CLK_GetClockFreq( &stcClkTmp );
  16.        
  17.         PWC_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TIM63, Enable);

  18.     PORT_SetFunc(PortB, Pin01, Func_Tim6, Disable);    //Timer63 PWMA
  19.        
  20.         stcTIM6BaseCntCfg.enCntMode   = Timer6CntSawtoothMode;              //Sawtooth wave mode
  21.     stcTIM6BaseCntCfg.enCntDir    = Timer6CntDirUp;                     //Counter counting up
  22.     stcTIM6BaseCntCfg.enCntClkDiv = Timer6PclkDiv64;                     //Count clock: pclk0
  23.     Timer6_Init(M4_TMR63, &stcTIM6BaseCntCfg);                          //timer6 PWM frequency, count mode and clk config
  24.        
  25.         uint16_t u16Period = SystemCoreClock / BUZ_PWM_PSC / BUZZER_FREQ_HZ;
  26.     Timer6_SetPeriod(M4_TMR63, Timer6PeriodB, u16Period);               //period set

  27.     uint16_t u16Compare = u16Period / 2;
  28.     Timer6_SetGeneralCmpValue(M4_TMR63, Timer6GenCompareB, u16Compare);    //Set General Compare RegisterA Value

  29.     /*PWMB output buf config*/
  30.     stcTIM6PWMxCfg.enPortMode = Timer6ModeCompareOutput;    //Compare output function
  31.     stcTIM6PWMxCfg.bOutEn     = true;                       //Output enable
  32.     stcTIM6PWMxCfg.enPerc     = Timer6PWMxCompareLow;       //PWMB port output Low level when CNTER value match PERAR
  33.     stcTIM6PWMxCfg.enCmpc     = Timer6PWMxCompareHigh;      //PWMB port output High level when CNTER value match with GCMAR
  34.     stcTIM6PWMxCfg.enStaStp   = Timer6PWMxStateSelSS;       //PWMB output status is decide by STACA STPCA when CNTER start and stop
  35.     stcTIM6PWMxCfg.enStaOut   = Timer6PWMxPortOutHigh;       //PWMB port output set low level when CNTER start
  36.     stcTIM6PWMxCfg.enStpOut   = Timer6PWMxPortOutLow;       //PWMB port output set low level when CNTER stop
  37.     stcTIM6PWMxCfg.enDisVal   = Timer6PWMxDisValLow;
  38.     Timer6_PortOutputConfig(M4_TMR63, Timer6PWMB, &stcTIM6PWMxCfg);
  39.           M4_TMR63->CNTER_f.CNT = 0;
  40.           M4_TMR63->GCONR_f.START = 1;       
  41.         BuzzerOff();
  42. }


我现在想动态调整PB1的Pwm波来驱动蜂鸣器。
在以上代码最后一行(BuzzerOff)打断点,PB1引脚始终只输出40Hz的波形,手动调整以上代码中的局部变量u16Period为1000,2500等,都只有40Hz的Pwm波,还望哪位高人提点一二
martinhu 发表于 2020-4-18 13:45 | 显示全部楼层
你是要在PWM输出的情况下动态调PWM的频率吗?需要设置周期寄存器才可以更改频率。然后需要设置周期寄存器的换成传送,如下图,开启单缓存传送,
之后在程序运行的时候,只要给PERBR寄存器赋值就可以了改频率了:Timer6_SetPeriod(M4_TMR61, Timer6PeriodB, u16Period);   
但是注意,比较值寄存器的值不能大于周期寄存器的值。
63935e9a9365d63b6.png


您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

72

帖子

4

粉丝
快速回复 返回顶部 返回列表