zys0797 发表于 2024-5-10 12:23:05

求救关于独立PWM输出问题,没有输出怎么办?

求救关于独立PWM输出问题,没有输出?

本人新手小白,芯片是STC8H1K08T,想使用P3.3的PWM4_N2独立输出PWM控制LED亮暗,参照ISP上面的示例做了修改,但是没有任何输出。。
望大师指点迷津。还有就是独立设置PWM输出需要怎么个流程?期待大师的指点!先在此感谢!
#include "stc8h.h"
#include "intrins.h"


#define PWMA_CCER2      (*(unsigned char volatile xdata *)0xfecd)
#define PWMA_CCMR4      (*(unsigned char volatile xdata *)0xfecb)
#define PWMA_ENO      (*(unsigned char volatile xdata *)0xfeb1)
#define PWMA_BKR      (*(unsigned char volatile xdata *)0xfedd)
#define PWMA_CCR4       (*(unsigned int volatile xdata *)0xfedb)
#define PWMA_ARR      (*(unsigned int volatile xdata *)0xfed2)
#define PWMA_CR1      (*(unsigned char volatile xdata *)0xfec0)


void main()
{

   //P3M0 |= 0x1c; P3M1 &= ~0x1c;
    P3PU |= 0x0c;



    P_SW2 = 0x80;
    PWMA_CCER2 = 0x00;                        //写CCMRx前必须先清零CCERx关闭通道
    PWMA_CCMR4 = 0x60;                        //设置CC4为PWMA输出模式
    PWMA_CCER2 = 0xC0;                        //使能CC2通道
    PWMA_CCR4 = 100;                            //设置占空比时间
    PWMA_ARR = 500;                           //设置周期时间
    PWMA_ENO = 0x80;                            //使能PWM4P端口输出
    PWMA_BKR = 0x80;                            //使能主输出
    PWMA_CR1 = 0x01;                            //开始计时
    //led=1;

    while (1);
}


Lkck8210 发表于 2024-5-10 14:34:33


乘风飞扬 发表于 2024-5-10 14:37:56

本帖最后由 乘风飞扬 于 2024-5-10 14:39 编辑

这颗芯片是P33对应的是PWM4N_4。

需要将设置:PWMA_PS |= 0xc0;

此外,PWMA_CCR4(占空比值)也要设置:

zys0797 发表于 2024-5-10 14:43:41

乘风飞扬 发表于 2024-5-10 14:37
这颗芯片是P33对应的是PWM4N_4。

需要将设置:PWMA_PS |= 0xc0;

非常大师您的指点,我这边又重新核实了下,做了些修改,好像还是不行。麻烦您再指导下哪里有问题?

#include "stc8h.h"
#include "intrins.h"


#define PWMA_CCER2      (*(unsigned char volatile xdata *)0xfecd)
#define PWMA_CCMR4      (*(unsigned char volatile xdata *)0xfecb)
#define PWMA_ENO      (*(unsigned char volatile xdata *)0xfeb1)
#define PWMA_BKR      (*(unsigned char volatile xdata *)0xfedd)
#define PWMA_CCR4       (*(unsigned int volatile xdata *)0xfedb)
#define PWMA_ARR      (*(unsigned int volatile xdata *)0xfed2)
#define PWMA_CR1      (*(unsigned char volatile xdata *)0xfec0)
#define PWMA_PS      (*(unsigned char volatile xdata *)0xfeb2)

void main()
{
   
   //P3M0 |= 0x1c; P3M1 &= ~0x1c;
    //P3PU |= 0x0c;



    P_SW2 = 0x80;
    PWMA_PS |= 0xc0;
    PWMA_CCER2 = 0x00;                        //写CCMRx前必须先清零CCERx关闭通道
    PWMA_CCMR4 = 0x60;                        //设置CC4为PWMA输出模式
    PWMA_CCER2 = 0xC0;                        //使能CC2通道
    PWMA_CCR4 = 500;                            //设置占空比时间
    PWMA_ARR = 100;                           //设置周期时间
    PWMA_ENO = 0x80;                            //使能PWM4P端口输出
    PWMA_BKR = 0x80;                            //使能主输出
    PWMA_CR1 = 0x01;                            //开始计时
    //led=1;

    while (1);
}


zys0797 发表于 2024-5-10 14:46:44

Lkck8210 发表于 2024-5-10 14:34


我也不清楚开启PWM,对应的P3.3的IO脚位是否需要设置为上拉电阻模式,还是说开漏输出?

乘风飞扬 发表于 2024-5-10 14:51:40

zys0797 发表于 2024-5-10 14:43
非常大师您的指点,我这边又重新核实了下,做了些修改,好像还是不行。麻烦您再指导下哪里有问题?

#incl ...

占空比不能设置的比周期还大。
周期(PWMA_ARR)设置100,那么占空比(PWMA_CCR4)设置50试试。

zys0797 发表于 2024-5-10 15:06:40

乘风飞扬 发表于 2024-5-10 14:51
占空比不能设置的比周期还大。
周期(PWMA_ARR)设置100,那么占空比(PWMA_CCR4)设置50试试。 ...

谢谢您的指导,还是不行。不知道哪里没有设置到还是程序不对?需要对P3.3的IO设置输入输出的模式吗?

乘风飞扬 发表于 2024-5-10 15:29:39

STC8H1K08T系列PWM脚的IO口模式需要手动设置,初始化设置P33为准双向模式,或者推挽输出模式试试。
附件例程已经过测试,供参考。

zys0797 发表于 2024-5-10 15:46:57

本帖最后由 zys0797 于 2024-5-10 15:49 编辑

乘风飞扬 发表于 2024-5-10 15:29
STC8H1K08T系列PWM脚的IO口模式需要手动设置,初始化设置P33为准双向模式,或者推挽输出模式试试。
附件例 ...
非常感谢,现在成功输出PWM了。我这边对比了下程序,发现我就是P3口没有设置准准双向模式,设置为推挽输出的话直接就是相当于IO口置为1一样。
请教大师以下几点:
1、我需要如何控制PWM的输出频率?比如我要输出20KHZ
2、如果我要控制PWM的30%,60%这样的输出需要修改那个参数,如何计算而来?
非常感谢您的回复和指导!谢谢。

乘风飞扬 发表于 2024-5-10 16:29:00

频率控制可以参考规格书计算公式:

百分比输出通过周期、占空比设置修改。
例如周期(PWMA_ARR)设置100,占空比(PWMA_CCR4)设置50,那么输出信号占空比就是50%。
页: [1] 2
查看完整版本: 求救关于独立PWM输出问题,没有输出怎么办?