STC8H PWM比较输出和输入捕获笔记

STC8H PWMB捕获霍尔编码器信号

(1)main.c中运行SFR访问 P_SW2 = 0x80
(2)按实际电路连接切换管脚 PWMB_PS
(3)初始化时关闭所有PWM输出/输入
PWMB_CCER1 = 0x00; //捕获/比较使能寄存器1,CC6/CC5
PWMB_CCER2 = 0x00; //捕获/比较使能寄存器1,CC8/CC7
PWMB_SR1 = 0x00; //状态寄存器1,清除事件CC8/7/6/5
PWMB_SR2 = 0x00; //状态寄存器2,重复捕获标记CC8/7/6/5
PWMB_ENO = 0x00; //IO禁止输出PWM,B6:ENO8P, B4:ENO7P, B2:ENO6P, B0:ENO5P
PWMB_IER = 0x00; //中断使能寄存器

PWM规划
(1) 用PWM5捕获H1A上升沿,用PWM6捕获H1A下降沿
(2) 用PWM7捕获H1B上升沿,用PWM8捕获H1B下降沿
H1A --> PWM5 --> TI5FP5 --> 上升沿
-> PWM6 --> TI6FP6 --> 下降沿
H1B --> PWM7 --> TI7FP7 --> 上升沿
-> PWM8 --> TI8FP8 --> 下降沿

设置代码
PWMB_CCMR1 = 0x31; //设置PWM5为输入,8个时钟滤波,无预分频器,映射到TI5FP5上
PWMB_CCMR2 = 0x31; //设置PWM6为输入,8个时钟滤波,无预分频器,映射到TI6FP6上
PWMB_CCMR3 = 0x31; //设置PWM7为输入,8个时钟滤波,无预分频器,映射到TI7FP7上
PWMB_CCMR4 = 0x31; //设置PWM8为输入,8个时钟滤波,无预分频器,映射到TI8FP8上

PWMB_CCER1 	= 0x31;		//设置PWM5捕获上升沿,PWM6捕获下降沿
PWMB_CCER2 	= 0x31;		//设置PWM7捕获上升沿,PWM7捕获下降沿

PWMB_CCMR1  |= 0x31;	//更新为1个事件触发一次捕获
PWMB_CCMR2  |= 0x31;	//更新为1个事件触发一次捕获
PWMB_CCMR3  |= 0x31;	//更新为1个事件触发一次捕获
PWMB_CCMR4  |= 0x31;	//更新为1个事件触发一次捕获
PWMB_IER   = 0x1E;		//B0001 1110,,,使能CCIE5/6/7/8中断
PWMB_EGR    = 0x01;		//手工产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
PWMB_CR1   |= 0x01;		//使能PWMB计数器, 允许自动重装载寄存器缓冲,
						//边沿对齐模式, 向上计数,
						//bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰),
						//=0:直接写自动重装载寄存器本(周期可能会乱掉)
PWMB_ISR_En = PWMB_IER;	//设置标志允许通道5~8中断处理

中断代码
void PWMB_ISR(void) interrupt PWMB_VECTOR
{
// u16 j;
u8 sr1, sr2;

//将SR1和SR2转入变量后,SR1和SR2可立即清零,避免后续处理影响下次高速中断
sr1 = PWMB_SR1;					//为了快速, 中断标志用一个局部变量处理
PWMB_SR1 = 0;					//清除中断标志
sr2 = PWMB_SR2;					//为了快速, 中断标志用一个局部变量处理
PWMB_SR2 = 0;					//清除中断标志

sr1 &= PWMB_ISR_En;				//每个通道可以单独允许中断处理

MT.CurrHCnt++;					//无论正反转,均累加,用于测速

if(sr1 & 0x02){					//B0000 0010	通道5,H1A上升沿
	MT.CurrHVal++;
}
if(sr1 & 0x04){					//B0000 0100	通道6,H1A下降沿
	MT.CurrHVal++;
}
if(sr1 & 0x08){					//B0000 1000	通道7,H1B上升沿
	MT.CurrHVal++;
}
if(sr1 & 0x10){					//B0001 0000	通道8,H1B下降沿
	MT.CurrHVal++;
}

}

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要排查STC8HPWM输出问题,需要注意以下几个方面: 首先需要确认是否将PWM口正确的配置为PWM输出口,是否配置正确的周期和占空比。可以检查程序中的相关设置,或者直接查看寄存器(如PWM_CONTR寄存器)的值是否正确。 其次需要确认是否连接了合适的负载,比如LED灯或者电机等。如果负载过大或过小都有可能导致PWM输出不正常。 还需要检查是否将PWM的引脚连接到正确的端口。在连接过程中可能发生误接或者并未成功连接引脚,导致PWM无法送到正确的端口。 如果以上检查均正常,还需要注意是否存在其他异常因素,比如系统时钟异常或者程序中其他设置冲突等。可以使用调试工具或者在程序中加入调试代码,逐步排查问题。 综上所述,当STC8HPWM输出时,需要从以上几个方面进行排查,以确定具体的问题所在,并进行相应的修复。 ### 回答2: 对于STC8H单片机PWM输出问题,一般有以下几种可能的原因: 1. 硬件连接问题: 首先需要检查PWM输出管脚与其他电路的连接是否正确,如是否与负载、电源等连接正常。 2. IO口设置问题: 需要检查相关IO口是否设置为PWM输出模式,以及是否设置正确,如重设是否正确。 3. 定时器设置问题:需要检查定时器的初始化是否正确,例如定时器模式、计数器初始值、时钟源和分频数等。 4. PWM频率和占空比问题: 需要检查PWM输出的频率范围和占空比值是否在要求范围内。如果PWM频率太高或太低、占空比值不正确,都可能导致PWM输出无效。 5. 软件实现问题: 如程序逻辑是否正确,是否存在编译错误等。 以上是可能导致STC8H单片机PWM输出无效的几种情况,需要根据实际情况逐一排查,找到具体原因并进行解决。 ### 回答3: 如果stc8h pwm没有输出,可能是以下几个原因: 1.电路问题:检查PWM输出是否连接正确,检查连接线是否有开路或者短路的情况,检查电源线和接地线是否连接良好。 2.程序问题:检查程序是否正确,是否有错误或者遗漏。检查pwm的GPIO配置是否正确,是否初始化了pwm的相关寄存器。 3.硬件问题:检查定时器的时钟分频是否正确,是否选择了正确的输出模式。检查定时器和pwm的硬件连接是否正确,是否有损坏的元件。 4.电源问题:检查电源供电是否稳定,电压是否满足要求。如果电源电压不足,会影响pwm输出。 如果以上四个方面都排除了,可以考虑对stc8h的芯片进行检查,是否存在硬件故障。在检查过程中,需要注意安全防护,避免电路短路或者其他意外情况的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值