找回密码
 立即注册
查看: 24|回复: 2

请问根据手册写的PWMB捕获周期和占空比程序,串口无法正常输出,这个应该怎么改正?

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-08-06 07:13:00
已绑定手机

6

主题

20

回帖

186

积分

注册会员

积分
186
发表于 3 天前 | 显示全部楼层 |阅读模式
使用的是STC8H2K08U芯片SOP20封装,主频选择33.1776MHz,照着例程写的PWM5_2引脚捕获信号发生器发出得PWM波的占空比和周期;
具体程序如下,请问是出了什么问题?经测试,信号发生器输出波形为占空比为50%的2KHz的PWM波,串口软件能够读取到PWM Test.的字符串;
#include "stc8h.h"
#include "intrins.h"
#include "stdio.h"

#define  FOSC   33177600UL
#define  BRT    (65536-FOSC/115200/4)
#define  T10K        (65536-FOSC/10000)
#define  T11K        (65536-FOSC/11000)
#define  T12K        (65536-FOSC/12000)
#define  T13K        (65536-FOSC/13000

unsigned int ccr1;
unsigned int ccr3;
unsigned int ccr5;
unsigned int ccr7;

unsigned int cycle1;
unsigned int duty1;
unsigned int cycle2;
unsigned int duty2;
unsigned int cycle3;
unsigned int duty3;
unsigned int cycle4;
unsigned int duty4;

bit f1,f2,f3,f4;

void main()
{
        P_SW2 |= 0x80;                //使能访间XFR,没有冲突不用关闭
        
        P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
        P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

        P_SW1|=0x40;                //切换串口1原始引脚到2引脚
        SCON=0x52;                        //串口使能,但是要复用
        T2L=BRT;
        T2H=BRT>>8;
        AUXR|=0x15;
        
        printf("PWM Test.\n");
        
        //引脚要切换为p17
        PWMB_PS|=0x01;
        PWMB_CCER1 = 0x00;
    PWMB_CCMR1 = 0x01;                          //CC5为输入模式,且映射到TI5FP5上
    PWMB_CCMR2 = 0x02;                          //CC6为输入模式,且映射到TI5FP6上
    PWMB_CCER1 = 0x11;                          //使能CC5/CC6上的捕获功能
    PWMB_CCER1 |= 0x00;                         //设置捕获极性为CC1的上升沿
    PWMB_CCER1 |= 0x20;                         //设置捕获极性为CC2的下降沿
        
        
        PWMB_SMCR = 0x54;                           //从模式控制寄存器,管理滤波TS=TI1FP1,SMS=TI1上升沿复位模式
        PWMB_CR1 = 0x01;                                                          //使能计数器
        PWMB_IER = 0x06;                            //使能CC1/CC2捕获中断
        
        
    EA = 1;

    while (1)
        {
                if(f1)
                {
                        f1=0;
                        printf("cycle1=%4x,duty1=%4x\n",cycle1,duty1);
                }
                if(f2)
                {
                        f2=0;
                        printf("cycle2=%4x duty2=%4x\n",cycle2,duty2);
                }
                if(f3)
                {
                        f3=0;
                        printf("cycle3=%4x duty3=%4x\n",cycle3,duty3);
                }
                if(f4)
                {
                        f4=0;
                        printf("cycle4=%4x duty4=%4x\n",cycle4,duty4);
                }
        }
}


void PWMB_ISR() interrupt PWMB_VECTOR
{
        unsigned int cnt;

    if (PWMB_SR1 & 0x02)                //CC5捕获中断,用于计算周期
    {
        PWMB_SR1 &= ~0x02;
                cnt = (PWMB_CCR5H<<8)+PWMB_CCR5L;                        //CC1捕获周期宽度
               cycle3=cnt;f3=1;
    }
    if (PWMB_SR1 & 0x04)                //CC6捕获中断,用于计算占空比
    {
        PWMB_SR1 &= ~0x04;
                cnt = (PWMB_CCR6H<<8)+PWMB_CCR6L;duty3=cnt-ccr5;

               
    }

}
捕获的PWM波形如下图:

需要捕获的波形

需要捕获的波形
回复

使用道具 举报 送花

3

主题

2087

回帖

1022

积分

等待验证会员

积分
1022
发表于 3 天前 | 显示全部楼层
根据您提供的信息,使用STC8H2K08U芯片(SOP20封装),主频设置为33.1776MHz,并尝试通过PWMB捕获功能实现PWM波输出,但程序未能正常工作。以下是对该问题的分析及建议。

首先,检查代码中是否存在语法错误或配置不当的问题:

1. 头文件引用不正确:  
   您在代码中包含了 "stc8hh"、"intrinsh" 和 "stdioh" 头文件。需要注意的是,标准C库头文件应为 "stdio.h"(注意是 .h 而非 .h")。此外,"intrinsh" 通常用于内联汇编函数,可能不是必须的。建议修正如下:
  
  1. c
  2.    #include "stc8h.h"
  3.    #include "intrins.h"
  4.    #include "stdio.h"
复制代码

2. 宏定义中的括号缺失:  
   在 #define T13K (65536-FOSC/13000 这一行中,缺少了右括号 ),这可能导致编译器报错或计算结果异常。应修正为:
  
  1. c
  2.    #define T13K        (65536-FOSC/13000)
复制代码

3. 主函数未完整编写:  
   您的 main() 函数在 PSW2 |= 0x80; 后未继续编写,导致程序无法运行。请确保完成初始化和主循环内容。

4. PWMB模块配置不完整:  
   STC8H系列支持多个PWM通道,但需要对PWMB进行正确的初始化。例如,需设置PWM模式、分频、周期、占空比等参数。若您仅设置了部分寄存器,可能导致PWM无法正常输出。

5. 主频设置与定时器匹配问题:  
   您将主频设为33.1776MHz,但在计算定时器初值时,使用的是 FOSC/115200 或 FOSC/10000 等,这可能是为了串口通信而设定的。若PWM模块使用的是定时器1或2,请确认其时钟源是否与主频一致,并合理计算定时器初值。

6. PWM输出引脚未正确配置:  
   PWM信号输出依赖于GPIO引脚的复用功能。请确保所使用的引脚(如PWM52)已正确配置为PWM功能,并且没有被其他功能占用。

7. PWM捕获与输出逻辑混淆:  
   PWMB模块通常用于PWM输出,而非捕获功能。若您误用了捕获功能(如使用CAPB模块),则可能导致逻辑错误。请确认您是否希望使用PWM输出还是PWM捕获功能。

8. 调试信息验证:  
   您提到串口软件可以读取到“PWM Test”的字符串,说明程序至少能运行到某个阶段。建议在关键位置添加调试打印,以确认PWM初始化是否成功执行。

综上所述,建议您按照以下步骤进行排查与修复:
修正头文件引用和宏定义;
完善 main() 函数,确保所有初始化代码完整;
正确配置PWMB模块,包括时钟源、分频、周期和占空比;
验证PWM输出引脚是否已正确设置为PWM功能;
使用调试工具或示波器检查PWM信号实际输出情况;
参考官方数据手册和例程,确保代码符合芯片规范。

如需进一步协助,请提供完整的代码和具体测试现象(如LED指示灯状态、串口输出内容等),以便更精准定位问题。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-08-06 07:13:00
已绑定手机

6

主题

20

回帖

186

积分

注册会员

积分
186
发表于 前天 14:27 | 显示全部楼层
找到原因了,数据手册的采样四路pwm的占空比和周期的例程出错了
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-8 15:27 , Processed in 0.112150 second(s), 59 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表