标题:
STM32+TCS3200在使用过程中,用RGB值显示出来发现大于255
[打印本页]
作者:
MMINGye
时间:
2021-12-19 16:40
标题:
STM32+TCS3200在使用过程中,用RGB值显示出来发现大于255
大佬救命!!!,这里使用的是STM32f103
代码是拿来主义:
https://blog.csdn.net/weixin_45930808/article/details/119789276
最高的时候看到803的数字
作者:
MMINGye
时间:
2021-12-19 17:34
以下为我的代码:
这里是定时器的
#include "sys.h"
#include "timer.h"
#include "touch.h"
#include "delay.h"
#include "timer.h"
#include "led.h"
#include "usart.h"
#include "tcs3200.h"
#include "lcd.h"
extern float RGB_Scale[3];
int cnt[3];
extern int flag;
extern int count;
float color1;
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(
TIM3, //TIM2
TIM_IT_Update | TIM_IT_Trigger,
ENABLE
);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3, ENABLE); //ê1?üTIMxíaéè
}
void TIM2_Cap_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //设置自动预装载;N-1
TIM_TimeBaseStructure.TIM_Prescaler =0; //这里有问题,为5000时不显示色彩
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ITRxExternalClockConfig(TIM2,TIM_TS_ETRF);
TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);
TIM_SetCounter(TIM2, 0);
TIM_Cmd(TIM2,ENABLE );
}
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
count=TIM_GetCounter(TIM2);
switch(flag){
case 0:
TSC_WB(0, 0);
break;
case 1:
cnt[0] = count;
TSC_WB(1, 1);
break;
case 2:
cnt[1] = count;
TSC_WB(0, 1);
break;
case 3:
cnt[2] = count;
TSC_WB(1, 0);
break;
default:
count = 0;
break;
}
TIM_SetCounter(TIM2,0);
}
}
void Change_init()
{
float Max=0,Min=0;
float Rhsv=0,Ghsv=0,Bhsv=0;
float H=0,S=0,V=0;
u8 R=0x00,G=0x00,B=0x00;
u16 RGB=0x0000;
RGB_Scale[0] = 255.0/ cnt[0];
RGB_Scale[1] = 255.0/ cnt[1] ;
RGB_Scale[2] = 255.0/ cnt[2] ;
R=RGB_Scale[0];
G=RGB_Scale[1];
B=RGB_Scale[2];
//================================================================================
Rhsv = (float) R/25/10;
Ghsv = (float) G/25/10; //RGB转换成0,1.
Bhsv = (float) B/25/10;
//=================================================================================
//RGB转HSV算法
Max = (Rhsv>Ghsv)?Rhsv:Ghsv; //RGB转HSV算法
Max = (Max>Bhsv)?Max:Bhsv; //取RGB最大值 //RGB转HSV算法
Min = (Rhsv<Ghsv)?Rhsv:Ghsv; //RGB转HSV算法
Min = (Min<Bhsv)?Min:Bhsv; //去RGB最小值 //RGB转HSV算法
//RGB转HSV算法
if(Rhsv==Max) H = (Ghsv-Bhsv)/(Max-Min); //RGB转HSV算法
if(Ghsv==Max) H = 2+(Bhsv-Rhsv)/(Max-Min); //RGB转HSV算法
if(Bhsv==Max) H = 4+(Rhsv-Ghsv)/(Max-Min); //RGB转HSV算法
H =(int) (H*60); //RGB转HSV算法
if(H<0) H = H+360; //RGB转HSV算法
//RGB转HSV算法
V = (Rhsv>Ghsv)?Rhsv:Ghsv; //RGB转HSV算法
V = (V>Bhsv)?V:Bhsv; //取V的数值 //RGB转HSV算法
//RGB转HSV算法
S = (Max-Min)/Max; //取S的数值 //RGB转HSV算法
//RGB转HSV算法
V = (int) (V*100); //RGB转HSV算法
S = (int) (S*100); //RGB转HSV算法
//======================================================================================================
LCD_ShowNum(220,50,cnt[0]*R,5,12); //显示一个数字
LCD_ShowNum(220,70,cnt[1]*G,5,12); //显示一个数字
LCD_ShowNum(220,90,cnt[2]*B,5,12); //显示一个数字
LCD_ShowNum(220,110,H,5,12); //显示一个数字
LCD_ShowNum(220,130,V,5,12); //显示一个数字
LCD_ShowNum(220,150,S,5,12); //显示一个数字
// R = 0xff;
// G = 0xff;
// B = 0xff;
//=====================================================
//=====================================================
RGB = 0x0000;
RGB |=(unsigned long) R*1000/8225<<11;
RGB |=(unsigned long) G*1000/4047<<5; //转换成屏幕的4W色显示
RGB |=(unsigned long) B*1000/8225;
//=====================================================
LCD_Fill(10,170,80,260,RGB); //原来的显示色彩
//LCD_Fill(10,170,120,50,RGB); //显示色彩
color1=RGB;
gui_fill_circle(200,400,50,RGB);
delay_ms(50); //刷新次数
}
复制代码
作者:
MMINGye
时间:
2021-12-19 17:35
这里是TCS的代码:
#include "sys.h"
#include "tcs3200.h"
#include "exti.h"
#include "delay.h"
#include "tcs3200.h"
#include "delay.h"
#include "usart.h"
#include "lcd.h"
float RGB_Scale[3];
int count=0;
int flag=0;
//S0-----PA4,S1-----PA5,S2-----PA6,S3-----PA7,LED-----PC5,OUT-----PA0
void TCS_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_4|GPIO_Pin_7); //PA.4567 ê?3???
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
// GPIO_Init(GPIOC, &GPIO_InitStructure);
// GPIO_SetBits(GPIOC,GPIO_Pin_5);
}
void filter(int s2,int s3)
{
if(s2==0&&s3==0){
S2=0;S3=0;
}
if(s2==0&&s3==1){
S2=0;S3=1;
}
if(s2==1&&s3==0){
S2=1;S3=0;
}
if(s2==1&&s3==1){
S2=1;S3=1;
}
}
void TSC_WB(int s2, int s3)
{
count = 0;
flag ++;
filter(s2, s3);
}
复制代码
作者:
MMINGye
时间:
2021-12-19 17:38
这里是主函数的代码:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "touch.h"
#include "lcd.h"
#include "tcs3200.h"
#include "timer.h"
extern float RGB_Scale[3]; //外部声明
extern int cnt[3];
extern int flag;
extern int count;
extern float color1;
extern u8 color;
int main(void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LED_init();
LCD_Init();
TCS_GPIO_Init();
TIM3_Int_Init(9999,719);//100ms
TIM2_Cap_Init();
chromatogram();
Change_init();
POINT_COLOR=RED;
S0=0;//这里直接2%设置,LED永远亮着即可
S1=1;
led0=1;
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
RGB_Scale[0] = 255.0/ cnt[0];
RGB_Scale[1] = 255.0/ cnt[1] ;
RGB_Scale[2] = 255.0/ cnt[2] ;
LCD_ShowString(10,10,210,16,16,"Init");
LCD_ShowString(20,70,210,16,16,"R:");
LCD_ShowString(20,90,210,16,16,"G:");
LCD_ShowString(20,110,210,16,16,"B:");
LCD_ShowNum(50, 10,(int)(cnt[0]*RGB_Scale[0]),3,16);
LCD_ShowNum(50, 30,(int)(cnt[1]*RGB_Scale[1]),3,16);
LCD_ShowNum(50, 50,(int)(cnt[2]*RGB_Scale[2]),3,16);
//白平衡结束
POINT_COLOR=BLUE; //画笔颜色
while(1)
{
flag=0;
count=0;
u16 color2=0xaabb;
u8 R1=0x00,G1=0x00,B1=0x00;
//void creat_random_color()//随机颜色画圆
//{
// u16 red,green,blue;
// red=rand()%32;
// green=rand()%64;
// blue=rand()%32;
R1=cnt[0]*RGB_Scale[0];G1=cnt[1]*RGB_Scale[1];B1=cnt[2]*RGB_Scale[2];
color2=R1<<11|G1<<5|B1;
//}
LCD_ShowNum(50, 70,(int)(cnt[0]*RGB_Scale[0]),3,16);
LCD_ShowNum(50, 90,(int)(cnt[1]*RGB_Scale[1]),3,16);
LCD_ShowNum(50, 110,(int)(cnt[2]*RGB_Scale[2]),3,16);
Change_init();
gui_fill_circle(200,600,50,color2);
gui_fill_circle(200,250,50,color);
delay_ms(1000);
delay_ms(1000);
}
}
复制代码
作者:
MMINGye
时间:
2021-12-19 18:13
if(BAMOUNT>255) BAMOUNT = 255;
作者:
jizhongbiao
时间:
2022-6-9 15:48
我也碰到同样的问题了,你解决了没。。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1