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
以下是一段专业的回复,旨在帮助用户解决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输出问题,确保代码的逻辑和变量的正确定义。建议根据项目需求进行具体调整和验证。
[本文内容由国芯人工智能辅助生成,仅供参考] 贴出电路图片。 梁工 发表于 2025-6-24 16:03
贴出电路图片。
电路如如下
梁工 发表于 2025-6-24 16:03
贴出电路图片。
N通道和P通道的电路一样,MCU脚输出的电压不一样,N通道1.877 P通道3.114,示波器试下频率是一样,N通道的占空比和P通道的占空比不一样 这两个通道的示波器图,不知道代码哪里写错了,
电源电压高于单片机电压时,PMOS驱动不能跟NMOS一样. watlq2010 发表于 2025-6-24 16:25
这两个通道的示波器图,不知道代码哪里写错了,
PWM1P与PWM1N是互补输出的关系,不能分别控制其占空比不同,你要分开PWM控制,比如PWM1P、PWM2P。
页:
[1]