工具/软件:Code Composer Studio
您好、
我目前 正在与一个团队合作进行一个项目、在该项目中、我们从2个光传感器获取输入、并根据它们的值旋转我们的伺服电机。
我们在 TivaTM4C123G LaunchPad 技术讲座中学习了如何使用 CCS 和对 TM4C 进行编程。 但是、由于本实验仅涉及一个传感器、因此有关此主题的信息不够。
我们非常感谢您在如何设置和初始化传感器方面提供的任何帮助。
谢谢
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
您好、
我目前 正在与一个团队合作进行一个项目、在该项目中、我们从2个光传感器获取输入、并根据它们的值旋转我们的伺服电机。
我们在 TivaTM4C123G LaunchPad 技术讲座中学习了如何使用 CCS 和对 TM4C 进行编程。 但是、由于本实验仅涉及一个传感器、因此有关此主题的信息不够。
我们非常感谢您在如何设置和初始化传感器方面提供的任何帮助。
谢谢
如果您参考本 技术讲座中的实验14b、它将使用 传感器集线器 Booster Pack。 该 Booster Pack 上的光传感器是 ISL29023 、它通过 I2C 总线与微控制器连接。 ISL29023具有一个7位硬编码 I2C 地址0x44、因此您不能将两个器件放在同一 I2C 总线上。 (没问题、TM4C123GH6PM 有4个 I2C 模块。) 您可以通过所连接的 I2C 模块的基址来解决单独的光传感器。 这是您的硬件设计的函数。
否、0x44是光传感器中的硬编码 I2C 地址。 在传感器集线器上、光传感器连接在 I2C 总线3上、即引脚61和62。 当您创建具有2个光传感器的硬件时、请将另一个放置在 I2C 总线0 (引脚47和48)、I2C 总线 1 (引脚23和24)或 I2C 总线2 (引脚59和60)上。 选择可能取决于您使用的其他外设。 然后、在软件中、像 LIGHT_ISL29023.c 文件的第520行一样、调用函数 I2CMInit 两次。 使用一个 I2C 模块的基地址、然后 使用另一个 I2C 模块的基地址填充两个结构。 例如、假设您使用 I2C2和 I2CC3:
I2CMInit (&g_sI2CInst1、I2C2_base、INT_I2C2、0xff、0xff、 ROM_SysCtlClockGet (); I2CMInit (&g_sI2CInst2、I2C3_base、INT_I2C3、0xff、0xff、 ROM_SysCtlClockGet ();
您好!
再次感谢您的帮助。 我尝试实施我在讨论中理解的内容、并希望您能查看下面的代码。
该器件应从两个传感器获取光测量值并进行比较
#include #include include "inc/tm4c123gh66.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/sysctl.h" #include "driverlib/interrupt.h" #include "driverlib/gpio.h" #include "driverlib/timerlib/sensore.h" #define 2 :#sensorle/cn/sensorlle.endorle/#include "1ntrendorl/sensorle.1ns/delt_sensorle.1nle.cn/sensorle.cn/sensorle.cn/sensorle.hrtle.hr.1#include "#x/2202.ns/delt_sensorle.hrtle.ine/rble.1n.id/cn/sensorle.hrt_sensorle.id/intrendorle.hr.id/#include "#include "#x/2n. // PORTB 引脚2:I2C0SCL // PORTB 引脚3:I2C0SDA #define ISL29023_I2C_address 0x44 // ISL29023 I2C 地址 tI2CMInstance_sI2C023 Instor1;// I2C 主驱动器结构 tISL29023_sISL29023Insisnstance g_sI2c2Instorg/ 无符号 I Sensorflag1;/I2I 无符号 I2C 主驱动器结构 tag1;I2I 无符号 I Sensort 无符号 I 2 Sensortag1;I2I 无符号 Sensort 无符号 I2I 无符号 Sensortag1;I2I 无符号 I2I 无符号 I 无符号 I 无符号 I 无符号 I 2 // I2C 主驱动程序结构 tISL29****g_sISL29023InsSensor2t;// ISL29023传感器驱动程序结构 volatile unsigned long g_vui8DataFlagSensor2;//数据就绪标志 volatile unsigned long g_vui8FlagSensor2;//错误标志 //********* void ISL29023AppCallback (void * pvCallbackData、uint_fast8_t ui8Status) { if (ui8Status = I2CM_STATUS_SUCCESS) { G_vui8DataFlagSensor1=1; } G_vui8ErrorFlagSensor1 = ui8Status; } //********* void ISL29023I2CIntHandler (void) { I2CMIntHandler (&g_sI2CInstSensor1); I2CMIntHandler (&g_sI2CInstSensor2); } //********* void ISL29023AppErrorHandler (char * pcFilename、uint_fast32_t ui32Line) { while (1) { } } //********* void ISL29023AppI2CWait (char * pcFilename、uint_fast32_t ui32Line) { while ((g_vui8DataFlagSensor1 = 0)&&(g_vui8ErrorFlagSensor1 = 0) { } if (g_vui8ErrorFlagSensor1) { ISL29023AppErrorHandler (pcFilename、ui32Line); } G_vui8DataFlagSensor1 = 0; } //********* //函数 void fredFunction (bool c){ uint8_t ui8LED = 0;// LED 如果(c){ GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1|GPIO_PIN_3、0x08);//由于方向为顺时针,因此会显示绿色指示灯 }否则{ GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、0x02);//自逆时针方向开始亮起红灯 } } //end of function/** *\brief 初始化所有变量 */ int main (void){ //变量声明 fAmbientSensor1; fAmbientSensor2; uint8_t ui8Mask; //使用源 PLL、16MHz 和主振荡 SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCL_MAIN|SYSCTAL_XTAL_16MHz)将时钟初始化为400/ 2/5 = 50MHz; // *对于第1相、电机将被逆 时针 输出 LED 引脚012_GPIO_PEDIT_GPIO011*(*)*输出引脚012_GPIO_P011_GPIOPT_GPIO012_GPIO_GPIO013_GPIO_1);*输出 0x00);//清除 LED //初始化传感器1 ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); ROM_SysCtlPeripheralEnable (SYSCTL_Periph_I2C3); ROM_GPIOPinConfigure (GPIO_PD0_I2C3SCL); ROM_GPIOPINSDA_GPIOC1 (GPIOCTO_PI_PI2TPSIMP_GPIOTPSIMP_1_GPIOTPSIMP_GPIOTPSIMP_GPIOTPSIMP_GC1) GPIO_PIN_0); ROM_GPIOPinTypeI2C (GPIO_PORTD_base、GPIO_PIN_1); I2CMInit (&G) sI2CInstSensor1、I2C3_base、 INT_I2C3、0xFF、0xFF、ROM_SysCtlClockGet (); SysCtlDelay (SysCtlClockGet ()/ 3); ISL29023Init (&g_sISL29023InsSensor1t、&g_sI2CInstSensor1、 ISL29023_I2C_address、ISL29023AppCallback、&g_sISL29023InsSensor1t); ISL29023AppI2CWait (__file___、 __LINE__); ui8Mask =(ISL29023_CMD_I_OP_MODE_M ); ISL29023ReadModifyWrite (&g_sISL29023InsSensor1t、ISL29023_O_CMD_I、~ui8Mask、 (ISL29023_CMD_CONT_MODE) ISL29023AppCallback、&g_sISL29023InsSensor1t); ISL29023AppI2CWait (_ file__、_ line__); /**初始化传感器2 */ ROM_SCIPL_GPIO5 (SYSCROM_PI2ROM )配置 GPIO2_GPIO2_GPIO4 (SYSCL_PI_GPIO2_GPIO4) GPIO_PIN_4); ROM_GPIOPinTypeI2C (GPIO_Porte _BASE、GPIO_PIN_5); I2CMInit (&g_sI2CInstSensor2、I2C2_base、INT_I2C2、0xFF、0xFF、 ROM_SysCtlClockGet (); SysCtlDelay (SysCtlClockGet ()/3); ISL29023Init (&g_sISL29023InsSensor2t、&g_sI2CInstSensor2、 ISL29023_I2C_ADDRESS、ISL29023AppCallback、&g_sISL29023InsSensor2t); ISL29023AppI2CWait (__file__、__line__); ui8Mask =(ISL29023_CMD_I_OP_MODE_M); ISL29023ReadModifyWrite (&G) sISL29023InsSensor2t、ISL29023_O_CMD_I、~ui8Mask、 (ISL29023_CMD_I_OP_MODE_ALS_CONT)、 ISL29023AppCallback、&g_sISL29023InsSensor2t); ISL29023AppI2CWait (__file__、__line__); ROM_IntMasterEnable(); while (1){ ISL29023DataRead (&g_sISL29023InstSensor1、ISL29023AppCallback、&g_sISL29023InstSensor1); ISL29023AppI2CWait (__file__、__line__); ISL29023DataLightVisibleGetFloat (&g_sISL29023InstSensor1、&fAmbientSensor1); ISL29023DataRead (&g_sISL29023InstSensor2、ISL29023AppCallback、&g_sISL29023InstSensor2); ISL29023AppI2CWait (__file__、__line__); ISL29023DataLightVisibleGetFloat (&g_sISL29023InstSensor2、&fAmbientSensor2); // if (abs (fAmbientSensor1 - fAmbientSensor2 > threshold)){ // 调用函数 //} } 返回0; }