虚无 发表于 5 天前

8H1K08 PWM3P配置完 无法输出PWM

这是代码   引脚在主函数已经配置为推挽了

void pwmInit()// PWM初始设置 约20khz的开关频率
{
    P_SW2 |= 0x80;
   
PWMA_CCER2=0X00;//写CCMR前先关闭通道功能
PWMA_CCMR3=0x60;   //设置PWMA输出模式1
PWMA_CCER2=0X02; //选择通道PWM3P
PWMA_PSCR=11;   //分频+1
PWMA_CCR3=0;   //占空比
PWMA_ARR=100;   //周期
PWMA_ENO=0X10;//使能PWM3P输出

PWMA_BKR=0X80;//使能主输出
// PWMA_PS&=0Xcf;
PWMA_CR1=0X01;//边沿对齐模式   开始计数

   
}
void pwm(unsigned char p)
{
    EA = 0;//禁止中断
if (p==100)
{
PWMA_ENO&=~0x10;//禁止端口输出直接操控引脚电平状态
P14 = 0;
}
if (p==0)
{
    PWMA_ENO&=~0x10;
    P14 = 1;
}
if (p<100 && p>0)
{
    PWMA_ENO=0X10;//使能PWM3P输出
    PWMA_CCR3=100-p;   //反转占空比
}

EA = 1;//开中断


}


国芯人工智能 发表于 5 天前

根据您提供的代码和描述,STC8H1K08 的 PWM3P 无法输出 PWM 信号,可能存在以下几个方面的问题:

一、引脚配置问题

虽然您提到“引脚在主函数已经配置为推挽”,但需确认是否正确配置了 PWM3P 对应的引脚。STC8H1K08 的 PWM3P 对应的是 P1.5 引脚(具体请参考数据手册)。请检查是否在初始化前对该引脚进行了如下配置:

c
P1M1 &= ~0x20;   // 设置 P1.5 为推挽输出
P1M2 &= ~0x20;

若未进行此配置,即使 PWM 模块已开启,也无法输出 PWM 信号。

二、PWM 模块使能问题

在 STM32 或类似单片机中,通常需要在配置完寄存器后开启 PWM 模块。但 STC8H 系列的 PWM 控制逻辑略有不同,需确认是否在配置完成后开启了 PWM 功能。

建议在 pwmInit() 函数末尾添加以下代码以确保 PWM 模块被启用:

c
PWMAEN = 1;   // 启用 PWM 模块

三、PWM 寄存器配置顺序问题

在配置 PWM 模块时,寄存器的写入顺序非常重要。例如,在设置 PWMACCMR3 和 PWMACCER2 之前,应确保 PWMACCER2 被置为 0 以关闭通道功能,避免冲突。

您的代码中已经做了这一点,但仍需注意以下几点:
PWMACCMR3 配置为 0x60 表示设置为 PWM 模式 1(高电平有效),这是正确的。
PWMACCER2 设置为 0x02 表示选择 PWM3P 通道,该值是正确的。
PWMAPSCR 设置为 11 表示分频系数为 12(因为分频值 +1),即系统时钟除以 12,计算频率时需考虑这一点。

四、占空比配置问题

PWMACCR3 设置为 0 表示占空比为 0%,此时 PWM 输出将始终为低电平。建议先尝试设置一个非零值,如 PWMACCR3 = 100;,以验证 PWM 是否正常输出。

五、系统时钟配置问题

PWM 输出频率由系统时钟和分频系数决定。若您使用的是内部 RC 振荡器,其频率可能不稳定,导致 PWM 输出异常。建议通过 CLKSW 或 CLKPLL 配置稳定时钟源,并确保系统时钟频率符合预期。

六、代码结构建议

建议对 pwmInit() 函数进行优化,确保所有配置步骤清晰可读,例如:

c
void pwmInit()// PWM 初始设置 约20kHz的开关频率
{
    PSW2 |= 0x80;      // 打开 PWM 模块时钟

    PWMACCER2 = 0x00;    // 关闭通道功能
    PWMACCMR3 = 0x60;    // 设置 PWM 模式1(高电平有效)
    PWMACCER2 = 0x02;    // 选择 PWM3P 通道
    PWMAPSCR = 11;       // 分频+1(12分频)
    PWMACCR3 = 100;      // 占空比设为 100(根据实际需求调整)

    PWMAEN = 1;          // 启用 PWM 模块
}

七、调试建议

1. 使用示波器或逻辑分析仪检测 P1.5 引脚是否有 PWM 信号输出。
2. 检查 PWMACCR3 是否成功更新。
3. 查看是否启用了 PWM 模块(PWMAEN = 1)。
4. 确保没有其他模块占用该引脚(如 UART、ADC 等)。

综上所述,PWM3P 无法输出 PWM 可能由引脚未配置为推挽、PWM 模块未启用、占空比设置为 0、寄存器配置顺序不当等原因引起。建议按照上述步骤逐一排查,并参考 STC8H1K08 数据手册中的 PWM 模块章节进行详细核对。

[本文内容由国芯人工智能辅助生成,仅供参考]

梁工 发表于 5 天前

能否贴出完整代码?

虚无 发表于 5 天前

梁工 发表于 2025-8-19 14:52
能否贴出完整代码?

完整代码是指整个项目?整个项目有点大      关于PWM部分这个就是pwm的全部代码   我按照手册配置PWM4P_2能正常输出PWM   然后我自己按照手册配置PWM3P无法输出PWM

梁工 发表于 5 天前

虚无 发表于 2025-8-19 15:02
完整代码是指整个项目?整个项目有点大      关于PWM部分这个就是pwm的全部代码   我按照手册配置PWM4P ...

那就去下载官方例子:
STC8H系列-高级PWM范例程序下载,2024/1/3 更新
https://www.stcaimcu.com/thread-1779-1-1.html
(出处: 国芯人工智能技术交流网站)

虚无 发表于 4 天前

梁工 发表于 2025-8-19 17:24
那就去下载官方例子:
STC8H系列-高级PWM范例程序下载,2024/1/3 更新
https://www.stcaimcu.com/thread- ...

感谢你的分享   我平常参考的例子是直接从烧录软件上参考的   不知论坛上有这么详细的例子参考了官方例程我详细对比我的代码 以及官方寄存器手册 最后发现我代码的原因是出错在通道使能这块PWM3P是最低位而我设置的是第二位 一瞬间脑子没转过弯来
页: [1]
查看完整版本: 8H1K08 PWM3P配置完 无法输出PWM