lier378912453 发表于 2024-7-4 10:50:48

硬件PWM设置后,无波形输出

单片机型号:STC8H4K64TL      使能3P (P2.4) 4P(P2.6)



#include "moto_pwm.h"
#include "STC8H_PWM.h"
u8 p3_duty=100;
u8 p4_duty=100;
/***************PWM始化函数 *****************/

#define PWM3_2      0x10        //P:P2.4N:P2.5 //
#define PWM4_2      0x40        //P:P2.6N:P2.7 //
#define ENO3P       0x10
#define ENO4P       0x40

void Pwm_Init_3P(p3_duty) //PWMA的初始化
{
        P_SW2 |= 0x80;
        PWMA_CCER1 = 0X00;
        PWMA_CCMR1 = 0X60; //pwm模式1 配置置位输出
        PWMA_CCER1 = 0x01; //配置通道输出使能和极性

        PWMA_CCR1 = p3_duty; //设置占空比时间
        PWMA_ARR = 500; //设置周期时间
       //3.输入输出的引脚配置
        PWMA_ENO |= ENO3P; //使能PWM3p通道输出       
        PWMA_PS |= PWM3_2;

        PWMA_BKR = 0X80; //使能主输出
        PWMA_CR1 |= 0X01; //启动计数器
}

void Pwm_Init_4P(p4_duty) //PWMA的初始化
{
        P_SW2 |= 0x80;
       
        PWMA_CCER1 = 0X00;
        PWMA_CCMR1 = 0X60; //pwm模式1 配置置位输出
        PWMA_CCER1 = 0x01; //配置通道输出使能和极性

        PWMA_CCR1 = p4_duty; //设置占空比时间
        PWMA_ARR = 500; //设置周期时间
       //3.输入输出的引脚配置
        PWMA_ENO |= ENO4P; //使能PWM3p通道输出       
        PWMA_PS|= PWM4_2;

        PWMA_BKR = 0X80; //使能主输出
        PWMA_CR1 |= 0X01; //启动计数器
}


经测试2.42.6无波形输出,以上设置是否有误,请大家多多指正


_奶咖君_ 发表于 2024-7-4 11:02:22

有个问题,,你要控制PWM3 和PWM4为什么你配置的是PWM1的寄存器?

lier378912453 发表于 2024-7-4 11:06:57

是的哦,复制之前的例程没改{:tongue:} 丑大了

_奶咖君_ 发表于 2024-7-4 11:13:25

lier378912453 发表于 2024-7-4 11:06
是的哦,复制之前的例程没改 丑大了

别的不知道对不对哦,,CCR   CCMR肯定是不对 剩下你再看看

lier378912453 发表于 2024-7-4 16:43:15

pwm3 与 pwm4配置模式一样,pwm4输出正常,pwm3输出异常 ,代码修正入下
#include "moto_pwm.h"
#include "STC8H_PWM.h"

u16 p3_duty = 500;
u16 p4_duty = 500;
u16 Period= 1023;
/***************PWM始化函数 *****************/

#define PWM3_2      0x10        //P:P2.4N:P2.5 //
#define PWM4_2      0x40        //P:P2.6N:P2.7 //

#define ENO3P       0x10
#define ENO4P       0x40

void Pwm_Init_3P(p3_duty) //PWMA的初始化
{
        P_SW2 |= 0x80;
       
        PWMA_CCER2 = 0X00;       
        PWMA_CCMR3 = 0X60; //pwm模式1 配置置位输出
        PWMA_CCER2 = 0x55; //配置通道输出使能和极性

        PWMA_ARR = Period; //设置周期时间       
        PWMA_CCR3 = p3_duty; //设置占空比时间
       
        PWMA_ENO = 0;//关闭通道
        PWMA_ENO |= ENO3P; //使能PWM3p通道输出       
        PWMA_PS|= PWM3_2;

        PWMA_BKR = 0X80; //使能主输出
        PWMA_CR1 |= 0X01; //启动计数器
}

void Pwm_Init_4P(p4_duty) //PWMA的初始化
{
        P_SW2 |= 0x80;
       
        PWMA_CCER2 = 0X00;
        PWMA_CCMR4 = 0X60; //pwm模式1 配置置位输出
        PWMA_CCER2 = 0x55; //配置通道输出使能和极性
       
        PWMA_ARR = Period; //设置周期时间
        PWMA_CCR4 = p4_duty; //设置占空比时间
       
        PWMA_ENO = 0;//关闭通道
        PWMA_ENO |= ENO4P; //使能PWM3p通道输出       
        PWMA_PS|= PWM4_2;

        PWMA_BKR = 0X80; //使能主输出
        PWMA_CR1|= 0X01; //启动计数器
}

乘风飞扬 发表于 2024-7-4 18:43:40

lier378912453 发表于 2024-7-4 16:43
pwm3 与 pwm4配置模式一样,pwm4输出正常,pwm3输出异常 ,代码修正入下
#include "moto_pwm.h"
#include ...

PWM3,PWM4两个初始化函数里面都写了:
PWMA_ENO = 0;//关闭通道
如果你先调用PWM3初始化函数,再调用PWM4初始化函数,先设置的PWMA_ENO就会被清掉,最终只开启了PWM4P通道。

lier378912453 发表于 2024-7-8 16:59:19

根据大神的提示 输出正常了,
我这里还存在一个问题:P26设置为PWMA 功能 可以输出正常的波形及占空比,但是确不能完全关断使其输出为0,设置如下
u16 p4_duty = 256;
u16 Period= 256;
#define ENO4P       0x40

正常输出设置:
void Pwm_Init_4P(p4_duty) //PWMA的初始化
{
        P_SW2 |= 0x80;
       
        PWMA_CCER2 = 0X00;
        PWMA_CCMR4 = 0X60; //pwm模式1 配置置位输出
        PWMA_CCER2 = 0x55; //配置通道输出使能和极性
       
        PWMA_ARR = Period; //设置周期时间
        PWMA_CCR4 = p4_duty; //设置占空比时间
       
        PWMA_ENO = 0;//关闭通道
        PWMA_ENO |= ENO4P; //使能PWM3p通道输出       
        PWMA_PS|= PWM4_2;

        PWMA_BKR = 0X80; //使能主输出
        PWMA_CR1|= 0X01; //启动计数器
        P_SW2 &= 0x7f;
}
void Pwm_Init_4P_close() //PWM4P输出为0
{
        PWMA_ENO &= ~ENO4P;
//        PWMA_ENO = 0;
        P26 = 0;
        delay_ms(5);
}
正常输出波形如图为何不是100% 附图1
异常输出波形(想着PWM输出为0):附图2



梁工 发表于 2024-7-8 18:32:20

lier378912453 发表于 2024-7-8 16:59
根据大神的提示 输出正常了,
我这里还存在一个问题:P26设置为PWMA 功能 可以输出正常的波形及占空比,但 ...

高级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

页: [1]
查看完整版本: 硬件PWM设置后,无波形输出