2138891_zh-CN

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

2138891_zh-CN

2138891_zh-CN

使用LPC4370的GPIO产生的脉冲长度无法控制

我尝试使用LPC4370的GPIO来产生一对长度200ns左右的Push,Pull脉冲。一开始我使用定时器中断嵌套GPIO控制的方法实现,但观察示波器发现这种方法实现的脉冲宽度非常不稳定,能明显观察到既有ns级别的脉冲也有us级别的脉冲,并且无法控制。我尝试分析问题,但是无从下手,希望有人能够帮忙提供解决方法,或者帮忙指出问题出在哪里。这是我的中断函数,

其余相关代码及图像在楼下附上。

void TIMER2_IRQHandler(void)

{

/* Clear timer interrupt */

Chip_TIMER_ClearMatch(LPC_TIMER2, 1);

*gpnot = 0x02;

for(int j=0;j<2;j++){}

*gpnot = 0x42;

for(int j=0;j<2;j++){}

*gpnot = 0x42;

for(int j=0;j<2;j++){}

*gpnot = 0x42;

for(int j=0;j<2;j++){}

*gpnot = 0x40;


}


微信图片_20250723111730.jpg微信图片_20250723111730.jpg

回复: 使用LPC4370的GPIO产生的脉冲长度无法控制非常感谢,我参考这个示例实现了我的需求回复: 使用LPC4370的GPIO产生的脉冲长度无法控制

Hi @Maf33 

生成对齐互补的脉冲,请参考: https://www.nxp.com/docs/en/application-note/AN11538.zip  

这个应用笔记基本涵盖了了SCTimer所有基本的用法。


BR

Alice

回复: 使用LPC4370的GPIO产生的脉冲长度无法控制非常感谢回复,具体时序要求见楼下,似乎sct的pwm控制没办法做到这样子的时序?回复: 使用LPC4370的GPIO产生的脉冲长度无法控制

您好,非常感谢回复@Alice_Yang

我这边对push和pull的时序有要求,我之前的尝试过程中,sct的pwm控制的话好像无法做到边沿对齐(50ns以内的延迟也可以)并且发射三个脉冲?我不是很确定,也许只是我sct的做法不对?motorcontrolpwm功能似乎可以达成要求,但很可惜只在bga256封装的LPC4370上面支持,我所使用的是bga100的封装版本。微信图片_20250723160804.jpg微信图片_20250723160804.jpg

回复: 使用LPC4370的GPIO产生的脉冲长度无法控制

我的实际工程中需要HSADC配合定时器触发,当我试着产生仅仅一个脉冲的情况下,仍然无法产生200ns的脉冲,大部分时候产生的都是1us多的脉冲,甚至同样的延时方法无法得到相同的延时(包括NOP)。在一些测试中,可以在示波器上同时看到200ns的脉冲和1us的脉冲。

微信图片_20250723113904.jpg微信图片_20250723113904.jpg微信图片_20250723111230.jpg微信图片_20250723111230.jpg

回复: 使用LPC4370的GPIO产生的脉冲长度无法控制

我一开始怀疑问题出在定时器,于是我将定时器移除,使用单纯的for循环的来实现周期,这样可以达成我的需求:产生200ns宽度的Push Pull脉冲各三个,但当我用同样的方法将脉冲个数提高到四个甚至更多的时候,就又不受控制了,从图片中可以很明显看到,200ns的脉冲宽度直接变成了不同长度的us级别脉冲。

#define TICKRATE_HZ 1000

volatile uint32_t *gpset = &LPC_GPIO_PORT->SET[1];

volatile uint32_t *gpclr = &LPC_GPIO_PORT->CLR[1];

volatile uint32_t *gpnot = &LPC_GPIO_PORT->NOT[1];

int main(void){

/* —— 时钟与板级初始化 —— */

SystemCoreClockUpdate();

Board_Init();

DEBUGOUT("SystemCoreClock = %d Hz\r\n", SystemCoreClock);


// Chip_GPIO_Init(LPC_GPIO_PORT);

DEBUGSTR("GPIO driver init done\r\n");


/* —— PUSH: GPIO1[1] 输出 —— */

Chip_SCU_PinMux(1, 8, MD_EHS, FUNC0);

LPC_GPIO_PORT->DIR[1] |= 1<<1;


/* —— PULL: GPIO1[6] 输出 —— */

Chip_SCU_PinMux(1, 13, MD_EHS, FUNC0);

LPC_GPIO_PORT->DIR[1] |= 1<<6;

*gpset=0x42;

while (1) {

for(int i=0;i<180000;i++){}


*gpnot = 0x02;

for(int j=0;j<2;j++){}

*gpnot = 0x42;

for(int j=0;j<2;j++){}

*gpnot = 0x42;

for(int j=0;j<2;j++){}

*gpnot = 0x42;

for(int j=0;j<2;j++){}

*gpnot = 0x42;

for(int j=0;j<2;j++){}

*gpnot = 0x42;

for(int j=0;j<2;j++){}

*gpnot = 0x40;

}

return 0;

}

微信图片_20250723112957.jpg微信图片_20250723112957.jpg微信图片_20250723112739.jpg微信图片_20250723112739.jpg

标记 (1)
无评分
版本历史
最后更新:
‎11-20-2025 04:36 PM
更新人: