找回密码
 立即注册
查看: 47|回复: 7

PWM输出问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-06-24 16:01:54

5

主题

4

回帖

81

积分

注册会员

积分
81
发表于 5 天前 | 显示全部楼层 |阅读模式
代码如下


//测试工作频率为11.0592MHz
#include "stc32g.h"   //头文件见下载软件
#include "intrins.h"
typedef  unsigned char u8;
typedef  unsigned int u16;
typedef  unsigned 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_2  11 01 01 01  D5  
                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_3  11011010  DA
                PWMB_BKR = 0x80;  //使能主输出
    PWMB_CR1 |= 0x81; //使能ARR预装载,开始计时
}

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

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

使用道具 举报 送花

3

主题

533

回帖

-223

积分

等待验证会员

积分
-223
发表于 5 天前 | 显示全部楼层
以下是一段专业的回复,旨在帮助用户解决PWM输出问题:

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

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

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

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

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

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

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

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

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

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2025-06-28 00:08:16

75

主题

6163

回帖

1万

积分

超级版主

积分
12932
发表于 5 天前 | 显示全部楼层
贴出电路图片。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-06-24 16:01:54

5

主题

4

回帖

81

积分

注册会员

积分
81
发表于 5 天前 | 显示全部楼层
梁*** 发表于 2025-6-24 16:03
贴出电路图片。

电路如如下

截图202506241606422416.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-06-24 16:01:54

5

主题

4

回帖

81

积分

注册会员

积分
81
发表于 5 天前 | 显示全部楼层
梁*** 发表于 2025-6-24 16:03
贴出电路图片。

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-06-24 16:01:54

5

主题

4

回帖

81

积分

注册会员

积分
81
发表于 5 天前 | 显示全部楼层
12.bmp 13.bmp 这两个通道的示波器图,不知道代码哪里写错了,

点评

PWM1P与PWM1N是互补输出的关系,不能分别控制其占空比不同,你要分开PWM控制,比如PWM1P、PWM2P。  详情 回复 发表于 5 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:419
  • 最近打卡:2025-06-29 00:37:16

8

主题

360

回帖

2532

积分

金牌会员

积分
2532
发表于 5 天前 | 显示全部楼层
电源电压高于单片机电压时,PMOS驱动不能跟NMOS一样.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2025-06-28 00:08:16

75

主题

6163

回帖

1万

积分

超级版主

积分
12932
发表于 5 天前 | 显示全部楼层
watlq*** 发表于 2025-6-24 16:25
这两个通道的示波器图,不知道代码哪里写错了,

PWM1P与PWM1N是互补输出的关系,不能分别控制其占空比不同,你要分开PWM控制,比如PWM1P、PWM2P。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-29 01:29 , Processed in 0.214862 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表