Files
100_STC_PWM/测试结果.txt

98 lines
3.3 KiB
Plaintext
Raw Normal View History

4.1 测试
使用STC32G12K128开发板进行PWM测试
在无晶振情况下测试PWM输出400HZ50HZ频率PWM波误差均小于0.02%
使用引脚P6.0
代码如下:
#include "stc32g.h"
#include "intrins.h"
#define MAIN_Fosc 24000000L // 主时钟24MHz
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
/**************************** 固定参数 400Hz PWM ****************************/
//#define PWM_FREQ 400 // 目标频率
//#define PERIOD 59999 // 24MHz下 400Hz 对应周期值
//#define DUTY 18000 // 30%占空比 (PERIOD/2)
/**************************** 正确参数50Hz / 30%占空比 ****************************/
#define PWM_FREQ 50
#define PSC_VAL 239 // 预分频值核心修复解决16位溢出
#define PERIOD 1999 // 周期值16位寄存器最大值65535合规
#define DUTY 600 // 30%占空比 (1999*0.3=600)
/**************************** 官方宏定义 保留 ****************************/
#define PWM1_0 0x00 //P:P1.0 N:P1.1
#define PWM1_1 0x01 //P:P2.0 N:P2.1
#define PWM1_2 0x02 //P:P6.0 N:P6.1 ? 最终输出引脚
#define ENO1P 0x01
/*****************************************************************************/
void UpdatePwm(void);
/******************** 主函数 **************************/
void main(void)
{
WTST = 0;
EAXFR = 1; // 扩展寄存器访问使能
CKCON = 0;
// IO口初始化
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
// ===================== PWM 硬件配置 =====================
PWMA_ENO = 0x00;
PWMA_ENO |= ENO1P; // 使能PWM1通道输出
PWMA_CCER1 = 0x00;
PWMA_CCMR1 = 0x68; // PWM模式1输出
PWMA_CCER1 = 0x01; // 高电平有效(正常输出)
PWMA_PS = 0x00;
PWMA_PS |= PWM1_2; // ? 选择通道P6.0 输出
// ========== 核心修复:配置预分频器(之前缺失!) ==========
PWMA_PSCRH = (u8)(PSC_VAL >> 8);
PWMA_PSCRL = (u8)PSC_VAL;
UpdatePwm(); // 加载400Hz/50%占空比参数
PWMA_BKR = 0x80; // 使能主输出(必备)
PWMA_CR1 = 0x81; // 关键:关闭单脉冲模式 → 连续输出PWM
EA = 1; // 开总中断(保留框架)
while (1)
{
// 无需任何操作硬件连续输出400Hz PWM
}
}
//========================================================================
// 函数: UpdatePwm(void)
// 功能: 固定配置 400Hz + 50%占空比
//========================================================================
void UpdatePwm(void)
{
// 固定周期59999 → 400Hz
PWMA_ARRH = (u8)(PERIOD >> 8);
PWMA_ARRL = (u8)PERIOD;
// 固定占空比29999 → 50%
PWMA_CCR1H = (u8)(DUTY >> 8);
PWMA_CCR1L = (u8)DUTY;
}
#################################################################################
后面接上11.0592Mhz外部晶振再测试PWM没有成功在代码中对占空比进行调整均始终输出3.3VPWM频率没有使用示波器测量
由于时间原因,外部晶振策略搁置