**使用注意事项:**因每次使用颜色识别的时候外界的光源条件都不相同,因此如果达到较好的使用效果,每次使用之前需要用白纸进行白平衡校准,这样工作起来更加方便。
经过资料可知TCS3200的工作原理是输出方波的频率,来判断颜色信号的强弱,资料百度文库链接:
Arduino:https://wenku.baidu.com/view/0b4d2a4376eeaeaad0f33044.html?from=search(以上链接有怎么设置输出比例因子的图表,通过S0,S1两个引脚的电平设置可以进行输出比例因子调整,见以下图表)

不同颜色采集的频率的设置方式:

89C51:https://wenku.baidu.com/view/488d2fb180eb6294dc886c04.html
模块工作时,通过两个可编程的引脚来动态选择所需要的滤波器,该传感器的典型输出频率范围从2Hz-500kHz,用户还可以通过两个可编程引脚来选择100%、20%或2%的输出比例因子。
经过调试发现,此模块一开始启动的时候最好先检测一张白色A4纸张,确定白平衡,然后在进行颜色判断,这样比较准确。

Excel的使用方法:按 Alt + 回车(Enter)组合键,光标后面的文字自动分成了两行,即按一次键,光标后的所有文字就会自动换行,不需一行行的重复按键。

以下代码是tcs3200.c文件中的:
#include “main.h”
#include “delay.h”
#include “gpio.h”
#include “tim.h”

u16 Rgena,Ggena,Bgena;//定义红、绿、蓝,三色因子
u16 Ramount,Gamount,Bamount;//具体的计算值
u16 amount;//采集到的频率
/duty是占空比/
extern uint32_t duty;
/freq是频率/
extern uint32_t freq;
extern uint32_t tmp1, tmp2;
/*****************************************
获取频率的函数
在定时器tim.c文件中已经配置完毕频率采集函数
在这可以直接进行使用
*****************************************/
u16 Get_amount(void)
{
if (tmp1 == 0)
{
duty = 0;//占空比复位
freq = 0;//频率复位
}
else
{
/占空比的计算公式/
duty = tmp2 * 100.0f / tmp1 + 0.5f;
/tmp1前后需要各加1,及tmp+2,以下输出结果为频率/
freq = 720000.0f / (tmp1+2);
}
return freq;
}
void tcs3200_init(u8 s0,u8 s1)
{
/S3 S3 IO 口初始化/
GPIO_ResetBits(GPIOC,GPIO_PIN_8);
GPIO_ResetBits(GPIOC,GPIO_PIN_9);
/S0 S1用来决定TCS3200输出的频率上限/
S0=s0;
S1=s1;

/*定时器1频率输入捕获中断开始*/
HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);
/*如果不需要占空比和频率数据就只开通道2即可。
第一次的数据是不正确的,实际工作中要将第一次的数据丢弃*/

HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_2);
}
/*******************************************
*

  •     白平衡
    

*******************************************/
void whitebalance(void)
{
// EXTIX_Init(); //外部中断初始化
S2=0;S3=0;//红色通道
amount=0; //开始计数
delay_ms(10);
amount = Get_amount(); //求出频率
Rgena = amount; //求出红色因子
amount=0;
//----------------------------------
S2=1;S3=1;//绿色通道
amount=0;
delay_ms(10);
amount = Get_amount(); //求出频率
Ggena = amount; //求出绿色因子
amount=0;
//----------------------------------
S2=0;S3=1;//蓝色通道
amount=0;
delay_ms(10);
amount = Get_amount(); //求出频率
Bgena = amount;求出蓝色因子
amount=0;
S2=1;S3=0;//关闭通道
}

u16 tcs3200_RED(void)
{
S2=0;S3=0;//模式设定为红色
amount=0;
delay_ms(10);
amount = Get_amount(); //求此时的频率数值
Ramount=(u32)amount*255/Rgena; //取R值
if(Ramount>255) Ramount = 255;
return Ramount;
// amount=0;
}

u16 tcs3200_GREEN(void)
{
S2=1;S3=1;//模式设定为绿色
amount=0;
delay_ms(10);
amount = Get_amount(); //求出此时的频率数值
Gamount=(u32)amount*255/Ggena; //取G值
if(Gamount>255) Gamount = 255;
return Gamount;
// amount=0;
}

u16 tcs3200_BLUE(void)
{
S2=0;S3=1;//模式设定为蓝色
amount=0;
delay_ms(10);
amount = Get_amount();//求出此时的频率
Bamount=(u32)amount*255/Bgena;//取B值
if(Bamount>255) Bamount = 255;
return Bamount;
// amount=0;
}

以下代码是tcs3200.h文件中的
#ifndef __TCS3200_H
#define __TCS3200_H
#include “sys.h”

extern u16 amount;

extern u16 Rgena,Ggena,Bgena;
extern u16 Ramount,Gamount,Bamount;

#define S0 PCout(6)
#define S1 PCout(7)
#define S2 PCout(8)
#define S3 PCout(9)
#define OUT PAin(8)

u16 Get_amount(void);
void tcs3200_init(u8 s0,u8 s1);
void whitebalance(void);
u16 tcs3200_RED(void);
u16 tcs3200_GREEN(void);
u16 tcs3200_BLUE(void);
#endif

以下是tim.c文件中的
#include “tim.h”

#include “gpio.h”

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim4;

/* TIM1 init function */
void MX_TIM1_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_SlaveConfigTypeDef sSlaveConfig;
TIM_IC_InitTypeDef sConfigIC;
TIM_MasterConfigTypeDef sMasterConfig;

htim1.Instance = TIM1;
htim1.Init.Prescaler = 720-1;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 65535;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

if (HAL_TIM_IC_Init(&htim1) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;
sSlaveConfig.TriggerPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
sSlaveConfig.TriggerPrescaler = TIM_ICPSC_DIV1;
sSlaveConfig.TriggerFilter = 0;
if (HAL_TIM_SlaveConfigSynchronization(&htim1, &sSlaveConfig) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
if (HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;
sConfigIC.ICSelection = TIM_ICSELECTION_INDIRECTTI;
if (HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_2) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

}
/* TIM4 init function */
void MX_TIM4_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;

htim4.Instance = TIM4;
htim4.Init.Prescaler = 0;
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
htim4.Init.Period = 0;
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

GPIO_InitTypeDef GPIO_InitStruct;
if(tim_baseHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspInit 0 */

/* USER CODE END TIM1_MspInit 0 /
/
TIM1 clock enable */
__HAL_RCC_TIM1_CLK_ENABLE();

/**TIM1 GPIO Configuration
PA8     ------> TIM1_CH1
*/
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/* USER CODE BEGIN TIM1_MspInit 1 */

/* USER CODE END TIM1_MspInit 1 /
}
else if(tim_baseHandle->Instance==TIM4)
{
/
USER CODE BEGIN TIM4_MspInit 0 */

/* USER CODE END TIM4_MspInit 0 /
/
TIM4 clock enable /
__HAL_RCC_TIM4_CLK_ENABLE();
/
USER CODE BEGIN TIM4_MspInit 1 */

/* USER CODE END TIM4_MspInit 1 */
}
}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{

if(tim_baseHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspDeInit 0 */

/* USER CODE END TIM1_MspDeInit 0 /
/
Peripheral clock disable */
__HAL_RCC_TIM1_CLK_DISABLE();

/**TIM1 GPIO Configuration
PA8     ------> TIM1_CH1
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_8);/* TIM1 interrupt Deinit */
HAL_NVIC_DisableIRQ(TIM1_CC_IRQn);

/* USER CODE BEGIN TIM1_MspDeInit 1 */

/* USER CODE END TIM1_MspDeInit 1 /
}
else if(tim_baseHandle->Instance==TIM4)
{
/
USER CODE BEGIN TIM4_MspDeInit 0 */

/* USER CODE END TIM4_MspDeInit 0 /
/
Peripheral clock disable /
__HAL_RCC_TIM4_CLK_DISABLE();
/
USER CODE BEGIN TIM4_MspDeInit 1 */

/* USER CODE END TIM4_MspDeInit 1 */
}
}

/* USER CODE BEGIN 1 */
uint32_t duty = 0;
uint32_t freq = 0;
uint32_t tmp1 = 0, tmp2 = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef htim)//hal_tim.h回调函数
{
// volatile static uint32_t tmp1 = 0, tmp2 = 0;
/
此例程只需要定时器输入捕获频率通道/
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
tmp1 = HAL_TIM_ReadCapturedValue(&htim1, TIM_CHANNEL_1);//周期
}
/占空比可以不进行计算,计算也问题不大/
else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
tmp2 = HAL_TIM_ReadCapturedValue(&htim1, TIM_CHANNEL_2);//占空比
}
}
//
/ USER CODE END 1 */
delay.c 中的配置:
#include “stm32f1xx_hal.h”
#include “tim.h”
#include “usart.h”
#include “sys.h”
#include “delay.h”
#include “stdio.h”
#include “stm32_hal_legacy.h”

u8 t=0,timer_second=0,timer_minute=0,timer_hour=0,timer_day=0,delayus_t=0;

//void timeclock_init(){
// HAL_TIM_Base_Start_IT(&htim2);
//}

void delay_init(){
__HAL_TIM_ENABLE(&htim4);
}

void delay_us(u32 nus){
__HAL_TIM_SetCounter(&htim4, 0);//htim17
while(__HAL_TIM_GetCounter(&htim4) < (36 * nus));//TIM4挂载在APB1的peripheral时钟线,时钟为36Mhz
__HAL_TIM_SetCounter(&htim4, 0);//htim17
while(__HAL_TIM_GetCounter(&htim4) < (36 * nus));//TIM4挂载在APB1的peripheral时钟线,时钟为36Mhz
return;
/* Disable the Peripheral */
}
Cube 的配置如下图所示:

TCS3200的使用相关推荐

  1. TCS3200颜色检测传感器

    1,LED 测试仪是一个测量系统,能够实现快速和自动测试 LED 的颜色和亮 度.每个 LED 分析仪能同时测量多达 20 个通道的不同颜色和强度的 LED 光源. 从光纤 采集光源,进行测量和分析. ...

  2. Arduino 入门学习8 Arduino MEGA + TCS3200进行颜色识别

    Arduino 入门学习8 Arduino MEGA + TCS3200进行颜色识别 一.颜色识别原理 二.一般颜色识别实现方式 三.TCS3200 简介 四.TCS3200 工作原理 五.TCS32 ...

  3. 【TCS3200 颜色传感器与 Arduino 实现颜色识别】

    TCS3200 颜色传感器与 Arduino 实现颜色识别 前言 TCS3200 颜色传感器引脚 颜色传感器模块如何工作? TCS3200 颜色传感器模块组成 关于颜色传感器 TCS3200 的常见问 ...

  4. 【毕设教学】颜色传感器TCS3200使用

    文章目录 1 简介 2 TCS34725特征 2.1 红色.绿色.蓝色 (RGB) 2.2 可屏蔽中断 2.3 电源管理 2.4 2C 快速模式兼容接口 2.5 寄存器组和引脚兼容 3 TCS3472 ...

  5. 基于STM32F103的TCS3200颜色传感器的使用

    基于STM32F103的TCS3200颜色传感器的使用 团队布置的任务内容是2019年中国机器人大赛的题目,小车运行过程中需要对不同物料进行颜色上的识别.因此我最近就学了TCS3200颜色传感器的基本 ...

  6. 51单片机驱动TCS3200颜色识别传感器

    51单片机驱动TCS3200颜色识别传感器 TCS3200 简介 输出频率与滤光器选择说明 实验说明 接线 驱动 驱动说明 主要代码 主函数 实验现象 验证: 实验注意事项: TCS3200 简介 T ...

  7. Ardunio开发实例-TCS3200颜色传感器

    颜色传感器 TCS3200颜色传感器可以根据其波长检测多种颜色. 该传感器对颜色识别项目特别有用,例如颜色匹配,颜色分类,试纸条读取等等. TCS3200颜色传感器(如下图所示)使用TAOS TCS3 ...

  8. TCS3200颜色传感器测试实验:

    收藏自用,转自:http://www.eefocus.com/zhang700309/blog/13-08/296390_6c438.html TCS3200颜色传感器是一款全彩的颜色检测器,包括了一 ...

  9. TCS3200颜色传感器测试实验

    TCS3200颜色传感器测试实验 2013-08-02 17:18:24 分享: 标签:  Arduino  TCS3200  传感器 TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAO ...

最新文章

  1. 《OpenStack实战》——第1章 介绍OpenStack 1.1OpenStack是什么
  2. Activity栈管理(一):Activity任务栈模型
  3. 欠拟合、过拟合及其解决方法
  4. Javaamp;amp;(面试题)初始化顺序总结
  5. 数据库服务器(SQL SERVER)的安全设置
  6. Laravel服务提供器
  7. linux防火墙桌面关闭端口,Linux关闭防火墙,开放端口
  8. 处理了与日期相关的一些函数
  9. 让网站支持RSS订阅
  10. 3dmax如何建模(一)
  11. FPGA学习网站推荐
  12. uniapp浏览pdf文件
  13. 严蔚敏《数据结构》 迪杰斯特拉算法
  14. 千亿商用车车联网市场,智能车载终端企业如何抢食?
  15. centos恢复图形界面_centos7恢复图形界面_centos7没有图形界面
  16. P2-前端基础-网页中的实体(转义字符)
  17. 聊一聊 AS 的一些好用的功能
  18. 正向代理和反向代理区别
  19. 前端开发:关于鉴权的使用总结
  20. 2022年NOC软件创意编程(学而思)决赛小学高年级组scratch

热门文章

  1. jython 导入java包_在jython中导入java类
  2. 365天深度学习训练营-第J2周:ResNet50V2算法实战与解析
  3. 仿QQ分组列表(UITableView)
  4. ssm招投标管理系统毕业设计(附源码、运行环境)
  5. 在快应用中集成华为AGC云存储服务
  6. J2EE金融项目开发实战视频教程
  7. 智能计算机 英语作文,关于电脑的英语作文
  8. 解决模板套用出现乱码问题的方法
  9. 软碟通 UltraISO V9.6.0.3000 官方多语言安装版(附注册码)
  10. OpenLayers之 OverLay问题汇总