在互补pwm输出的下降沿产生一个短脉冲问题
在互补pwm输出的下降沿产生一个短脉冲几个us,但是总是有延时,不知道为什莫,是不是实现方式不对,希望大家帮忙以下是程序 用的是P10和P13 生成互补带死区波形 然后外部中断0检测P10的下降沿,在中断里控制P20产生短脉冲
#include "STC8H.h"
#include "intrins.h"
void main(void)
{
P_SW2 = 0x80;
P0M1 = 0x00;
P0M0 = 0xFF;
P1M1 = 0x00;
P1M0 = 0xFF;
P2M1 = 0x00;
P2M0 = 0x00;
P3M1 = 0x00;
P3M0 = 0x00;
IT0 = 1; //使能INT0下降沿中断
EX0 = 1; //使能INT0中断
PWMA_ENO = 0xFF; //IO输出PWM
PWMA_PS = 0x00; //00:PWM at P1
//00:PWM at P1
/**********************************************************
PWMx_duty = *100
***********************************************************/
PWMA_PSCRH = 0x00; //预分频寄存器
PWMA_PSCRL = 0x00;
PWMA_DTR = 24; //死区时间配置
PWMA_CCMR1 = 0x68; //通道模式配置
PWMA_CCMR2 = 0x68;
PWMA_ARR = 1200; //自动重装载寄存器,计数器overflow点
PWMA_CCR1 = 100; //计数器比较值
PWMA_CCR2 = 1100;
PWMA_CCER1 = 0x55; //配置通道输出使能和极性
PWMA_BKR = 0x80; //主输出使能 相当于总开关
PWMA_IER = 0x02; //使能中断
PWMA_CR1 = 0x01; //使能计数器
P20 = 0;
EA = 1;
while (1);
}
void PWMA_ISR() interrupt 26
{
if(PWMA_SR1 & 0X02)
{
PWMA_SR1 &=~0X02;
}
}
void INT0_Isr() interrupt 0
{
P20 = 1;
_nop_();
_nop_();
P20 = 0;
}
用逻辑分析仪看,检测到下降沿,到产生短脉冲,有延时,怎末才能没有延时,有什莫解决办法
已发梁工帮忙看下,今周末,可能要等 外部中断0检测P10的下降沿, 响应中断,在中断里控制P20产生跳变,需要6---10个时钟的时间,莫得办法消除。
如果是用ARM的F3, 这个延时要40---70个时钟的时间。 互补输出是硬件自动的,
P1.0与P1.1、P1.2与P1.3是两对互补输出的PWM,
但是P1.0和P1.3不是互补关系。可以下载我的例程参考:
STC8H系列-高级PWM范例程序下载,2024/1/3 更新
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1779
(出处: 国芯技术交流网站)
梁工 发表于 2024-11-10 14:27
互补输出是硬件自动的,
P1.0与P1.1、P1.2与P1.3是两对互补输出的PWM,
但是P1.0和P1.3不是互补关系。可以 ...
那么短脉冲的成因是? VCC 发表于 2024-11-10 15:52
那么短脉冲的成因是?
短脉冲有多短?用示波器观察,不要用逻辑分析仪。
本帖最后由 VCC 于 2024-11-10 18:42 编辑
梁工 发表于 2024-11-10 18:09
短脉冲有多短?用示波器观察,不要用逻辑分析仪。
复现了波形,并且弄清楚了楼主究竟在讲什么
应该是个误会
片外将P32(INT0输入)和P10(PWM输出)短接起来
然后在INT0的中断ISR里做如下操作:
楼主问:
为什么P21隔了这么久才产生短脉冲?
VCC 发表于 2024-11-10 18:40
复现了波形,并且弄清楚了楼主究竟在讲什么
答案是显然的
因为外部中断要由CPU处理,中断触发 到 进入ISR函数 这个过程需要一些时间 VCC 发表于 2024-11-10 18:40
复现了波形,并且弄清楚了楼主究竟在讲什么
是的就是这个意思,是P20,这个短脉冲我想周期还是1200,占空比大概2个us吧,就是在两个脉冲的下降沿产生,这个用外部中断是我想的办法,我也觉得不太可靠,我想用本身pwm口产生这个脉冲信号,因为对这个16位的pwm不太熟悉,请大家帮忙给个思路 需要瞬时响应的信号不要用中断,简单的硬件电路就实现了,
页:
[1]
2