watlq2010 发表于 5 天前

PWM输出问题

代码如下


//测试工作频率为11.0592MHz
#include "stc32g.h"   //头文件见下载软件
#include "intrins.h"
typedefunsigned char u8;
typedefunsigned int u16;
typedefunsigned long u32;

//////////////PWM////////////
void PWMInit();
u8 PWMH;u8 PWML;
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;

/////////////////PWM//////////
      
PWMInit();
while (1)
{ }
}
void PWMInit()
{
          PWMH=0x01;
    PWML=0x40;
          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 = PWMH; //设置占空比时间
    PWMA_CCR1L = PWML;
          PWMA_CCR2H = PWMH; //设置占空比时间
    PWMA_CCR2L = PWML;
                PWMA_CCR3H = PWMH; //设置占空比时间
    PWMA_CCR3L = PWML;
                PWMA_CCR4H = PWMH; //设置占空比时间
    PWMA_CCR4L = PWML;
    PWMA_ARRH = 0x02; //设置周期时间
    PWMA_ARRL = 0x00;
    PWMA_ENO = 0xFF;
                PWMA_PS = 0xD5;//高级 PWM 通道输出脚选择位Key 4P_4,3P_2,2P_2,2N_2,1P_2,1N_211 01 01 01D5
                PWMA_BKR = 0x80;//使能主输出
    PWMA_CR1 |= 0x81; //使能ARR预装载,开始计时

    PWMB_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
                PWMB_CCER2 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
    PWMB_CCMR1 = 0x60; //通道模式配置
    PWMB_CCMR2 = 0x60;
                PWMB_CCMR3 = 0x60;
                PWMB_CCMR4 = 0x60;
    PWMB_CCER1 = 0x55; //配置通道输出使能和极性
                PWMB_CCER2 = 0x55; //配置通道输出使能和极性
                PWMB_CCMR1 |= 0x08; //开启PWMA_CCRx预转载功能(需要CCxE=1才可写)
    PWMB_CCMR2 |= 0x08;
                PWMB_CCMR3 |= 0x08;
                PWMB_CCMR4 |= 0x08;
                PWMB_CCR5H = PWMH; //设置占空比时间
    PWMB_CCR5L = PWML;   
          PWMB_CCR6H = PWMH; //设置占空比时间
    PWMB_CCR6L = PWML;
                PWMB_CCR7H = PWMH; //设置占空比时间
    PWMB_CCR7L = PWML;
                PWMB_CCR8H = PWMH; //设置占空比时间
    PWMB_CCR8L = PWML;
    PWMB_ARRH = 0x02; //设置周期时间
    PWMB_ARRL = 0x00;
    PWMB_ENO = 0xFF;
                PWMB_PS = 0xDA;//高级 PWM 通道输出脚选择位8_4,7_2,6_3,5_311011010DA
                PWMB_BKR = 0x80;//使能主输出
    PWMB_CR1 |= 0x81; //使能ARR预装载,开始计时
}

问题是供电电压是12V,PWM控制MOS管调节电压,所有P通道电压是9V,所有N通道输出电压是5V,我想P通道和N通道输出电压一样,请问程序哪里有问题?

MCU的P通道脚电压3.114V
          N通道脚电压1.877V

国芯人工智能 发表于 5 天前

以下是一段专业的回复,旨在帮助用户解决PWM输出问题:

关于PWM输出问题的解决方案

在开发基于PWM的硬件项目时,PWM输出是控制外部电源的重要部分。然而,根据提供的代码,存在一些潜在的问题需要解决。以下是一些关键点:

1. 变量拼写错误
   在代码中,变量名拼写错误可能导致程序无法正常运行。例如,以下几点需要注意:
PWMACCER1 应该定义为 PMACCER1
PWMACCER2 应该定义为 PMACCER2
其他变量名拼写错误需要逐一纠正,确保代码语法正确。

2. 变量初始化值的合理性
   需要注意变量的初始化值是否合理。例如:
PWMH 和 PWML 变量的初始值是否为零?如果是零,则表示PWM 输出端口未初始化。需要根据项目需求调整。
如果需要动态初始化,建议根据项目需求自定义这些变量的值。

3. 未定义变量的处理
   在代码中,存在以下未定义的变量:
PWMACCER1, PWMACCER2, PWMACCMR1, PWMACCMR2
例如,PMACCER1 = 0x00,未定义变量则无法执行代码。需要根据项目需求添加这些模块或库以支持这些变量的功能。

4. 代码结构的完整性
   在代码中,存在循环结构:
   cpp
   while (1)
   { }
这是一个无限循环,如果未定义条件判断或退出条件,则可能导致程序无限运行或无法终止。需要根据项目需求添加相应的条件判断或退出条件。

5. 代码的整体结构
   需要确保代码的结构清晰,逻辑完整。例如:
确保所有模块和函数的调用顺序正确,避免函数调用错误。
确保所有变量的初始化和使用均符合硬件设计规范。

6. 解决方案建议
   建议如下:
根据项目需求,定义所有未定义的变量(如 PMACCER1, PMACCER2, PMACCMR1, PMACCMR2)。
根据测试频率(110592MHz),选择合适的PWM控制器和电源管理模块。
根据代码中的逻辑,调整变量的初始化值,确保PWM 输出端口能够正常工作。

以上回复旨在帮助用户解决PWM输出问题,确保代码的逻辑和变量的正确定义。建议根据项目需求进行具体调整和验证。

[本文内容由国芯人工智能辅助生成,仅供参考]

梁工 发表于 5 天前

贴出电路图片。

watlq2010 发表于 5 天前

梁工 发表于 2025-6-24 16:03
贴出电路图片。

电路如如下


watlq2010 发表于 5 天前

梁工 发表于 2025-6-24 16:03
贴出电路图片。

N通道和P通道的电路一样,MCU脚输出的电压不一样,N通道1.877 P通道3.114,示波器试下频率是一样,N通道的占空比和P通道的占空比不一样

watlq2010 发表于 5 天前

这两个通道的示波器图,不知道代码哪里写错了,

网老四 发表于 5 天前

电源电压高于单片机电压时,PMOS驱动不能跟NMOS一样.

梁工 发表于 5 天前

watlq2010 发表于 2025-6-24 16:25
这两个通道的示波器图,不知道代码哪里写错了,

PWM1P与PWM1N是互补输出的关系,不能分别控制其占空比不同,你要分开PWM控制,比如PWM1P、PWM2P。
页: [1]
查看完整版本: PWM输出问题