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.

[参考译文] CCS/TM4C123GH6PM:TM4C123GH6PM 配置2个光传感器

Guru**** 1808010 points
Other Parts Discussed in Thread: TM4C123GH6PM
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/578276/ccs-tm4c123gh6pm-tm4c123gh6pm-configuring-2-light-sensors

器件型号:TM4C123GH6PM

工具/软件:Code Composer Studio

您好、

我目前 正在与一个团队合作进行一个项目、在该项目中、我们从2个光传感器获取输入、并根据它们的值旋转我们的伺服电机。

我们在 TivaTmTM4C123G LaunchPad 技术讲座中学习了如何使用 CCS 和对 TM4C 进行编程。 但是、由于本实验仅涉及一个传感器、因此有关此主题的信息不够。  

我们非常感谢您在如何设置和初始化传感器方面提供的任何帮助。  

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Fred Gebrael">有关此主题的信息不够、因为本实验仅涉及一个传感器。  [/报价]

    也许应该注意到您/团队抱怨"信息不足"、然后绝对不提供有关您的2个光传感器的信息、这是公平/恰当的!

    这些传感器可能会根据到达传感器的光强度输出模拟电压电平或数字"1/0"。   需要根据传感器的输出采取不同的策略-(仍然未知)!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们使用的传感器与实验中引用的传感器相同,因此我们提到了我们使用的技术讲座。

    无需采取激进行为

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    任何外部人员如何知道这一点? 强迫帮手做更多工作可能并不是最有意义的。

    您可能希望调查:"以自己的 petard 来执行。" 这很少被称为"激进"。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    本次讨论将不会发生什么情况。 如果您不能帮助我们、只需让您的一位同事来处理。
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    本次讨论将不会发生什么情况。 如果您不能帮助我们、只需让您的一位同事来处理
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Fred Gebrael]这次讨论不会发生什么情况。 i[/报价]

    你还是错了。   我注意到、大多数光传感器都提供模拟输出、通常更高级的光传感器可能提供数字输出、这些数字输出会在某个已知的可调电平进行切换。  (这是"远"的地方。)   (注-不是一个词-不是两个词。)

    我祝你一切顺利——也许其他人会发现你更喜欢“可连接”。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您参考本 技术讲座中的实验14b、它将使用 传感器集线器 Booster Pack。 该 Booster Pack 上的光传感器是 ISL29023 、它通过 I2C 总线与微控制器连接。 ISL29023具有一个7位硬编码 I2C 地址0x44、因此您不能将两个器件放在同一 I2C 总线上。 (没问题、TM4C123GH6PM 有4个 I2C 模块。) 您可以通过所连接的 I2C 模块的基址来解决单独的光传感器。 这是您的硬件设计的函数。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢!
    因此、如果我要将传感器2连接到 Porta、我将使用与 lab14中相同的代码来相应地替换引脚、并使用与 Porta 相对应的 I2C 地址、而不是(0x44)正确?

    您能不能指出我在哪里可以找到应该替换0x44的地址
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    否、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;
    }