watlq2010 发表于 2024-12-5 10:48:44

无法输出两路PWM

//测试工作频率为11.0592MHz

//#include "stc8h.h"
#include "stc32g.h"   //头文件见下载软件
#include "intrins.h"
void main()
{
EAXFR = 1; //使能访问XFR,没有冲突不用关闭
CKCON = 0x00; //设置外部数据总线速度为最快
WTST = 0x00;//设置程序代码等待参数,
//赋值为0可将CPU执行程序的速度设置为最快

P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;

```
//        PWMA_PS=0x55;//端口选择
```

PWMA_CCER1 = 0x00; //写CCMRx前必须先清零CCERx关闭通道
PWMA_CCMR1 = 0x60; //设置CC1为PWMA输出模式
PWMA_CCER1 = 0x01; //使能CC1通道
PWMA_CCR1H = 0x01; //设置占空比时间
PWMA_CCR1L = 0x00;
PWMA_ARRH = 0x02; //设置周期时间
PWMA_ARRL = 0x00;
PWMA_ENO = 0x01; //使能PWM1P端口输出
PWMA_BKR = 0x80; //使能主输出
PWMA_CR1 = 0x01; //开始计时

while (1)
{};
}

如果我想输出PWM1P和PWM1N相同的PWM是否只要修改PWMA_ENO = 0x03; 就可以了,但是我接上示波器,只有PWM1P有波形(1脚),PWM1N没有波形输出(2脚)。请问怎么才可以所有让所有PWM脚输出相同的波形?

Yim_Hom 发表于 2024-12-5 11:21:46

如果我想输出PWM1P和PWM1N相同的PWM是否只要修改PWMA_ENO = 0x03; 就可以了,但是我接上示波器,只有PWM1P有波形(1脚),PWM1N没有波形输出(2脚)。请问怎么才可以所有让所有PWM脚输出相同的波形?
你这个想法是好的,但不对啊!

两路PWM的描述:

专门与你问题描述相关的内容:


所以正确的选择是:
PWMA中的全部P或全部N,
PWMB中的全部。

表面看,PWM的使用很简单,但每家的片子对于PWM的使用方式都会有不同。
手册一定要看的,示例代码也不太可能把手册描述搬上去。

王昱顺 发表于 2024-12-5 12:01:51

如果是完全相同的话,直接将两个端口并一块也可以吧?
如果是需要死区,那么代码里还需要更改PWMA_CCER1 ,使能CC1N通道

梁工 发表于 2024-12-5 18:15:39

请下载参考下面的例子,直接下载HEX文件即可观察PWM波形

STC32G-高级PWM范例程序下载
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1778
(出处: 国芯技术交流网站)

watlq2010 发表于 2024-12-29 11:12:34

问题已经解决,下面代码可以输出多路相同频率PWM,之前代码没有配置好端口
       PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
    PWMA_CCER2 = 0x00;
    PWMA_CCMR1 = 0x60; //通道模式配置
    PWMA_CCMR2 = 0x60;
    PWMA_CCMR3 = 0x60;
    PWMA_CCMR4 = 0x60;
    PWMA_CCER1 = 0x55; //配置通道输出使能和极性
    PWMA_CCER2 = 0x55;
                PWMA_CCMR1 |= 0x08; //开启PWMA_CCRx预转载功能(需要CCxE=1才可写)
    PWMA_CCMR2 |= 0x08;
    PWMA_CCMR3 |= 0x08;
    PWMA_CCMR4 |= 0x08;
                PWMA_CCR1H = 0x01; //设置占空比时间0X03 -12V   0x00-0V
    PWMA_CCR1L = 0x00; //0X70-8V   
          PWMA_CCR2H = 0x01; //设置占空比时间
    PWMA_CCR2L = 0x00;
                PWMA_CCR3H = 0x01; //设置占空比时间
    PWMA_CCR3L = 0x00;
                PWMA_CCR4H = 0x01; //设置占空比时间
    PWMA_CCR4L = 0x00;
    PWMA_ARRH = 0x02; //设置周期时间
    PWMA_ARRL = 0x00;
    PWMA_ENO = 0xFF;
                PWMA_PS = 0x15;//高级 PWM 通道输出脚选择位 15
                PWMA_BKR = 0x80;//使能主输出
    PWMA_CR1 |= 0x81; //使能ARR预装载,开始计时

    PWMB_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
    PWMB_CCMR1 = 0x60; //通道模式配置
    PWMB_CCMR2 = 0x60;
    PWMB_CCER1 = 0x55; //配置通道输出使能和极性
                PWMB_CCMR1 |= 0x08; //开启PWMA_CCRx预转载功能(需要CCxE=1才可写)
    PWMB_CCMR2 |= 0x08;
                PWMB_CCR5H = 0x01; //设置占空比时间0X03 -12V   0x00-0V
    PWMB_CCR5L = 0x00; //0X70-8V   
          PWMB_CCR6H = 0x01; //设置占空比时间
    PWMB_CCR6L = 0x00;
    PWMB_ARRH = 0x02; //设置周期时间
    PWMB_ARRL = 0x00;
    PWMB_ENO = 0xFF;
                PWMB_PS = 0x0A;//高级 PWM 通道输出脚选择位 0A
                PWMB_BKR = 0x80;//使能主输出
    PWMB_CR1 |= 0x81; //使能ARR预装载,开始计时

页: [1]
查看完整版本: 无法输出两路PWM