奇了怪了,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
你这个例子里根本就没有分频率设置,没多少借鉴价值 我用的是P5.4引脚,是不是针对它还要做什么特别的设置? 自己找到问题了,因为我在循环中不断地刷新PWMA_CCR2的值,然后清标志位PWMA_SR1=0,清计数器PWMA_CNTR=0,造成频率错乱!!
现在改成判断是否有新的占空比产生,有就给PWMA_CCR2赋值,没有就保持不变,然后就好了。
另外我想了解一下:重新给PWMA_CCR2赋值后,是否需要把:标志位PWMA_SR1清零?把计数器PWMA_CNTR清零? zcllom 发表于 2023-5-8 02:15
自己找到问题了,因为我在循环中不断地刷新PWMA_CCR2的值,然后清标志位PWMA_SR1=0,清计数器PWMA_CNTR=0, ...
不需要,如果想动态更新占空比的话建议开启对应的预装载功能:
zcllom 发表于 2023-5-8 02:15
自己找到问题了,因为我在循环中不断地刷新PWMA_CCR2的值,然后清标志位PWMA_SR1=0,清计数器PWMA_CNTR=0, ...
占空比需要改变时,给PWMA_CCR2赋值即可,不需要整其他的。 梁工 发表于 2023-5-8 14:15
占空比需要改变时,给PWMA_CCR2赋值即可,不需要整其他的。
那让PWM暂时停下来,需要关闭它的相关寄存器设置吗? 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
梁工 发表于 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