找回密码
 立即注册
查看: 551|回复: 2

请教大神一个问题。PWM实时更新周期和占空比

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:385
  • 最近打卡:2025-05-01 08:05:45

25

主题

113

回帖

725

积分

高级会员

积分
725
发表于 2024-7-8 15:03:14 | 显示全部楼层 |阅读模式
我现在遇到这样一个问题。

P13输出PWM信号。其中周期和占空比可调(通过按键设置调节)
unsigned int pwm_fosc ;
unsigned char duty;


void PWMA_config(void)
{
        P_SW2 |= 0x80;                //SFR enable   

        PWMA_PSCR = 0;        // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
        PWMA_DTR  = 0;                // 死区时间配置,   n=0~127: DTR= n T,   0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,  
                                                // 对PWMB没有意义  0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T,   0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,

        PWMA_ARR = (24000000/pwm_fosc)-1;        // 自动重装载寄存器,  控制PWM周期  //   

        PWMA_CCER1  = 0;
        PWMA_CCER2  = 0;
        PWMA_SR1    = 0;
        PWMA_SR2    = 0;
        PWMA_ENO    = 0;                // IO输出允许,  允许PWM4N  PWM2N输出使能
        PWMA_PS     = 0;
        PWMA_IER    = 0;
        PWMA_CR1    = 0;

        PWMA_CCR2 = duty*(240000/pwm_fosc);        // 比较值, 控制占空比(高电平时钟数)         占空比的取值和周期PWMA——ARR 有关系。周期的除以100等于1%占空比。
        PWMA_CCMR2  = 0x68;                // 通道模式配置, PWM模式1, 预装载允许
        PWMA_CCER1 |= 0x50;                // 开启比较输出, 高电平有效
        PWMA_PS    |= (0<<2);        // 选择IO, 0:选择P1.2 P1.3, 1:选择P2.2 P2.3, 2:选择P6.2 P6.3,    实际接线是P13
        PWMA_ENO   |= 0x88;                // IO输出允许,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P

PWMA_BKR  = 0X80;  //主输出使能 相当于总开关
PWMA_CR1  = 0X81; //使能计数器,允许自动重装载寄存器缓冲,边缘对齐模式,向上计数。BIT7=1:写自动重装载寄存器缓冲(本周期不会被打扰)。
PWMA_EGR  = 0X01; //产生一次更新事件,清除计数器和预分频计数器,装载预分频寄存器的值
}



其中 pwm _fosc  和 duty 通过按键可以进行加减。
主函数中PWM初始化
当给 pwm _fosc =1000 和 duty=50直接赋值 .然后烧写进去  运行正常  频率1000.占空比50.
但是用按键更改 pwm _fosc  和 duty数值的时候。输出不会改变。
比如  pwm _fosc 按键调节到2000.但是输出依然是1000.如何能够让频率和占空比跟着变化。
我用一个笨办法  在定时器中断程序中写入PWMA_ARR = (24000000/pwm_fosc)-1;可以跟着变化  但是输出频率就有偏差。


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2024-7-8 18:11:21 | 显示全部楼层
操作扩展寄存器,要保证设置了  P_SW2 |= 0x80;     //SFR enable
否则,PWMA_ARR改变,频率必然会改变。当然,由1000变为1001,可能不明显,你可以改变大一些,比如改为500或1500试试。
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:385
  • 最近打卡:2025-05-01 08:05:45

25

主题

113

回帖

725

积分

高级会员

积分
725
发表于 2024-7-8 21:19:36 | 显示全部楼层
我现在是这样处理 的。打开PWM中断
void PWMA_isr() interrupt 26
{
        unsigned char a;
        a = PWMA_SR1 ;
        PWMA_SR1 = 0 ;
        if(a & 0x04)
        {
      if(pwm_fosc<600){        PWMA_PSCR = 9 ;         PWMA_ARR = (MAIN_FOSC/10/pwm_fosc)-1 ; PWMA_CCR2 = duty*((MAIN_FOSC/pwm_fosc)-1)/1000; }
            
      else            {        PWMA_PSCR = 0 ;  PWMA_ARR = (MAIN_FOSC/pwm_fosc) -1;    PWMA_CCR2 = duty*((MAIN_FOSC/pwm_fosc)-1)/100 ;  }
               
        }
}

也不知道有什么BUG
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 00:45 , Processed in 0.110321 second(s), 57 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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