主题中讨论的其他器件:Energia、 UCC27321
工具/软件:TI C/C++编译器
大家好、
我使用 MSP430F5529LP 生成宽度为纳秒级的脉冲。 我在 Energia 中实现了以下代码:
#define Arduino_main
#include "wiring_prive.h"
#include "PINS_Energia.h"
#define nop __asm____volatile__("nop\n\t");//定义 nop (无操作)指令,仅浪费1个时钟周期(1/25MHz = 40ns)
#define BP_TRIG P2_0 //激光触发信号
#define BP_GPIO_EN P7_4 // UCC27321 (MOSFET 驱动器)使能
#define STOP P2_1
//按下此按钮时,触发信号通过进入无限循环而停止;要退出循环,必须按下 RST (S3)按钮,这将重新启动触发信号
#define LED P1_0 //在触发停止时开启
unsigned int T_pulse = 100;//T_puls=1/PRR 必须保证 Duty_cycle < 0.1%(激光限值)
void my_digitalWrite (uint8_t pin、uint8_t val)//预定义函数引入了太多的延迟
{
uint8_t 位= digitalPinToBitMask (pin);
volatile uint8_t * out = portOutputRegister (digitalPinToPort (pin));
(Val ==低电平? *out &=~位:*out |=位);//替换 if 语句-查看是否更快
}
void setup(){
PinMode (BP_TRIG、OUTPUT);//将两个引脚定义为输出
引脚模式(BP_GPIO_EN、输出);
引脚模式(STOP、INPUT_PULLUP);//激活停止按钮
引脚模式(LED、输出);
digitalWrite (BP_GPIO_EN、HIGH);//启用驱动程序
my_digitalWrite (BP_TRIG、LOW);//激光关闭
attachInterrupt (STOP、TRIG_STOP、FALLING);//按下按钮时会触发中断
my_digitalWrite (LED、LOW);//启用驱动程序
}
void loop(){
delayMicroseconds (T_pulse);//以微秒为单位的关闭周期
my_digitalWrite (BP_TRIG,HIGH );
NOP;//每个 nop 引入~40ns 延迟@ 25MHz
my_digitalWrite (BP_TRIG、LOW);/
}
void trig_stop ()
{
my_digitalWrite (BP_GPIO_EN、LOW);//启用驱动程序
my_digitalWrite (BP_TRIG、LOW);//激光关闭
my_digitalWrite (LED、高电平);
while (true){}//无限循环、直到按下 RST (S3)按钮
}
首先,我使用了 digitalWrite()和单个 nop,但后来我注意到第一个函数引入了大约1-2us 的延迟,使脉冲比我想的要宽得多。 然后我重写 my_digitalWrite、但找不到函数 digitalPinToBitMask、 portOutputRegister 和 digitalPinToPort。 是否有人可以帮助我找到一个解决方案来减少这种延迟? 是否需要在较低级别工作?
提前感谢、
Joaquim