zcllom 发表于 2023-5-7 22:44:34

奇了怪了,STC8H4K无论怎么设置PWM频率,它一直都是37.4KHz(已解决!)

本帖最后由 zcllom 于 2023-5-8 02:16 编辑

void Adjust_Pump_PWM_Init(void)    //主频率22.1184MHz
{
    PWMA_ENO = 0x00;
    PWMA_ENO |= ENO2P;                        //使能输出PWM2P
    PWMA_PS = 0x00;                           //高级 PWM 通道输出脚选择位
   PWMA_PS |= PWM2_1;                        //选择 PWM2_1 通道

    PWMA_BKR = 0x80;                            //使能主输出
    PWMA_CR1 |= 0x01;                           //开始计时

      PWMA_PSCR = 0x0007;

      PWMA_ARR = 0x0100;

      PWMA_CCR2 = 0x0000;

}


神农鼎 发表于 2023-5-7 22:57:03





zcllom 发表于 2023-5-7 23:18:54

神农鼎 发表于 2023-5-7 22:57


你这个例子里根本就没有分频率设置,没多少借鉴价值

zcllom 发表于 2023-5-8 00:07:09

我用的是P5.4引脚,是不是针对它还要做什么特别的设置?

zcllom 发表于 2023-5-8 02:15:39

自己找到问题了,因为我在循环中不断地刷新PWMA_CCR2的值,然后清标志位PWMA_SR1=0,清计数器PWMA_CNTR=0,造成频率错乱!!
现在改成判断是否有新的占空比产生,有就给PWMA_CCR2赋值,没有就保持不变,然后就好了。
另外我想了解一下:重新给PWMA_CCR2赋值后,是否需要把:标志位PWMA_SR1清零?把计数器PWMA_CNTR清零?

乘风飞扬 发表于 2023-5-8 09:14:42

zcllom 发表于 2023-5-8 02:15
自己找到问题了,因为我在循环中不断地刷新PWMA_CCR2的值,然后清标志位PWMA_SR1=0,清计数器PWMA_CNTR=0, ...

不需要,如果想动态更新占空比的话建议开启对应的预装载功能:



梁工 发表于 2023-5-8 14:15:38

zcllom 发表于 2023-5-8 02:15
自己找到问题了,因为我在循环中不断地刷新PWMA_CCR2的值,然后清标志位PWMA_SR1=0,清计数器PWMA_CNTR=0, ...

占空比需要改变时,给PWMA_CCR2赋值即可,不需要整其他的。

zcllom 发表于 2023-5-8 23:16:13

梁工 发表于 2023-5-8 14:15
占空比需要改变时,给PWMA_CCR2赋值即可,不需要整其他的。

那让PWM暂时停下来,需要关闭它的相关寄存器设置吗?

梁工 发表于 2023-5-8 23:18:04

zcllom 发表于 2023-5-8 23:16
那让PWM暂时停下来,需要关闭它的相关寄存器设置吗?

STC8H系列的高级PWM,连续输出0或1有2种方法(以PWM1P为例):

1、使用PWMx_ENO禁止输出PWM,对应IO成为普通IO,禁止PWM输出后,由这个IO直接输出高或低电平。
PWMA_ENO |= 0x01;   // 允许PWM1P输出
delay_ms(5);      // P1.0输出PWM 5ms
P10 = 1;            // P1.0输出高电平
PWMA_ENO &= ~0x01;// 关闭PWM输出
delay_ms(5);      // P1.0输出高电平5ms
               
PWMA_ENO |= 0x01;   // 允许PWM1P输出
delay_ms(5);      // P1.0输出PWM 5ms
P10 = 0;            // P1.0输出低电平
PWMA_ENO &= ~0x01;// 关闭PWM输出
delay_ms(5);      // P1.0输出高电平5ms

2、设置PWMx_CCMRn,强制PWM输出有效(高)电平/无效(低)电平。
PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x60;// PWM正常输出
delay_ms(5);                               // PWM输出5ms
PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x40;// 强制PWM输出无效(低)电平
delay_ms(5);                               // PWM输出低电平5ms
PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x60;// PWM正常输出
delay_ms(5);                               // PWM输出5ms
PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x50;//强制PWM输出有效(高)电平
delay_ms(5);                               // PWM输出高电平5ms

zcllom 发表于 2023-5-9 00:03:39

梁工 发表于 2023-5-8 23:18
STC8H系列的高级PWM,连续输出0或1有2种方法(以PWM1P为例):

1、使用PWMx_ENO禁止输出PWM,对应IO成为 ...

第二个方法,设置PWMX_CCMRn,改写PWMX_CCMRn这个寄存器时,是否需要先设置PWMX_CCER1 = 0   把通道关闭一下?
页: [1] 2
查看完整版本: 奇了怪了,STC8H4K无论怎么设置PWM频率,它一直都是37.4KHz(已解决!)