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

PWM怎么启动不了 | 已解决

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:331
  • 最近打卡:2025-06-18 08:32:52
已绑定手机

9

主题

107

回帖

839

积分

高级会员

积分
839
发表于 2025-2-7 16:16:57 | 显示全部楼层 |阅读模式
最近一段时间反复学习和实验冲哥的《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.0  N:P1.1
#define PWM1_2      0x01        //P:P2.0  N:P2.1
#define PWM1_3      0x02        //P:P6.0  N:P6.1

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

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

#define PWM_PERIOD  1023    //设置周期值

#define PWM2P  P12
#define PWM2N  P13

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

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);

}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:446
  • 最近打卡:2025-06-18 09:00:43
已绑定手机

40

主题

2064

回帖

7101

积分

论坛元老

积分
7101
发表于 2025-2-7 17:57:29 | 显示全部楼层
从代码看,你是打算使用PWM2输出,但是捕获/比较使能寄存器只使能了PWM1,没有使能PWM2通道:
  1. PWMA_CCER1 = 0x05;
复制代码

截图202502071757219573.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:331
  • 最近打卡:2025-06-18 08:32:52
已绑定手机

9

主题

107

回帖

839

积分

高级会员

积分
839
发表于 2025-2-7 19:13:20 | 显示全部楼层
乘风*** 发表于 2025-2-7 17:57
从代码看,你是打算使用PWM2输出,但是捕获/比较使能寄存器只使能了PWM1,没有使能PWM2通道:

...

谢谢!乘风飞扬。真是高手一眼就找到问题之处。把原来
    PWMA_CCER1 = 0x05; //配置通道输出使能和极性
    PWMA_CCER2 = 0x55;//
改为PWMA_CCER1 = 0x55; //配置通道输出使能和极性
就OK了。原来PWMA_CCER1管1,2通道, PWMA_CCER2管3,4通道.
谢谢!乘风飞扬老师。谢谢!STC提供的学习平台。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-18 16:54 , Processed in 0.135748 second(s), 64 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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