volatile uint32_t measure_Cnt = 0;
volatile uint32_t measure_Buf[3];
volatile float distance = 0;
uint32_t sr04_time=0;
void SR04_Display(void)
{
if(uwTick - sr04_time<200) return;
sr04_time = uwTick;
if(measure_Cnt==0)
{
measure_Cnt=1;
DL_GPIO_setPins(SR04_PORT,SR04_TRIG_PIN);
delay_us(100);
DL_GPIO_clearPins(SR04_PORT, SR04_TRIG_PIN);
//启动定时器
NVIC_EnableIRQ(CAPTURE_0_INST_INT_IRQN);
DL_TimerG_startCounter(CAPTURE_0_INST);
}
}
void CAPTURE_0_INST_IRQHandler(void)
{
switch (DL_TimerG_getPendingInterrupt(CAPTURE_0_INST))
{
case DL_TIMERG_IIDX_CC0_UP:
measure_Buf[0] = DL_TimerG_getCaptureCompareValue(CAPTURE_0_INST, DL_TIMERG_CAPTURE_COMPARE_0_INDEX);
DL_TimerG_clearInterruptStatus(CAPTURE_0_INST,
DL_TIMERG_INTERRUPT_CC0_UP_EVENT); // 清除标志
break;
case DL_TIMERG_IIDX_CC0_DN:
measure_Buf[1] = DL_TimerG_getCaptureCompareValue(CAPTURE_0_INST, DL_TIMERG_CAPTURE_COMPARE_0_INDEX);
measure_Buf[2] = measure_Buf[1] - measure_Buf[0];
//转换为微秒(假设时钟频率为1MHz)
distance = (measure_Buf[2] * 0.0343) / 2;
DL_TimerG_clearInterruptStatus(CAPTURE_0_INST, DL_TIMERG_INTERRUPT_CC0_DN_EVENT);
measure_Cnt = 0; // 重置状态,等待下次触发
break;
case DL_TIMERG_IIDX_ZERO:
DL_TimerG_clearInterruptStatus(CAPTURE_0_INST, DL_TIMERG_INTERRUPT_CC0_DN_EVENT);
measure_Cnt = 0;
break;
default:
break;
}
}
void TIMERG_Capture_Init(void)
{
// 启用CC0的上升沿和下降沿中断
DL_TimerG_enableInterrupt(CAPTURE_0_INST,
DL_TIMERG_INTERRUPT_CC0_UP_EVENT |
DL_TIMERG_INTERRUPT_CC0_DN_EVENT);
// 启用定时器中断(确保NVIC已使能)
NVIC_EnableIRQ(CAPTURE_0_INST_INT_IRQN);
}
//{"P":21.58,"I":18.52,"D":0.01,"V":0.5}
//系统初始化
void System_Init(void)
{
//初始化外部中断
Encoder_Init();
//开启串口接收中断
NVIC_ClearPendingIRQ(UART_BLE_INST_INT_IRQN);
NVIC_EnableIRQ(UART_BLE_INST_INT_IRQN);
//OLED初始化
OLED_Init();
OLED_Clear();
//使能定时器中断
TIMERG_Capture_Init();
// NVIC_EnableIRQ(CAPTURE_0_INST_INT_IRQN);
// DL_TimerG_startCounter(CAPTURE_0_INST);
//PID初始化
Pid_Init(&MotorA_PID,21.58, 18.62, 0.01, 99, 0);
Pid_Init(&MotorB_PID,21.58, 18.62, 0.01, 99, 0);
}
学习记录 / 驱动库