fsy 发表于 2025-5-18 13:24:58

请教PWM频率

梁工及各位朋友请教一个问题,先谢谢。目前用STC8G2K64S4用PWM控制LED的亮度基本是正常工作,PWM的时钟为系统时钟,如果系统用11.0592的频率,那么PWM的频率最高只能为2.7KHz左右,如何将这个PWM的频率提高到20KHz左右?

如果在烧写时将频率设置为22.1184,最大也只有5.4KHz左右,离20KHz还远。
如果PWM时钟选择定时器T2的溢出作为时钟,最大可以到多少?

国芯人工智能 发表于 2025-5-18 13:28:00

在STC8G2K64S4LED的PWM驱动中,频率的设置对LED的亮度和驱动性能至关重要。以下是对如何提高PWM频率的详细说明:

1. PWM频率的设置方式
定时器T2的溢出作为时钟:STC8G2K64S4是基于定时器T2的LED驱动芯片,其时钟频率由定时器T2的溢出输出决定。通常,STC8G2K64S4的定时器T2最大支持16位正序计数器,其时钟频率为1 MHz(即2^16 Hz)。
频率计算:当定时器T2的溢出作为时钟时,其最大时钟频率为1 MHz。为了提高频率,可以通过调整定时器T2的正序计数器位数来实现。例如,将正序计数器设置为1024(即2^10),则时钟频率为约976 MHz,这显然高于实际工作频率。然而,1024位计数器通常用于更高的时钟频率,如10 MHz或更高。因此,实际频率的计算需要结合定时器的位数和正序计数器的设置。

2. 如何提高PWM频率
使用更高的定时器位数:将定时器T2的正序计数器位数增加到16位。例如,将正序计数器设置为1024,此时定时器的时钟频率为约976 MHz。然而,实际驱动时会根据LED的驱动能力(如FRC100)来调整时钟频率。
使用溢出作为时钟:当定时器T2的溢出作为时钟时,时钟频率为1 MHz。通过调整正序计数器的位数,可以将时钟频率扩展到更高的值。例如,将正序计数器设置为2048(即2^11),此时定时器的时钟频率为约500 MHz。然而,实际驱动时会根据LED的驱动能力(如FRC100)来调整时钟频率。
结合FRC100设置:FRC100(Fundamental Frequency Reference Module 100)可以将时钟频率调至更高的值,例如10 MHz或更高。通过设置FRC100,可以进一步提高PWM的时钟频率。

3. 如何将PWM频率提高到20KHz左右
定时器T2的溢出作为时钟:将定时器T2的正序计数器位数增加到16位,将正序计数器设置为1024。此时,定时器的时钟频率为约976 MHz。然而,实际驱动时会根据LED的驱动能力(如FRC100)来调整时钟频率。例如,如果FRC100设置为10 MHz,此时PWM的时钟频率为约10 MHz,远高于20KHz。
调整FRC100设置:如果需要将PWM频率提高到20KHz,可以通过调整FRC100的设置来实现。例如,将FRC100的频率设置为20 MHz,此时PWM的时钟频率为约20 MHz。然而,实际驱动时会根据LED的驱动能力(如FRC100)来调整时钟频率。例如,如果FRC100设置为10 MHz,此时PWM的时钟频率为约10 MHz,远高于20KHz。

4. 总结
将定时器T2的正序计数器位数增加到16位,将正序计数器设置为1024,此时定时器的时钟频率为约976 MHz。然而,实际驱动时会根据LED的驱动能力(如FRC100)来调整时钟频率。
如果需要将PWM频率提高到20KHz左右,可以通过调整FRC100的设置来实现。例如,将FRC100的频率设置为20 MHz,此时PWM的时钟频率为约20 MHz。然而,实际驱动时会根据LED的驱动能力(如FRC100)来调整时钟频率。

5. 注意事项
定期检查频率:定期检查PWM的时钟频率,以确保LED的工作环境稳定。如果发现频率不稳定,可能需要重新调整定时器的设置。
查阅资料:确保使用正确的定时器和设置,以避免因误用导致的频率问题。参考相关资料,如STC8G2K64S4的PDF手册,以确保设置的正确性和安全性。

希望以上信息对您有所帮助!如果还有其他问题,欢迎随时咨询。

[本文内容由国芯人工智能辅助生成,仅供参考]

fsy 发表于 2025-5-18 13:51:43

国芯人工智能 发表于 2025-5-18 13:28
在STC8G2K64S4LED的PWM驱动中,频率的设置对LED的亮度和驱动性能至关重要。以下是对如何提高PWM频率的详细 ...

如果用T2, 会在P1.3口上不断输出高低电平,是吗?这个就得改硬件了呀

DebugLab 发表于 2025-5-18 15:17:03

使用的是15位增强PWM还是PCA?
降低PWM位数可以提高频率

fsy 发表于 2025-5-18 18:25:33

DebugLab 发表于 2025-5-18 15:17
使用的是15位增强PWM还是PCA?
降低PWM位数可以提高频率

谢谢回复。这是初始化,麻烦看看如何降低PWM位数?

void pwm_init(){

   PWMSET = 0x08;          //使能 PWM3 模块(必须先使能模块后面的设置才有效)
   PWMSET = 0x0c;          //使能 PWM3+PWM4模块(必须先使能模块后面的设置才有效)

   P_SW2 = 0x80;//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写
   PWM0CKS = 0x00;//PWM0 时钟为系统时钟

   PWM2CKS = 0x00;    //0000   //2.7KHz   370.0us          1
   PWM3CKS = 0x00;
   PWM3C = 0x1000;//设置 PWM3 周期为 1000H 个 PWM 时钟R1+G1;R2+G2;R3+G3
   PWM2C = 0x1000;//设置 PWM2 周期为 1000H 个 PWM 时钟R4+G4;R5+G5
   //PWM00T1= 0x0100;//在计数值为 100H 地方 PWM00 通道输出低电平
        PWM32T1= 0x1000;//R1--在计数值为 100H 地方 PWM32 通道输出低电平PWM32T1=0x1000!!!!//输出占空比=0,不亮
      PWM33T1= 0x1000;//G1

        PWM34T1= 0x1000;//R2
        PWM35T1= 0x1000;//G2       
        PWM36T1= 0x1000;//R3
        PWM37T1= 0x1000;//G3

        PWM20T1= 0x1000;//R4
        PWM21T1= 0x1000;//G4

        PWM22T1= 0x1000;//R5
        PWM23T1= 0x1000;//G5
        PWM32T2= LEVEL;//R1--在计数值为 500H 地方 PWM32 通道输出高电平//输出占空比=0,不亮
        PWM33T2= LEVEL;//G1
        PWM34T2= LEVEL;//R2--在计数值为 500H 地方 PWM34 通道输出高电平//输出占空比=0,不亮
        PWM35T2= LEVEL;//G2

        PWM36T2= LEVEL;//R3--在计数值为 500H 地方 PWM36 通道输出高电平//输出占空比=0,不亮
        PWM37T2= LEVEL;//G3

        PWM20T2= LEVEL;//R4--在计数值为 500H 地方 PWM20 通道输出高电平//输出占空比=0,不亮
        PWM21T2= LEVEL;//G4

        PWM22T2= LEVEL;//R5--在计数值为 500H 地方 PWM22 通道输出高电平//输出占空比=0,不亮
        PWM23T2= LEVEL;//G5
//---------------------------------------------------------------------       
      //PWM00CR= 0x80;    //使能 PWM00 输出
      PWM32CR= 0x80;      //使能 PWM32 输出   R1
      PWM33CR= 0x80;      //使能 PWM33 输出   G1

      PWM34CR= 0x80;      //使能 PWM34 输出   R2
      PWM35CR= 0x80;      //使能 PWM35 输出   G2

      PWM36CR= 0x80;      //使能 PWM34 输出   R3
      PWM37CR= 0x80;      //使能 PWM35 输出   G3

      PWM20CR= 0x80;      //使能 PWM20 输出   R4
      PWM21CR= 0x80;      //使能 PWM21 输出   G4

      PWM22CR= 0x80;      //使能 PWM22 输出   R5
      PWM23CR= 0x80;      //使能 PWM23 输出   G5
   //PWMCFG01 = 0x01;//启动 PWM0 模块
   //PWMCFG23 = 0x10;//启动 PWM3 模块 控制 R1,G1;R2,G2,R3,G3,
   PWMCFG23 = 0x11;    //启动PWM3模-->控制R1,G1;R2,G2,R3,G3;启动PWM2模-->控制R4,G4;R5,G5,
}                                  

DebugLab 发表于 2025-5-18 18:37:07

fsy 发表于 2025-5-18 18:25
谢谢回复。这是初始化,麻烦看看如何降低PWM位数?

void pwm_init(){

修改周期即可

当前是4096(12位PWM)



fsy 发表于 2025-5-18 19:02:44

DebugLab 发表于 2025-5-18 18:37
修改周期即可

当前是4096(12位PWM)

感谢!我马上试一试,看最高可以到多少?

fsy 发表于 2025-5-18 20:14:51

DebugLab 发表于 2025-5-18 18:37
修改周期即可

当前是4096(12位PWM)

试了一下,这个1000H只能改大,如改为2000H,频率下降一半,但不能改小,改小后不能工作,没有产生PWM波形,这是哪里设置不对吗?

fsy 发表于 2025-5-18 20:39:24

STC8G2K64S4, 内部晶振选11.0592,PWM3CKS = 0x00;//PWM3 时钟为系统时钟,不分频,PWM3C = 0x1000;//设置 PWM3 周期为 1000H 个 PWM 时钟,这时示波器测试约2.7KHz。    烧写时如设置IRC频率22.1184,则测试PWM频率约5.4KHz。据手册说明,再将IRC频率设置高,将造成工作不稳定。能做到20KHz左右吗?

fsy 发表于 2025-5-19 02:35:17

谢谢超级版主的指导,现已经基本调试正常。烧写时选22.1184,PWM频率最高可以达到21.5KHz,基本满足设计需求。谢谢超版!
页: [1] 2
查看完整版本: 请教PWM频率