实现STC32G12K128开发板的PWM输出,测试并验证400Hz和50Hz频率下误差小于0.02%
This commit is contained in:
98
测试结果.txt
Normal file
98
测试结果.txt
Normal file
@ -0,0 +1,98 @@
|
||||
4.1 测试
|
||||
使用STC32G12K128开发板进行PWM测试:
|
||||
在无晶振情况下,测试PWM输出400HZ,50HZ频率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.3V,PWM频率没有使用示波器测量
|
||||
由于时间原因,外部晶振策略搁置
|
||||
Reference in New Issue
Block a user