单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 250|回复: 0
收起左侧

STM32F103驱动CCD实现黑白线识别源程序

[复制链接]
yuhuoer 发表于 2019-7-13 10:48 | 显示全部楼层 |阅读模式
STM32F103驱动CCD实现黑白线识别,通过上位机显示灰度值及图像,二值化处理后完成黑白线识别。
内含TSL1401 CCD资料,上位机软件,STM32F103源码

QQ图片20190713103816.png QQ图片20190713104144.png
关键词:线性CCD 灰度识别 循迹 图像处理
注意事项:使用线性CCD对曝光时间的控制显得尤为重要。

单片机源程序如下:
  1. #include "ccd.h"
  2. #include "adc.h"       
  3. #include "usart.h"
  4. #include "string.h"
  5. u8 ccd_adc[128]={0};
  6. u8 SciBuf[200];  //存储上传到上位机的信息
  7. int TIME_us=10; //曝光时间
  8. void Ccd_Init(void)
  9. {
  10. GPIO_InitTypeDef  GPIO_InitStructure;
  11.        
  12. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //使能PA端口时钟
  13.        
  14. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                                 //PA.2 端口配置
  15. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  16. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  17. GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOA.2
  18. GPIO_SetBits(GPIOA,GPIO_Pin_2);                                                 //PA.2 输出高

  19. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                             //PA.7 端口配置, 推挽输出
  20. GPIO_Init(GPIOA, &GPIO_InitStructure);                                           //推挽输出 ,IO口速度为50MHz
  21. GPIO_SetBits(GPIOA,GPIO_Pin_7);                                                  //PA.7        输出高
  22.        
  23. }


  24. /******************************************************************************
  25. ***
  26. * FUNCTION NAME: void Dly_us(int a) *
  27. * CREATE DATE : 20170707 *
  28. * CREATED BY : XJU *
  29. * FUNCTION : 延时函数,控制曝光时间 *
  30. * MODIFY DATE : NONE *
  31. * INPUT : int *
  32. * OUTPUT : NONE *
  33. * RETURN : NONE *
  34. *******************************************************************************
  35. **/
  36. void Dly_us(int a)
  37. {
  38.    int ii;   
  39.    for(ii=0;ii<a;ii++);      
  40. }

  41. /******************************************************************************
  42. ***
  43. * FUNCTION NAME: RD_TSL(void) *
  44. * CREATE DATE : 20170707 *
  45. * CREATED BY : XJU *
  46. * FUNCTION : 按照时序依次读取CCD输出的模拟电压值 *
  47. * MODIFY DATE : NONE *
  48. * INPUT : void *
  49. * OUTPUT : NONE *
  50. * RETURN : NONE *
  51. *******************************************************************************
  52. **/
  53.   void RD_TSL(void)
  54.         {
  55.                 u8 i=0,tslp=0;
  56.                 TSL_CLK=1;     //CLK引脚设为高电平         
  57.                 TSL_SI=0;
  58.                 Dly_us(TIME_us);
  59.                                
  60.                 TSL_SI=1;
  61.                 TSL_CLK=0;
  62.                 Dly_us(TIME_us);
  63.                                
  64.                 TSL_CLK=1;
  65.                 TSL_SI=0;
  66.                 Dly_us(TIME_us);
  67.                 for(i=0;i<128;i++)
  68.                 {
  69.                         TSL_CLK=0;
  70.                         Dly_us(TIME_us);  //调节曝光时间
  71.                         ccd_adc[tslp]=(u8)((float)Get_Adc(ADC_Channel_1)/4096*255);  //将读取到的电压值存入数组中
  72.                         ++tslp;
  73.                         TSL_CLK=1;
  74.                         Dly_us(TIME_us);
  75.                 }  
  76.         }

  77. /******************************************************************************
  78. ***
  79. * FUNCTION NAME: void slove_data(void) *
  80. * CREATE DATE : 20170707 *
  81. * CREATED BY : XJU *
  82. * FUNCTION : 将从CCD中读取到的信息按照上位机要求的通信协议存入到数组中以待发送 *
  83. * MODIFY DATE : NONE *
  84. * INPUT : void *
  85. * OUTPUT : NONE *
  86. * RETURN : NONE *
  87. *******************************************************************************
  88. **/
  89.          void slove_data(void)
  90.          {
  91.                 int i;
  92.                 RD_TSL();
  93.     SciBuf[0] = 0;
  94.           SciBuf[1] = 132;
  95.     SciBuf[2] = 0;
  96.     SciBuf[3] = 0;
  97.           SciBuf[4] = 0;
  98.     SciBuf[5] = 0;
  99.                 for(i=0;i<128;i++)
  100.                         SciBuf[6+i] = ccd_adc[i];
  101.          }
  102. /******************************************************************************
  103. ***
  104. * FUNCTION NAME: void sendToPc(void) *
  105. * CREATE DATE : 20170707 *
  106. * CREATED BY : XJU *
  107. * FUNCTION : 将待发送的信息通过串口发送至上位机*
  108. * MODIFY DATE : NONE *
  109. * INPUT : void *
  110. * OUTPUT : NONE *
  111. * RETURN : NONE *
  112. *******************************************************************************
  113. **/                   
  114.          void sendToPc(void)
  115.          {
  116.                  int i;
  117.                  slove_data();
  118.                  printf("*");
  119.                  printf("LD");
  120.                  for(i=2;i<134;i++)
  121.                  {
  122.                                 printf("%c",binToHex_high(SciBuf[i])); //以字符形式发送高4位对应的16进制
  123.                                 printf("%c",binToHex_low(SciBuf[i]));  //以字符形式发送低?位对应的16进制
  124.                  }
  125.                  printf("00");   //通信协议要求
  126.                  printf("#");    //通信协议要求
  127.          }
  128.          
  129. /******************************************************************************
  130. ***
  131. * FUNCTION NAME: binToHex_low(u8 num) *
  132. * CREATE DATE : 20170707 *
  133. * CREATED BY : XJU *
  134. * FUNCTION : 将二进制低8位转换16进制*
  135. * MODIFY DATE : NONE *
  136. * INPUT : u8 *
  137. * OUTPUT : NONE *
  138. * RETURN : char *
  139. *******************************************************************************
  140. **/                   
  141. char binToHex_low(u8 num)
  142. {u8 low_four;
  143.          low_four=num&0x0f;
  144.          if(low_four==0)
  145.                  return('0');
  146.          else if(low_four==1)
  147.                   return('1');
  148.          else if(low_four==2)
  149.                   return('2');
  150.          else if(low_four==3)
  151.                   return('3');
  152.          else if(low_four==4)
  153.                   return('4');
  154.          else if(low_four==5)
  155.                   return('5');
  156.          else if(low_four==6)
  157.                   return('6');
  158.          else if(low_four==7)
  159.                   return('7');
  160.          else if(low_four==8)
  161.                   return('8');
  162.          else if(low_four==9)
  163.                   return('9');
  164.          else if(low_four==10)
  165.                   return('A');
  166.          else if(low_four==11)
  167.                   return('B');
  168.          else if(low_four==12)
  169.                   return('C');
  170.          else if(low_four==13)
  171.                   return('D');
  172.          else if(low_four==14)
  173.                   return('E');
  174.          else if(low_four==15)
  175.                   return('F');
  176. }

  177. /******************************************************************************
  178. ***
  179. * FUNCTION NAME: binToHex_low(u8 num) *
  180. * CREATE DATE : 20170707 *
  181. * CREATED BY : XJU *
  182. * FUNCTION : 将二进制高8位转换16进制*
  183. * MODIFY DATE : NONE *
  184. * INPUT : u8 *
  185. * OUTPUT : NONE *
  186. * RETURN : char *
  187. *******************************************************************************
  188. **/                                                  
  189. char binToHex_high(u8 num)
  190. {
  191.                 u8 high_four;
  192.                 high_four=(num>>4)&0x0f;
  193.                 if(high_four==0)
  194.                         return('0');
  195.                                 else if(high_four==1)
  196.                                         return('1');
  197.                                         else if(high_four==2)
  198.                                                         return('2');
  199.                                                         else if(high_four==3)
  200.                                                                 return('3');
  201.                                                                 else if(high_four==4)
  202.                                                                 return('4');
  203.                                                                         else if(high_four==5)
  204.                                                                         return('5');
  205.                                                                                 else if(high_four==6)
  206.                                                                                         return('6');
  207.                                                                                         else if(high_four==7)
  208.                                                                                         return('7');
  209.                                                                                                 else if(high_four==8)
  210.                                                                                                 return('8');
  211.                                                                                                         else if(high_four==9)
  212.                                                                                                                 return('9');
  213.                                                                                                                 else if(high_four==10)
  214.                                                                                                                         return('A');
  215.                                                                                                                         else if(high_four==11)
  216.                                                                                                                                 return('B');
  217.                                                                                                                                 else if(high_four==12)
  218.                                                                                                                                         return('C');
  219.                                                                                                                                         else if(high_four==13)
  220.                                                                                                                                                 return('D');
  221.                                                                                                                                                 else if(high_four==14)
  222.                                                                                                                                                         return('E');
  223.                                                                                                                                                         else if(high_four==15)
  224.                                                                                                                                                                 return('F');
  225.                 }

  226.                                                                  
  227.          
  228.        
复制代码
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"
  4. #include "adc.h"
  5. #include "ccd.h"
  6. /******************************************************************************
  7. ***
  8. * PROJECT CODE : 线性CCD测试 *
  9. * CREATE DATE : 20170706 *
  10. * CREATED BY : XJU *
  11. * FUNCTION : 实现线性CCD同上位机通信 *
  12. * MODIFY DATE : NONE *
  13. * DOCUMENT : NONE *
  14. * OTHERS : 具体硬件连接说明在该工程根目录"readme.txt"中 *
  15. *******************************************************************************
  16. **/
  17. int main(void)
  18. {         
  19.                 delay_init();                     //延时函数初始化       
  20.                 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
  21.                 uart_init(9600);         //串口初始化为9600
  22.                 Adc_Init();  //ADC初始化
  23.                 Ccd_Init();   //CCD初始化
  24.                 TIME_us=1;    //设置曝光时间
  25.                 while(1)
  26.                 {  
  27.                         sendToPc();   //发送信息至上位机
  28.                 }
  29.         }

复制代码


所有资料51hei提供下载:
线性CCD.7z (9.83 MB, 下载次数: 9)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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