找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1408|回复: 5
收起左侧

STM32+TCS3200在使用过程中,用RGB值显示出来发现大于255

[复制链接]
ID:942417 发表于 2021-12-19 16:40 | 显示全部楼层 |阅读模式
大佬救命!!!,这里使用的是STM32f103
代码是拿来主义:https://blog.csdn.net/weixin_45930808/article/details/119789276
最高的时候看到803的数字
回复

使用道具 举报

ID:942417 发表于 2021-12-19 17:34 | 显示全部楼层
以下为我的代码:
这里是定时器的
  1. #include "sys.h"
  2. #include "timer.h"
  3. #include "touch.h"
  4. #include "delay.h"
  5. #include "timer.h"
  6. #include "led.h"
  7. #include "usart.h"
  8. #include "tcs3200.h"
  9. #include "lcd.h"

  10. extern float RGB_Scale[3];                    
  11. int cnt[3];            
  12. extern int flag;
  13. extern int count;
  14. float color1;

  15. void TIM3_Int_Init(u16 arr,u16 psc)
  16. {
  17.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  18.         NVIC_InitTypeDef NVIC_InitStructure;

  19.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  20.         TIM_TimeBaseStructure.TIM_Period = arr;
  21.         TIM_TimeBaseStructure.TIM_Prescaler =psc;  
  22.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  23.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  24.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  25.         TIM_ITConfig(  
  26.                 TIM3, //TIM2
  27.                 TIM_IT_Update  | TIM_IT_Trigger,
  28.                 ENABLE  
  29.                 );
  30.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  31.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
  32.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
  33.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  34.         NVIC_Init(&NVIC_InitStructure);  

  35.         TIM_Cmd(TIM3, ENABLE);  //ê1?üTIMxíaéè
  36.                                                          
  37. }


  38. void TIM2_Cap_Init(void)                                       
  39. {   
  40.     GPIO_InitTypeDef GPIO_InitStructure;
  41.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  42.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   
  43.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  
  44.    
  45.     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;            
  46.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;         
  47.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  48.     GPIO_ResetBits(GPIOA,GPIO_Pin_0);                 
  49.    
  50.        
  51.     TIM_TimeBaseStructure.TIM_Period = 0xFFFF;   //设置自动预装载;N-1      
  52.     TIM_TimeBaseStructure.TIM_Prescaler =0; //这里有问题,为5000时不显示色彩         
  53.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  54.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  55.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);        
  56.     TIM_ITRxExternalClockConfig(TIM2,TIM_TS_ETRF);         
  57.     TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);
  58.     TIM_SetCounter(TIM2, 0);        
  59.    
  60.     TIM_Cmd(TIM2,ENABLE );                           
  61. }

  62. void TIM3_IRQHandler(void)   
  63. {
  64.         if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  65.                 {
  66.               TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  
  67.               count=TIM_GetCounter(TIM2);         
  68.          switch(flag){
  69.          case 0:
  70.             TSC_WB(0, 0);   
  71.             break;
  72.          case 1:
  73.             cnt[0] = count;   
  74.             TSC_WB(1, 1);
  75.             break;
  76.          case 2:
  77.             cnt[1] = count;   
  78.             TSC_WB(0, 1);  
  79.             break;
  80.          case 3:
  81.             cnt[2] = count;     
  82.             TSC_WB(1, 0);   
  83.             break;
  84.          default:
  85.             count = 0;     
  86.             break;
  87.       }
  88.       TIM_SetCounter(TIM2,0);
  89.                 }
  90. }

  91. void Change_init()
  92. {
  93.         float Max=0,Min=0;
  94.         float Rhsv=0,Ghsv=0,Bhsv=0;
  95.         float H=0,S=0,V=0;
  96.         u8 R=0x00,G=0x00,B=0x00;
  97.         u16 RGB=0x0000;
  98.        
  99.           RGB_Scale[0] = 255.0/ cnt[0];   
  100.     RGB_Scale[1] = 255.0/ cnt[1] ;   
  101.     RGB_Scale[2] = 255.0/ cnt[2] ;  
  102.                 R=RGB_Scale[0];
  103.                 G=RGB_Scale[1];
  104.                 B=RGB_Scale[2];
  105.         //================================================================================
  106.                 Rhsv = (float) R/25/10;
  107.                 Ghsv = (float) G/25/10;         //RGB转换成0,1.
  108.                 Bhsv = (float) B/25/10;

  109. //=================================================================================
  110.                                                                                                                                          //RGB转HSV算法
  111.                 Max = (Rhsv>Ghsv)?Rhsv:Ghsv;                                                                  //RGB转HSV算法
  112.                 Max = (Max>Bhsv)?Max:Bhsv;                //取RGB最大值                                   //RGB转HSV算法
  113.                 Min = (Rhsv<Ghsv)?Rhsv:Ghsv;                                                                    //RGB转HSV算法
  114.                 Min = (Min<Bhsv)?Min:Bhsv;                //去RGB最小值                                         //RGB转HSV算法
  115.                                                                                                                                                   //RGB转HSV算法                               
  116.                 if(Rhsv==Max) H = (Ghsv-Bhsv)/(Max-Min);                                                   //RGB转HSV算法
  117.                 if(Ghsv==Max) H = 2+(Bhsv-Rhsv)/(Max-Min);                                                          //RGB转HSV算法
  118.                 if(Bhsv==Max) H = 4+(Rhsv-Ghsv)/(Max-Min);                                                         //RGB转HSV算法
  119.                 H =(int) (H*60);                                                                                          //RGB转HSV算法
  120.                 if(H<0) H = H+360;                                                                                                           //RGB转HSV算法
  121.                                                                                                                                                                //RGB转HSV算法
  122.                 V = (Rhsv>Ghsv)?Rhsv:Ghsv;                                                                                                 //RGB转HSV算法
  123.                 V = (V>Bhsv)?V:Bhsv;                //取V的数值                                                                          //RGB转HSV算法
  124.                                                                                                                                                                    //RGB转HSV算法
  125.                 S = (Max-Min)/Max;                        //取S的数值                                                                                //RGB转HSV算法
  126.                                                                                                                                                                           //RGB转HSV算法
  127.                 V = (int) (V*100);                                                                                                                          //RGB转HSV算法
  128.                 S = (int) (S*100);                                                                                                                           //RGB转HSV算法
  129. //======================================================================================================
  130.                 LCD_ShowNum(220,50,cnt[0]*R,5,12);  //显示一个数字
  131.                 LCD_ShowNum(220,70,cnt[1]*G,5,12);  //显示一个数字
  132.                 LCD_ShowNum(220,90,cnt[2]*B,5,12);  //显示一个数字
  133.                 LCD_ShowNum(220,110,H,5,12);  //显示一个数字
  134.                 LCD_ShowNum(220,130,V,5,12);  //显示一个数字
  135.                 LCD_ShowNum(220,150,S,5,12);  //显示一个数字
  136. //                R = 0xff;
  137. //                G = 0xff;
  138. //                B = 0xff;
  139. //=====================================================  
  140. //=====================================================
  141.                 RGB = 0x0000;
  142.                 RGB |=(unsigned long) R*1000/8225<<11;                          
  143.                 RGB |=(unsigned long) G*1000/4047<<5;          //转换成屏幕的4W色显示
  144.                 RGB |=(unsigned long) B*1000/8225;               
  145. //=====================================================
  146.                 LCD_Fill(10,170,80,260,RGB);   //原来的显示色彩
  147.                 //LCD_Fill(10,170,120,50,RGB);   //显示色彩
  148.         color1=RGB;
  149.         gui_fill_circle(200,400,50,RGB);
  150.                 delay_ms(50);                                   //刷新次数
  151. }
复制代码
回复

使用道具 举报

ID:942417 发表于 2021-12-19 17:35 | 显示全部楼层
这里是TCS的代码:
  1. #include "sys.h"       
  2. #include "tcs3200.h"
  3. #include "exti.h"
  4. #include "delay.h"

  5. #include "tcs3200.h"
  6. #include "delay.h"
  7. #include "usart.h"
  8. #include "lcd.h"

  9. float RGB_Scale[3];         
  10. int count=0;                          
  11. int flag=0;

  12. //S0-----PA4,S1-----PA5,S2-----PA6,S3-----PA7,LED-----PC5,OUT-----PA0

  13. void TCS_GPIO_Init(void)
  14. {

  15. GPIO_InitTypeDef  GPIO_InitStructure;

  16. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);         
  17.        
  18. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;                                 
  19. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                
  20. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
  21. GPIO_Init(GPIOA, &GPIO_InitStructure);                                       
  22. GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_4|GPIO_Pin_7);                                                 //PA.4567 ê?3???
  23.                                
  24.        
  25. // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                   
  26. // GPIO_Init(GPIOC, &GPIO_InitStructure);                                         
  27. // GPIO_SetBits(GPIOC,GPIO_Pin_5);                                        
  28. }

  29. void filter(int s2,int s3)
  30. {
  31.     if(s2==0&&s3==0){
  32.                         S2=0;S3=0;
  33.                 }
  34.     if(s2==0&&s3==1){
  35.                   S2=0;S3=1;
  36.                 }
  37.     if(s2==1&&s3==0){
  38.                         S2=1;S3=0;
  39.                 }
  40.     if(s2==1&&s3==1){
  41.                   S2=1;S3=1;
  42.                 }                       
  43. }

  44. void TSC_WB(int s2, int s3)
  45. {
  46.   count = 0;   
  47.   flag ++;   
  48.   filter(s2, s3);
  49. }
复制代码
回复

使用道具 举报

ID:942417 发表于 2021-12-19 17:38 | 显示全部楼层
这里是主函数的代码:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "usart.h"
  6. #include "touch.h"
  7. #include "lcd.h"
  8. #include "tcs3200.h"
  9. #include "timer.h"

  10. extern float RGB_Scale[3];       //外部声明            
  11. extern int cnt[3];            
  12. extern int flag;
  13. extern int count;
  14. extern float color1;
  15. extern u8 color;
  16. int main(void)
  17. {               

  18.          
  19.         delay_init();                      
  20.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  21.         uart_init(115200);                
  22.         LED_init();                                 
  23.         LCD_Init();                         
  24.         TCS_GPIO_Init();       
  25.         TIM3_Int_Init(9999,719);//100ms
  26.         TIM2_Cap_Init();
  27.         chromatogram();
  28.         Change_init();
  29.         POINT_COLOR=RED;       
  30.          
  31.          
  32.          
  33.          
  34.         S0=0;//这里直接2%设置,LED永远亮着即可
  35.   S1=1;   
  36.   led0=1;
  37.         delay_ms(1000);
  38.                 delay_ms(1000);
  39.                         delay_ms(1000);
  40.                                 delay_ms(1000);
  41.          
  42.     RGB_Scale[0] = 255.0/ cnt[0];   
  43.     RGB_Scale[1] = 255.0/ cnt[1] ;   
  44.     RGB_Scale[2] = 255.0/ cnt[2] ;  

  45.         LCD_ShowString(10,10,210,16,16,"Init");
  46.         LCD_ShowString(20,70,210,16,16,"R:");
  47.         LCD_ShowString(20,90,210,16,16,"G:");
  48.         LCD_ShowString(20,110,210,16,16,"B:");
  49.         LCD_ShowNum(50, 10,(int)(cnt[0]*RGB_Scale[0]),3,16);
  50.         LCD_ShowNum(50, 30,(int)(cnt[1]*RGB_Scale[1]),3,16);
  51.         LCD_ShowNum(50, 50,(int)(cnt[2]*RGB_Scale[2]),3,16);

  52.          //白平衡结束
  53.         POINT_COLOR=BLUE;        //画笔颜色

  54.         while(1)
  55.         {
  56.                 flag=0;  
  57.                 count=0;
  58.     u16 color2=0xaabb;
  59.                 u8 R1=0x00,G1=0x00,B1=0x00;
  60. //void creat_random_color()//随机颜色画圆
  61. //{
  62. //        u16 red,green,blue;
  63. //        red=rand()%32;
  64. //        green=rand()%64;
  65. //        blue=rand()%32;
  66.           R1=cnt[0]*RGB_Scale[0];G1=cnt[1]*RGB_Scale[1];B1=cnt[2]*RGB_Scale[2];
  67.                 color2=R1<<11|G1<<5|B1;
  68. //}
  69.                
  70.                 LCD_ShowNum(50, 70,(int)(cnt[0]*RGB_Scale[0]),3,16);
  71.                 LCD_ShowNum(50, 90,(int)(cnt[1]*RGB_Scale[1]),3,16);
  72.                 LCD_ShowNum(50, 110,(int)(cnt[2]*RGB_Scale[2]),3,16);
  73.     Change_init();
  74.                 gui_fill_circle(200,600,50,color2);
  75.                 gui_fill_circle(200,250,50,color);
  76.                 delay_ms(1000);
  77.           delay_ms(1000);
  78.                
  79. }
  80. }
复制代码
回复

使用道具 举报

ID:942417 发表于 2021-12-19 18:13 | 显示全部楼层
if(BAMOUNT>255) BAMOUNT = 255;
回复

使用道具 举报

ID:130230 发表于 2022-6-9 15:48 | 显示全部楼层
我也碰到同样的问题了,你解决了没。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表