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);
}
从代码看,你是打算使用PWM2输出,但是捕获/比较使能寄存器只使能了PWM1,没有使能PWM2通道:
PWMA_CCER1 = 0x05;
乘风飞扬 发表于 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]