文章目录

  • 前言
  • 一、TCS3472是什么?
  • 二、RGB 颜色传感器分析
  • 三、驱动TCS3472
    • 3.1读取R,G,B
  • 四、测试TCS3472
    • 4.1参数测试
  • 总结


前言

最近由于课程设计要求,用到了一款颜色传感器芯片TCS3472,可以读取物体表面三种RGB三种颜色分量。
环境 keil5 uvison
单片机:STM32ZET6,颜色传感器TCS3472
标准库驱动

串口或者WIFI读取

一、TCS3472是什么?

TCS3472 光电转换器包含一个 3×4 光电二极管阵列、四个集成光电二极管电流 的模数转换器(ADC)、数据寄存器、一个状态机和一个 I²C 接口。
3×4 光电二极 管阵列由红光、绿光、蓝光和清晰(未滤光)光电二极管组成。此外,光电二极管 还涂有红外阻挡滤光片。
四个积分 ADC 同时将放大的光电二极管电流转换为 16 位数字值。转换周期完成后,结果被传输到数据寄存器,数据寄存器采用双缓冲 方式,以确保数据的完整性。所有内部时序以及低功率等待状态都由状态机控制。
TCS3472 数据通信通过高达 400 kHz 的双线 I²C 快速串行总线完成。行业标准 I²C 总线方便了与微控制器和嵌入式处理器的轻松直接连接。除 I²C 总线外,TCS3472 还提供单独的中断信号输出。当中断使能且超过用户定义的阈值时,有效-低电 平中断将被置位,并保持置位状态,直到控制器将其清零。此中断功能无需轮询 TCS3472,从而简化并提高了系统软件的效率。用户可以定义中断阈值的上限和 下限,并应用中断持续过滤器。中断持续过滤器允许用户定义在生成中断之前所 需的连续超出阈值事件的数量。中断输出是开漏的,因此可以与其他器件进行布 线。

二、RGB 颜色传感器分析

颜色传感器用白光照射到物体,物体反射回来的光由红光、绿光、蓝光和清 晰(未滤光)光电二极管吸收,产生光电效应,并且产生光电流,四个积分 ADC 同时将放大的光电二极管电流转换为 16 位数字值。转换周期完成后,结果被传 输到数据寄存器,数据寄存器采用双缓冲方式,以确保数据的完整性。

三、驱动TCS3472

TCS3472采用IIC驱动,STM32采用IO口模拟IIc驱动
TCS3472.c
这个是用寄存器来写的,PB口,如果要改端口的话,也要改相应的寄存器。

#include "sys.h"
/******************************************************************************/
#define TCS34725_ADDRESS          (0x29)#define TCS34725_COMMAND_BIT      (0x80)#define TCS34725_ENABLE           (0x00)
#define TCS34725_ENABLE_AIEN      (0x10)    /* RGBC Interrupt Enable */
#define TCS34725_ENABLE_WEN       (0x08)    /* Wait enable - Writing 1 activates the wait timer */
#define TCS34725_ENABLE_AEN       (0x02)    /* RGBC Enable - Writing 1 actives the ADC, 0 disables it */
#define TCS34725_ENABLE_PON       (0x01)    /* Power on - Writing 1 activates the internal oscillator, 0 disables it */
#define TCS34725_ATIME            (0x01)    /* Integration time */
#define TCS34725_WTIME            (0x03)    /* Wait time (if TCS34725_ENABLE_WEN is asserted) */
#define TCS34725_WTIME_2_4MS      (0xFF)    /* WLONG0 = 2.4ms   WLONG1 = 0.029s */
#define TCS34725_WTIME_204MS      (0xAB)    /* WLONG0 = 204ms   WLONG1 = 2.45s  */
#define TCS34725_WTIME_614MS      (0x00)    /* WLONG0 = 614ms   WLONG1 = 7.4s   */
#define TCS34725_AILTL            (0x04)    /* Clear channel lower interrupt threshold */
#define TCS34725_AILTH            (0x05)
#define TCS34725_AIHTL            (0x06)    /* Clear channel upper interrupt threshold */
#define TCS34725_AIHTH            (0x07)
#define TCS34725_PERS             (0x0C)    /* Persistence register - basic SW filtering mechanism for interrupts */
#define TCS34725_PERS_NONE        (0b0000)  /* Every RGBC cycle generates an interrupt                                */
#define TCS34725_PERS_1_CYCLE     (0b0001)  /* 1 clean channel value outside threshold range generates an interrupt   */
#define TCS34725_PERS_2_CYCLE     (0b0010)  /* 2 clean channel values outside threshold range generates an interrupt  */
#define TCS34725_PERS_3_CYCLE     (0b0011)  /* 3 clean channel values outside threshold range generates an interrupt  */
#define TCS34725_PERS_5_CYCLE     (0b0100)  /* 5 clean channel values outside threshold range generates an interrupt  */
#define TCS34725_PERS_10_CYCLE    (0b0101)  /* 10 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_15_CYCLE    (0b0110)  /* 15 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_20_CYCLE    (0b0111)  /* 20 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_25_CYCLE    (0b1000)  /* 25 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_30_CYCLE    (0b1001)  /* 30 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_35_CYCLE    (0b1010)  /* 35 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_40_CYCLE    (0b1011)  /* 40 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_45_CYCLE    (0b1100)  /* 45 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_50_CYCLE    (0b1101)  /* 50 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_55_CYCLE    (0b1110)  /* 55 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_60_CYCLE    (0b1111)  /* 60 clean channel values outside threshold range generates an interrupt */
#define TCS34725_CONFIG           (0x0D)
#define TCS34725_CONFIG_WLONG     (0x02)    /* Choose between short and long (12x) wait times via TCS34725_WTIME */
#define TCS34725_CONTROL          (0x0F)    /* Set the gain level for the sensor */
#define TCS34725_ID               (0x12)    /* 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727 */
#define TCS34725_STATUS           (0x13)
#define TCS34725_STATUS_AINT      (0x10)    /* RGBC Clean channel interrupt */
#define TCS34725_STATUS_AVALID    (0x01)    /* Indicates that the RGBC channels have completed an integration cycle */
#define TCS34725_CDATAL           (0x14)    /* Clear channel data */
#define TCS34725_CDATAH           (0x15)
#define TCS34725_RDATAL           (0x16)    /* Red channel data */
#define TCS34725_RDATAH           (0x17)
#define TCS34725_GDATAL           (0x18)    /* Green channel data */
#define TCS34725_GDATAH           (0x19)
#define TCS34725_BDATAL           (0x1A)    /* Blue channel data */
#define TCS34725_BDATAH           (0x1B)#define TCS34725_INTEGRATIONTIME_2_4MS   0xFF   /**<  2.4ms - 1 cycle    - Max Count: 1024  */
#define TCS34725_INTEGRATIONTIME_24MS    0xF6   /**<  24ms  - 10 cycles  - Max Count: 10240 */
#define TCS34725_INTEGRATIONTIME_50MS    0xEB   /**<  50ms  - 20 cycles  - Max Count: 20480 */
#define TCS34725_INTEGRATIONTIME_101MS   0xD5   /**<  101ms - 42 cycles  - Max Count: 43008 */
#define TCS34725_INTEGRATIONTIME_154MS   0xC0   /**<  154ms - 64 cycles  - Max Count: 65535 */
#define TCS34725_INTEGRATIONTIME_240MS   0x9C   /**<  240ms - 100 cycles - Max Count: 65535 */
#define TCS34725_INTEGRATIONTIME_700MS   0x00   /**<  700ms - 256 cycles - Max Count: 65535 */#define TCS34725_GAIN_1X                 0x00   /**<  No gain  */
#define TCS34725_GAIN_4X                 0x01   /**<  4x gain  */
#define TCS34725_GAIN_16X                0x02   /**<  16x gain */
#define TCS34725_GAIN_60X                0x03   /**<  60x gain */
/******************************************************************************/
extern void delay_s(u32 i);#define TCS_SDA_IN()  {GPIOB->CRH&=0xFFFF0FFF;GPIOB->CRH|=8<<12;}
#define TCS_SDA_OUT() {GPIOB->CRH&=0xFFFF0FFF;GPIOB->CRH|=3<<12;}
#define TCS_SDA_READ   GPIOB->IDR&(1<<11)#define TCS_SCL_H     GPIO_SetBits(GPIOB,GPIO_Pin_10)
#define TCS_SCL_L     GPIO_ResetBits(GPIOB,GPIO_Pin_10)
#define TCS_SDA_H     GPIO_SetBits(GPIOB,GPIO_Pin_11)
#define TCS_SDA_L     GPIO_ResetBits(GPIOB,GPIO_Pin_11)
/******************************************************************************/
#define max3v(v1, v2, v3)   ((v1)<(v2)? ((v2)<(v3)?(v3):(v2)):((v1)<(v3)?(v3):(v1)))
#define min3v(v1, v2, v3)   ((v1)>(v2)? ((v2)>(v3)?(v3):(v2)):((v1)>(v3)?(v3):(v1)))typedef struct{unsigned short  c;      //[0-65536]unsigned short  r;unsigned short  g;unsigned short  b;
}COLOR_RGBC;//RGBCtypedef struct{unsigned short h;       //[0,360]unsigned char  s;       //[0,100]unsigned char  l;       //[0,100]
}COLOR_HSL;//HSLCOLOR_RGBC rgb;
COLOR_HSL  hsl;
/******************************************************************************/
void TCS34725_I2C_Init()
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;//PB10/PB10=外接I2CGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//通用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度GPIO_Init(GPIOB, &GPIO_InitStructure);//对选中管脚初始化GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);   //高电平
}
/*********************************************/
void TCS34725_I2C_Start()
{TCS_SDA_OUT();TCS_SDA_H;TCS_SCL_H;delay_s(40);//delay_us(4);TCS_SDA_L;delay_s(40);//delay_us(4);TCS_SCL_L;
}
/*********************************************/
void TCS34725_I2C_Stop()
{TCS_SDA_OUT();TCS_SCL_L;TCS_SDA_L;delay_s(40);//delay_us(4);TCS_SCL_H;TCS_SDA_H;delay_s(40);//delay_us(4);
}
/*********************************************/
//返回值:1,接收应答失败
//        0,接收应答成功
u8 TCS34725_I2C_Wait_ACK()
{u32 t=0;TCS_SDA_IN();//SDA设置为输入  TCS_SDA_H; delay_s(10);//delay_us(1);TCS_SCL_H; delay_s(10);//delay_us(1);while(TCS_SDA_READ){t++;if(t > 250){TCS34725_I2C_Stop();return 1;}}TCS_SCL_L;return 0;
}
/*********************************************/
//产生ACK应答
void TCS34725_I2C_ACK()
{TCS_SCL_L;TCS_SDA_OUT();//sda线输出TCS_SDA_L;delay_s(20);//delay_us(2);TCS_SCL_H;delay_s(20);//delay_us(2);TCS_SCL_L;
}
/*********************************************/
//不产生ACK应答
void TCS34725_I2C_NACK()
{TCS_SCL_L;TCS_SDA_OUT();//sda线输出TCS_SDA_H;delay_s(20);//delay_us(2);TCS_SCL_H;delay_s(20);//delay_us(2);TCS_SCL_L;
}
/*********************************************/
//I2C发送一个字节
void TCS34725_I2C_Send_Byte(u8 byte)
{u8 i;TCS_SDA_OUT();//sda线输出TCS_SCL_L;//拉低时钟开始数据传输for(i = 0; i < 8; i++){if(((byte&0x80)>>7)==1)TCS_SDA_H;elseTCS_SDA_L;byte <<= 1;delay_s(20);//delay_us(2);TCS_SCL_H;delay_s(20);//delay_us(2);TCS_SCL_L;delay_s(20);//delay_us(2);}
}
/*********************************************/
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 TCS34725_I2C_Read_Byte(u8 ack)
{u8 i,receive = 0;TCS_SDA_IN();for(i = 0; i < 8; i++){TCS_SCL_L;delay_s(20);//delay_us(2);TCS_SCL_H;receive <<= 1;if(TCS_SDA_READ) receive++;delay_s(10);//delay_us(1);}if (!ack) TCS34725_I2C_NACK();//发送nACKelse TCS34725_I2C_ACK(); //发送ACK return receive;
}
/*********************************************/
/******************************************************************************** @brief Writes data to a slave device.** @param slaveAddress - Adress of the slave device.* @param dataBuffer - Pointer to a buffer storing the transmission data.* @param bytesNumber - Number of bytes to write.* @param stopBit - Stop condition control.*                  Example: 0 - A stop condition will not be sent;*                           1 - A stop condition will be sent.
*******************************************************************************/
void TCS34725_I2C_Write(u8 slaveAddress, u8* dataBuffer,u8 bytesNumber, u8 stopBit)
{u8 i = 0;TCS34725_I2C_Start();TCS34725_I2C_Send_Byte((slaveAddress << 1) | 0x00);      //发送从机地址写命令TCS34725_I2C_Wait_ACK();for(i = 0; i < bytesNumber; i++){TCS34725_I2C_Send_Byte(*(dataBuffer + i));TCS34725_I2C_Wait_ACK();}if(stopBit == 1) TCS34725_I2C_Stop();
}
/******************************************************************************** @brief Reads data from a slave device.** @param slaveAddress - Adress of the slave device.* @param dataBuffer - Pointer to a buffer that will store the received data.* @param bytesNumber - Number of bytes to read.* @param stopBit - Stop condition control.*                  Example: 0 - A stop condition will not be sent;*                           1 - A stop condition will be sent.
*******************************************************************************/
void TCS34725_I2C_Read(u8 slaveAddress, u8* dataBuffer, u8 bytesNumber, u8 stopBit)
{u8 i = 0;TCS34725_I2C_Start();TCS34725_I2C_Send_Byte((slaveAddress << 1) | 0x01);      //发送从机地址读命令TCS34725_I2C_Wait_ACK();for(i = 0; i < bytesNumber; i++){if(i == bytesNumber - 1){*(dataBuffer + i) = TCS34725_I2C_Read_Byte(0);//读取的最后一个字节发送NACK}else{*(dataBuffer + i) = TCS34725_I2C_Read_Byte(1);}}if(stopBit == 1) TCS34725_I2C_Stop();
}
/******************************************************************************** @brief Writes data into TCS34725 registers, starting from the selected*        register address pointer.** @param subAddr - The selected register address pointer.* @param dataBuffer - Pointer to a buffer storing the transmission data.* @param bytesNumber - Number of bytes that will be sent.** @return None.
*******************************************************************************/
void TCS34725_Write(u8 subAddr, u8* dataBuffer, u8 bytesNumber)
{u8 sendBuffer[10] = {0, };u8 byte = 0;sendBuffer[0] = subAddr | TCS34725_COMMAND_BIT;for(byte = 1; byte <= bytesNumber; byte++){sendBuffer[byte] = dataBuffer[byte - 1];}TCS34725_I2C_Write(TCS34725_ADDRESS, sendBuffer, bytesNumber + 1, 1);
}
/******************************************************************************** @brief Reads data from TCS34725 registers, starting from the selected*        register address pointer.** @param subAddr - The selected register address pointer.* @param dataBuffer - Pointer to a buffer that will store the received data.* @param bytesNumber - Number of bytes that will be read.** @return None.
*******************************************************************************/
void TCS34725_Read(u8 subAddr, u8* dataBuffer, u8 bytesNumber)
{subAddr |= TCS34725_COMMAND_BIT;TCS34725_I2C_Write(TCS34725_ADDRESS, (u8*)&subAddr, 1, 0);TCS34725_I2C_Read(TCS34725_ADDRESS, dataBuffer, bytesNumber, 1);
}
/******************************************************************************** @brief TCS34725设置积分时间** @return None
*******************************************************************************/
void TCS34725_SetIntegrationTime(u8 time)
{TCS34725_Write(TCS34725_ATIME, &time, 1);
}
/******************************************************************************** @brief TCS34725设置增益** @return None
*******************************************************************************/
void TCS34725_SetGain(u8 gain)
{TCS34725_Write(TCS34725_CONTROL, &gain, 1);
}
/******************************************************************************** @brief TCS34725使能** @return None
*******************************************************************************/
void TCS34725_Enable(void)
{u8 cmd = TCS34725_ENABLE_PON;TCS34725_Write(TCS34725_ENABLE, &cmd, 1);cmd = TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN;TCS34725_Write(TCS34725_ENABLE, &cmd, 1);//delay_s(600000);//delay_ms(3);//延时应该放在设置AEN之后
}
/******************************************************************************** @brief TCS34725失能** @return None
*******************************************************************************/
void TCS34725_Disable(void)
{u8 cmd = 0;TCS34725_Read(TCS34725_ENABLE, &cmd, 1);cmd = cmd & ~(TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN);TCS34725_Write(TCS34725_ENABLE, &cmd, 1);
}
/******************************************************************************** @brief TCS34725初始化** @return ID - ID寄存器中的值
*******************************************************************************/
u8 TCS34725_Init(void)
{u8 id=0;TCS34725_I2C_Init(); TCS34725_Read(TCS34725_ID, &id, 1);  //TCS34725 的 ID 是 0x44 可以根据这个来判断是否成功连接,0x4D是TCS34727;if(id==0x4D | id==0x44){TCS34725_SetIntegrationTime(TCS34725_INTEGRATIONTIME_50MS);TCS34725_SetGain(TCS34725_GAIN_1X);TCS34725_Enable();return 1;}return 0;
}
/******************************************************************************** @brief TCS34725获取单个通道数据** @return data - 该通道的转换值
*******************************************************************************/
u16 TCS34725_GetChannelData(u8 reg)
{u8 tmp[2] = {0,0};u16 data;TCS34725_Read(reg, tmp, 2);data = (tmp[1] << 8) | tmp[0];return data;
}
/******************************************************************************** @brief TCS34725获取各个通道数据** @return 1 - 转换完成,数据可用*        0 - 转换未完成,数据不可用
*******************************************************************************/
u8 TCS34725_GetRawData(COLOR_RGBC *rgbc)
{u8 status = TCS34725_STATUS_AVALID;TCS34725_Read(TCS34725_STATUS, &status, 1);if(status & TCS34725_STATUS_AVALID){rgbc->c = TCS34725_GetChannelData(TCS34725_CDATAL); rgbc->r = TCS34725_GetChannelData(TCS34725_RDATAL); rgbc->g = TCS34725_GetChannelData(TCS34725_GDATAL); rgbc->b = TCS34725_GetChannelData(TCS34725_BDATAL);return 1;}return 0;
}
/******************************************************************************/
//RGB转HSL
void RGBtoHSL(COLOR_RGBC *Rgb, COLOR_HSL *Hsl)
{u8 maxVal,minVal,difVal;u8 r = Rgb->r*100/Rgb->c;   //[0-100]u8 g = Rgb->g*100/Rgb->c;u8 b = Rgb->b*100/Rgb->c;maxVal = max3v(r,g,b);minVal = min3v(r,g,b);difVal = maxVal-minVal;//计算亮度Hsl->l = (maxVal+minVal)/2;   //[0-100]if(maxVal == minVal)//若r=g=b,灰度{Hsl->h = 0; Hsl->s = 0;}else{//计算色调if(maxVal==r){if(g>=b)Hsl->h = 60*(g-b)/difVal;elseHsl->h = 60*(g-b)/difVal+360;}else{if(maxVal==g)Hsl->h = 60*(b-r)/difVal+120;elseif(maxVal==b)Hsl->h = 60*(r-g)/difVal+240;}//计算饱和度if(Hsl->l<=50)Hsl->s=difVal*100/(maxVal+minVal);  //[0-100]elseHsl->s=difVal*100/(200-(maxVal+minVal));}
}
/******************************************************************************/

3.1读取R,G,B

只要把驱动代码写好,在主函数里面调用就可以了,这里开一个1ms的定时器

main.c文件

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "math.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "tcs34725.c"
#include "timer.h"
#include "esp8266.h"
#include "usart3.h"
/************************************************ALIENTEK精英STM32开发板实验4串口 实验   技术支持:www.openedv.com淘宝店铺:http://eboard.taobao.com 关注微信公众平台微信号:"正点原子",免费获取STM32资料。广州市星翼电子科技有限公司  作者:正点原子 @ALIENTEK
************************************************/
/**************************************************/#define LED_blink      GPIOA->ODR^=(1<<5)
/**************************************************/
void delay_s(u32 i)
{while(i--);
}void GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);//使能GPIOA,GPIOB,GPIOC,AFIO;GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;        //是LEDGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//速度GPIO_Init(GPIOA, &GPIO_InitStructure);           //对选中管脚初始化GPIO_SetBits(GPIOA,GPIO_Pin_5);                  //上电点亮LED
}int main(void){delay_init();            //延时函数初始化    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级GPIO_Config();uart_init(115200);   //串口初始化为115200usart3_init(115200);                 //串口初始化为115200LED_Init();                //LED端口初始化KEY_Init();          //初始化与按键连接的硬件接口delay_s(0x1fffff);TCS34725_Init();TIM3_Int_Init(999,71);  //1ms定时//esp8266_start_trans();                            //esp8266进行初始化//esp8266_send_data("20",50);printf("Initial OK!\r\n");while(1){{if(time1_cntr>=200)  //0.2s{time1_cntr=0;LED_blink;}if(time2_cntr>=1000)  //1s{time2_cntr=0;TCS34725_GetRawData(&rgb);  //读两次,实际测试时发现读到的颜色总是上一次的颜色RGBtoHSL(&rgb,&hsl);printf("R=%d G=%d B=%d C=%d\r\n",rgb.r,rgb.g,rgb.b,rgb.c);//u3_printf("R=%d G=%d B=%d C=%d\r\n",rgb.r,rgb.g,rgb.b,rgb.c); //发送命令//printf("H=%d S=%d L=%d\r\n",hsl.h,hsl.s,hsl.l);}}}
}

四、测试TCS3472

我们随便测试一下便知

4.1参数测试


这里可能看的不是很清楚,测的是我的手机壳,测得的数据是R=56,G=154,B=117
打开word看一下,是非常吻合的

数据手册里面积分时间也可以设置

总结

可能会出现的问题

  1. STM32 和 Arduino 例程串口输出没有数据或者数据输出乱码?
    答: 确认波特率是否设置为 115200,对于 STM32 例程请确认电脑正确连接开发
    板 USART1(PA9,PA10),PA9 为 TXD,并且选择正确的 COM 端口。控制面板->
    硬件->设 备管理器。

  2. STM32 和 Arduino 例程串口输出 RGB 数据全部为 0 或者初始化失败?
    答:请确认器件连接没有问题,如果没问题请按下复位按键。并且确认是否改了端口。如果改了,检查是否修改完全。

  3. 输出的 RGB 数据全为 253 并且中断引脚产生中断等等
    答:这种情况是光强超出检查范围,减小增益可以完美解决

  4. 修改积分时间后导致颜色不正常?
    答:因为积分时间决定了 RGBC 通道数据最大值,修改积分时间会导致颜色偏
    暗或者偏白。只需要增加或减少 LED 亮度即可。

  5. 修改积分时间无法触发中断或者一直重复中断?
    答: 中断是和 Clear 通道里面的数据进行比较,Clear 通道里面的数据和积分
    时间有关系,经过实际测量在增益为 60 倍情况下积分时间通道最大值

    所以用户如果需要速度比较快的采集数据时,要注意重新设置中断数值。另外
    在积分时间 为 2.4ms 时 RGB 数据比较低所以转换出来的颜色与实际颜色有
    偏差,需要加大 LED 灯亮度即可。

基于STM32的颜色传感器TCS3472相关推荐

  1. 基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计

    目录 1 项目概述 1.1 项目介绍 1.2 项目开发环境 1.3 小组人员及分工 2 需求分析 2.1 系统需求分析 2.2 可行性分析 2.3 项目实施安排 3 系统硬件设计 3.1 系统整体硬件 ...

  2. K_A13_001 基于STM32驱动霍尔开关传感器 串口与OLED0.96双显示

    K_A13_001 基于STM32驱动霍尔开关传感器 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 对应程序: 四.部分代码说明 1.接线引脚定义 STM32 ...

  3. 基于STM32的姿态传感器电路设计与使用

    文章目录 引言 程序设计描述 编写串口通信的驱动程序 编写系统延时程序 对于MPU6050姿态传感器进行初始化 编写定时中断程序 电路设计描述 具体设计分析 代码部分详细说明 设计实现效果 MPU60 ...

  4. 基于stm32的mpu6050传感器实验

    @TOCMPU6050+STM32学习笔记 学习了差不多两天的mpu6050,参考了很多篇博客还有看一些资料,今晚终于把这个东西在我的串口显示出来了,下面就废话不多说,开始我的笔记啦. 开发环境:uv ...

  5. 基于STM32对于光敏电阻传感器的光控应用

    文章就当学习笔记了,还是萌新,如有错误还请大佬多多指正. 前段时间一直在学校做项目,想给开发的机器人平台做个自动环境感应灯控,然后就想起来了光敏传感器,网上淘了一圈就买了一个亚博的光敏模块(主要是外观 ...

  6. 基于STM32设计的老人监护系统

    一.设计需求 1.1 项目背景 21世纪以来,随着科技的发展,在人们的生活水平不断的提升的同时中国老龄化人口问题日益严重,再加上社会经济的发展.许多子女外出打工,使得越来越多的空巢老人得不到及时有效的 ...

  7. 基于STM32的VEML6040颜色传感器应用

    *以下文章资源均来自互联网,文章内容仅供参考,如果侵犯了您的权益,请留言或通过邮箱与我联系. The following article resources are all from the Inte ...

  8. 9、★♥★基于STM32单片机的颜色检测仪设计♥☆

    9.★♥★基于STM32单片机的颜色检测仪设计♥☆ 文章目录 9.★♥★基于STM32单片机的颜色检测仪设计♥☆ 引言 1.系统概述 1.1.设计任务 1.2.设计要求 2.方案设计与论证 2.1.芯 ...

  9. 基于STM32和超声波测距传感器的测距功能设计

    基于STM32和超声波测距传感器的测距功能设计(使用陌生传感器的流程介绍) 引言 项目设计 项目简介 开发工具 硬件设计 软件设计 开发流程 阅读手册 配置并测试传感器相关设置 软件开发 总结 后续 ...

最新文章

  1. 口腔微生物——“你的大能量,超乎我想象”
  2. linux系统自带的监控工具
  3. 【PAT乙级】1019 数字黑洞 (20 分)
  4. Python黑客入门:暴力破解zip,零基础也可以学会!
  5. oracle只匹配中文,Oracle 实现 一个关键字 匹配多个 字段
  6. 嵌入式常见笔试题总结
  7. XML注释与取消注释快捷键
  8. matlab中进行太阳能电池模型,基于Matlab的光伏发电系统仿真研究
  9. excel 常用快捷键及小技巧
  10. Jmeter---脚本录制
  11. 由于找不到iutils.dll无法继续执行代码?
  12. JS——数组中去除空空字符串
  13. react中ref使用方法解析
  14. 刘海屏启动空白页适配全面屏
  15. you-get下载b站选集_Flash选集:酷炫效果和实用的ActionScript-第1章:Flash基本知识
  16. 邻接矩阵,构造有向图、无向图、有向网、无向网,深度优先、广度优先遍历(C++图)
  17. 【一、建站综述及步骤简介】2021最详细wordpress博客建站教程(2021.03.01更新)
  18. VS2003,VS2005,VS2008 低版本打开高版本的解决方案
  19. Input Method of Win32 System
  20. SCAU 数字电路 Digital Circuits and Logic Design 复习

热门文章

  1. Hadoop伪分布式部署及常用操作
  2. python3编译器安卓版_Python编译器app
  3. 电赛风力摆制作过程中遇到的问题
  4. 天津发展php怎么样,为什么那么多人选择留在滨海新区?他们现在怎么样了 ?
  5. ffplay.c源码阅读之暂停、重播、快进、快退实现细节
  6. c++ goto语句
  7. AVPlayer介绍
  8. memcpy函数的使用
  9. 基于Keare的交通标志识别
  10. 浏览器攻击框架BeEF Part 4:绕过同源策略与浏览器代理