STC8h4K64TL LQFP64 pwm输出问题 急
stc8h4k64tl lqfp48封装 现在想在第8脚即P1.4脚输出25k频率 占空比45% ,波形 ,初始化如下,但是输出io电平为0,帮忙分析下 急// PWM硬件初始化
void PWM_Init_Adjustable(void) {
// 1. 使能扩展寄存器访问
P_SW2 |= 0x80;
// 2. 配置P1.4为PWM3P输出
P1M1 &= ~0x10;
P1M0 |= 0x10;
PWMA_PS &= ~0x30; // PWM3映射到P1.4
// 3. 配置PWM通道3
PWMA_CCER1=0;
PWMA_CCER1 &= 0xF0; // 清零通道3配置
PWMA_CCMR3 = 0x60; // PWM模式1,预装载使能
PWMA_CCER1 |= 0x02; // 使能通道3输出
// 4. 设置PWM周期(25kHz @ 11.0592MHz)
PWMA_PSCRH = 0;
PWMA_PSCRL = 0;
PWMA_ARRH = (PWM_ARR_VALUE >> 8) & 0xFF;
PWMA_ARRL = PWM_ARR_VALUE & 0xFF;
// 5. 设置初始占空比
PWM_Set_Duty(PWM_DEFAULT_CCR);
// 6. 使能输出
PWMA_BKR = 0x80; // 主输出使能
// PWMA_ENO |= 0x08; // 使能PWM3P输出
PWMA_ENO |= 0x10; // 使能PWM3P输出
PWMA_CR1 = 0x01; // 启动计数器
}
// 设置占空比函数(核心函数)
void PWM_Set_Duty(unsigned short ccr_value) {
// 限制CCR值在有效范围内
if(ccr_value < PWM_MIN_CCR) ccr_value = PWM_MIN_CCR;
if(ccr_value > PWM_MAX_CCR) ccr_value = PWM_MAX_CCR;
// 更新PWM比较值(通道3)
PWMA_CCR3H = (ccr_value >> 8) & 0xFF;
PWMA_CCR3L = ccr_value & 0xFF;
}
用 AiCube-ISP 图形化配置 PWM, 选择型号 STC8H8K64U,
另外 I/O 输出设置成 强推挽 或者 准双向口,
否则 上电复位后是 高阻输入,无法输出
第3步这个寄存器设置错了,通道3使能在PWMA_CCER2,不是PWMA_CCER1:
PWMA_CCER1 |= 0x02; // 使能通道3输出
电话里我都说了,拿一个我的例子去掉3个通道就OK了:
先别修改程序, 直接下载"01A-PWMA-4对互补PWM输出P1口"里的"pwm.hex"测试, 下载时输入主频25.6MHz,别的主频输出PWM频率按比例变化,按你的要求,程序改为仅从P1.4输出25KHz、45%的占空比的PWM。
下载到STC8H4K64TL运行实测输出波形照片,可见输出的PWM周期是5*8=40us即25KHz,高电平18us即45%。
源码和编译好的HEX文件:
已经可以实现PWM输出了感谢STC 技术支持!
页:
[1]