果果爱吃土豆 发表于 2024-11-26 17:41:44

系统主频是24MHz,怎么调整pwm的赫兹是1Hz

STC8A8K64D芯片设置15bit的pwm,
主频是24MHz,现在需要将P6.3引脚的pwm初始化成1Hz频率,50%占空比,
请问如下这个代码**位置需要怎么计算获取,我没看到手册里面描述的计算公式

void PWM15_config(void) {
    PWM15_InitTypeDef PWM15_InitStructure;

    PWM15_InitStructure.PWM_Enable    = ENABLE;
    PWM15_InitStructure.PWM_Period    = **;   
    PWM15_InitStructure.PWM_Clock_Sel = PWM_CLK_SYS;
    PWM15_InitStructure.PWM_Clock_PS= **;;
    PWM15_InitStructure.PWM_CInt      = DISABLE;
    PWM15_InitStructure.PWM_Counter   = ENABLE;
    PWM15_Init(&PWM15_InitStructure);


    PWM15Duty(PWM15_3, **/2, **); // 50% 占空比
    PWMChannelCtrl(PWM15_3, ENABLE, PWM15_SW_P2, 0, DISABLE, DISABLE, DISABLE);
}


DebugLab 发表于 2024-11-26 20:34:46









SELT2=0,分母最大值仍然不够24M
所以只能SELT2=1


定时器配置为0x10000-24000,溢出频率1000Hz
+1=1000
=999



PWMCH=0x03

PWMCL=0xE7







T2H=0x5D
T2L=0xC0

Yim_Hom 发表于 2024-11-26 21:13:26

本帖最后由 Yim_Hom 于 2024-11-26 21:22 编辑

15位PWM说的是2的15次方,所以计数最大32767,最大预分频系数PS全写1再去加1也只有16分频,单纯24M的系统时钟去分频再计数,到不了1Hz。所以楼上是正解,但是很有可能双串口的情况下,共用定时器2,所以定时器方式你可能也用不了。怎么办呢?
我最初也被这个问题困扰过,想办法把定时器2腾出来就去干PWM这个事,要不就是把24降一半到12M或者11.0592M,12M/16/32767,频率能到21至23之间,然后假装21Hz就是1Hz,用比例去换算。
当然,也可以换成STC8H的16位。15位到16位多了1位,但分频值却可以在1-65535之间去选,这样至少比8A8K的15+1范围大了去了。24M以60000分频,分出来就是400。

小坤 发表于 2024-11-26 21:36:37

1HZ上定时器

梁工 发表于 2024-11-26 22:01:25

选择定时器2溢出率做PWM时钟。
定时器2工作于1T,则PWM最低频率为:24000000/65536/32768=0.011176Hz。
定时器2工作于12T,则PWM最低频率为:24000000/12/65536/32768=0.0009313Hz。
你要1Hz,可以这样:定时器2工作于1T模式溢出率为24000000/2400=10000Hz,PWM周期为10000,就是1Hz。

VCC 发表于 2024-11-27 00:08:17

梁工 发表于 2024-11-26 22:01
选择定时器2溢出率做PWM时钟。
定时器2工作于1T,则PWM最低频率为:24000000/65536/32768=0.011176Hz。
...

赞!学到了,居然还有这个功能

溢出一次,PWM计数器才增加1{:4_167:}

那如果PWM最低频率0.0009313Hz

岂不是每1073秒,PWM才完成一个周期{:4_167:}

梁工 发表于 2024-11-27 08:16:02

VCC 发表于 2024-11-27 00:08
赞!学到了,居然还有这个功能

溢出一次,PWM计数器才增加1


那是

bkeuqoaq 发表于 2024-11-27 09:52:14

软件模拟省事些

Lkck8210 发表于 2024-11-27 10:01:53

50%占空比是不是固定?
PWM分辨率要多少位?
1Hz是很慢的
随便用个定时器来软件模拟就行
页: [1]
查看完整版本: 系统主频是24MHz,怎么调整pwm的赫兹是1Hz