ysp0508 发表于 2025-2-7 16:16:57

PWM怎么启动不了 | 已解决

最近一段时间反复学习和实验冲哥的《32位8051单片机原理及应用》中的PWM知识,并且通过不断的在试验箱上实践。已经实现了带死区的互补PWM输出。于是尝试在ST8H1K08上实现带死区的互补PWM输出,但失败了。怎么也启动不了。下面是代码,看看问题出在那里。希望得到老师及高手们的指教。谢谢!

#include "stc8h.h"       //包含此头文件后,不需要再包含"reg51.h"头文件
#include "intrins.h"
#define   MAIN_Fosc       24000000L   //定义主时钟


typedef   unsigned char   u8;
typedef   unsigned int    u16;
typedef   unsigned long   u32;

/****************************** 用户定义宏 ***********************************/

#define Timer0_Reload   (65536UL -(MAIN_Fosc / 1000))       //Timer 0 中断频率, 1000次/秒


/****************************** 用户定义宏 ***********************************/

#define PWM1_1      0x00      //P:P1.0N:P1.1
#define PWM1_2      0x01      //P:P2.0N:P2.1
#define PWM1_3      0x02      //P:P6.0N:P6.1

#define PWM2_1      0x00      //P:P1.2/P5.4N:P1.3
#define PWM2_2      0x04      //P:P2.2N:P2.3
#define PWM2_3      0x08      //P:P6.2N:P6.3

#define ENO1P       0x01
#define ENO1N       0x02
#define ENO2P       0x04
#define ENO2N       0x08

#define PWM_PERIOD1023    //设置周期值

#define PWM2PP12
#define PWM2NP13

/*************本地变量声明    **************/

u16 PWM2_Duty;

void UpdatePwm(void);

/******************** 主函数 **************************/
void main(void)
{
    P_SW2 |= 0x80;//扩展寄存器(XFR)访问使能


    P1M1 = 0x00;   P1M0 = 0x00;   //设置P1准双向口

    P3M1 = 0x00;   P3M0 = 0x00;   //设置P3准双向口

    PWM2_Duty = 256;

    //Timer0初始化
    AUXR = 0x80;    //Timer0 set as 1T, 16 bits timer auto-reload,
    TH0 = (u8)(Timer0_Reload / 256);
    TL0 = (u8)(Timer0_Reload % 256);
    ET0 = 1;    //Timer0 interrupt enable
    TR0 = 1;    //Tiner0 run
      
    PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
    PWMA_CCER2 = 0x00;
    PWMA_CCMR1 = 0x68; //通道模式配置
    PWMA_CCMR2 = 0x68;//
//    PWMA_CCMR3 = 0x68;
//    PWMA_CCMR4 = 0x68;
    PWMA_CCER1 = 0x05; //配置通道输出使能和极性
    PWMA_CCER2 = 0x55;//

    PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
    PWMA_ARRL = (u8)PWM_PERIOD;

    PWMA_DTR = 0x0C;   //设置死区时间

    PWMA_ENO = 0x00;
//    PWMA_ENO |= ENO1P; 使能输出
//    PWMA_ENO |= ENO1N; 使能输出
    PWMA_ENO |= ENO2P; //使能输出
    PWMA_ENO |= ENO2N; //使能输出


    PWMA_PS = 0x00;//高级 PWM 通道输出脚选择位
//    PWMA_PS |= PWM1_3; //选择 PWM1_3 通道
    PWMA_PS |= PWM2_1; //选择 PWM2_3 通道

    PWMA_BKR = 0x80; //使能主输出

    PWMA_CR1 |= 0x01; //开始计时

    EA = 1;   //打开总中断

    while (1)
    {
    }
}
/********************** Timer0 1ms中断函数 ************************/
void timer0(void) interrupt 1
{

    UpdatePwm();
}

void UpdatePwm(void)
{

    PWMA_CCR2H = (u8)(PWM2_Duty >> 8); //设置占空比时间
    PWMA_CCR2L = (u8)(PWM2_Duty);

}

乘风飞扬 发表于 2025-2-7 17:57:29

从代码看,你是打算使用PWM2输出,但是捕获/比较使能寄存器只使能了PWM1,没有使能PWM2通道:
PWMA_CCER1 = 0x05;

ysp0508 发表于 2025-2-7 19:13:20

乘风飞扬 发表于 2025-2-7 17:57
从代码看,你是打算使用PWM2输出,但是捕获/比较使能寄存器只使能了PWM1,没有使能PWM2通道:

...

谢谢!乘风飞扬{:4_196:}。真是高手一眼就找到问题之处。把原来
    PWMA_CCER1 = 0x05; //配置通道输出使能和极性
    PWMA_CCER2 = 0x55;//
改为PWMA_CCER1 = 0x55; //配置通道输出使能和极性
就OK了。原来PWMA_CCER1管1,2通道, PWMA_CCER2管3,4通道.
谢谢!乘风飞扬老师。谢谢!STC提供的学习平台。
页: [1]
查看完整版本: PWM怎么启动不了 | 已解决