主题中讨论的其他器件: MSP432WARE
工具/软件:TI-RTOS
我的以下代码工作正常。 如果我的声纳传感器附近有物体、则读取 ADC 读数并打开 LED;如果物体远离、则关闭 LED。 它还具有2个应更改阈值的板载按钮中断、这来自示例代码、我不使用它。 这里我的问题是...我有7个声纳传感器。 我想为每个声纳传感器设置一个 ISR,该 ISR 将根据每个传感器的指定范围触发(这样,如果物体接近,我就可以控制电机)。 我的问题是如何根据我指定的范围在 ADC 读数上设置中断。 我正在尝试构建一个高效的系统、在这个系统中、我有一个无限循环、不执行任何操作、如果任何声纳传感器检测到某个范围内的物体、我指定它将触发自己的 ISR 并改变电机速度等。 我确信我可以为改变电机速度的每个读数执行一系列 if else 语句、但我觉得这是一个效率低下的缓慢系统。 如果我错了、请告诉我。 有关如何实现这一点的示例代码或 API 说明将非常有用。 我正在使用 Simplelink
TI 驱动程序实验室 GPIO 中断中的参考代码。
/*
* ==== empty.c ======
*
/* for usleep()*/
#include
#include
#include
/*驱动程序头文件*/
#include
#include
#include
//#include
//#include
//#include
//#include
//#include
/*板头文件*/
#include "Board.h"
/* GUI Composer 的全局变量*/
uint16_t adcValue = 0;
uint16_t 阈值= 500;
uint16_t 触发= 0;
/*
* ==== gpioButtonFxn0 ===
* Board_GPIO_BUTTON0上 GPIO 中断的回调函数。
*
void gpioButtonFxn0 (uint_least8_t 索引)
{
/*清除 GPIO 中断并递减阈值*/
if (threshold < 250){//确保阈值不会低于零
阈值= 0;
}否则{
阈值-= 250;//递减250
}
}
/*
* ==== gpioButtonFxn1 =========
* Board_GPIO_Button1上 GPIO 中断的回调函数。
* 并非所有电路板都使用此功能。
*
void gpioButtonFxn1 (uint_least8_t 索引)
{
/*清除 GPIO 中断并增加阈值*/
if (threshold > 16133){//确保阈值不会超出最大 ADC 范围
阈值= 16383;
}否则{
阈值+= 250;//递增250
}
}
/*
* ==== mainThread ====
*
void * mainThread (void * arg0)
{
/*~10个循环/秒*/
uint32_t 时间= 100000;
/*调用驱动程序初始化函数*/
GPIO_init();
adc_init();
// I2C_init ();
// SDSPI_init ();
// spi_init();
// uart_init();
// Watchdog_init();
/*打开显示驱动程序*/
Display_Handle displayHandle;
Display_Params displayParams;
Display_Params_init (&displayParams);
DisplayHandle = Display_open (Display_Type_UART、NULL);
/*打开 ADC 驱动程序*/
ADC_Handle ADC;
ADC_Params 参数;
ADC_PARAMS_INIT (params);
ADC = ADC_open (Board_ADC6、params);
if (ADC == NULL){
//初始化 ADC 通道0时出错
while (1);
}
/*安装按钮回调..... 2个参数、即将要执行的 IO
*触发我们想要的中断和回调函数
*在中断发生时执行。 *
GPIO_setCallback (Board_GPIO_BUTTON0、gpioButtonFxn0);
GPIO_setCallback (Board_GPIO_Button1、gpioButtonFxn1);
/*启用中断*/
GPIO_enableInt (Board_GPIO_BUTTON0);
GPIO_enableInt (Board_GPIO_Button1);
while (1){
int_fast16_t res;
RES = ADC_convert (ADC、&adcValue);
if (res == ADC_STATUS_SUCCESS){
Display_printf (displayHandle、1、0、"ADC 读取%d"、adcValue);
if (adcValue < threshold){
GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_ON);
触发= 1;
}否则{
GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_OFF);
触发= 0;
}
}
usleep(时间);
}
}