OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7927|回复: 9

我用1401线性ccd做一个识别线路,可是一直曝光不足,怎么破!!!

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2014-6-7
在线时间
0 小时
发表于 2014-6-7 22:05:50 | 显示全部楼层 |阅读模式
5金钱
弄了两周了,一直没有解决。我刚开始学,用的stm32mini开发板,识别是我用例程里的adc例程改的,应该是可以返回数据,可是一直曝光不足,拿手机的手电筒照着才有反应,我实在不知道怎么办了,恳请给位大神帮忙!!

注释的都是我很不明白的地方,文件我也已经上传到了附件,希望各位大神帮助!!


【ADC】


 #include "adc.h"
 #include "delay.h"




u8 AD[128] ={0};

void  Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure; 
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );   
  RCC_HCLKConfig(RCC_SYSCLK_Div4); //时钟设置 这块是我自己改的,不知道行不行
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_ADCCLKConfig(RCC_PCLK2_Div4);   
                
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 
GPIO_Init(GPIOA, &GPIO_InitStructure);

ADC_DeInit(ADC1);  

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; 
ADC_InitStructure.ADC_ScanConvMode = DISABLE; 
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; 
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; 
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 
ADC_InitStructure.ADC_NbrOfChannel = 1; 
ADC_Init(ADC1, &ADC_InitStructure); 
 

ADC_Cmd(ADC1, ENABLE); 
ADC_ResetCalibration(ADC1); 
while(ADC_GetResetCalibrationStatus(ADC1)); 

ADC_StartCalibration(ADC1); 
 
while(ADC_GetCalibrationStatus(ADC1)); 
 
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

}  



u16 Get_Adc(u8 ch)   //获取adc的值
{
 
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_7Cycles5 ); 
  
ADC_SoftwareStartConvCmd(ADC1, ENABLE); 
 
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
return ADC_GetConversionValue(ADC1);


}






void SI(int a)
{
// GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);
if(a==1)
GPIO_WriteBit(GPIOB,GPIO_Pin_13,1);
else
GPIO_WriteBit(GPIOB,GPIO_Pin_13,0);
}


void CLK(int a)
{
// GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_SET);
if(a==1)
GPIO_WriteBit(GPIOB,GPIO_Pin_14,1);
else
GPIO_WriteBit(GPIOB,GPIO_Pin_14,0);
}

void ADC_GetLine(void)//采点
{
  int i;
  //采第一个点
  SI(0);
CLK(0);
  delay_us(1);
SI(1);
delay_us(1);
  CLK(1);
delay_us(1);
SI(0);
  delay_us(1);
AD[0]=Get_Adc(0);
CLK(0);
  //采第2~128个点
  for(i=1; i<128; i++)
  {
    delay_us(1);
CLK(1);
delay_us(1);
AD = Get_Adc(0);
    CLK(0);
  }
 //第129个结束CLK
delay_us(1);
  CLK(1);
delay_us(1);
CLK(0);
  delay_ms(10);
}




【MAIN】



#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "usart.h"
#include "wdg.h"
#include "timer.h"
#include "pwm.h"
#include "lcd.h"
#include "adc.h"

 
 int main(void)
 {
int k=0;
float temp;
SystemInit();
delay_init(72);    
NVIC_Configuration();//这句话不明白
  uart_init(9600);//这句话也不明白
  LED_Init();
  KEY_Init();
LCD_Init();
Adc_Init();
POINT_COLOR=RED;
LCD_ShowString(60,50,"Mini STM32");
LCD_ShowString(60,70,"ROBOT TEST");
LCD_ShowString(60,90,"2014/6/2");


POINT_COLOR=BLUE;
LCD_ShowString(60,130,"ADC_CH0_VAL:");            
while(1)
{
ADC_GetLine();
while(k<128)
{   
 LCD_ShowNum(156,130,AD[k],4,16);//好像是关于显示屏输出的
 LCD_ShowNum(40,150,AD[3],4,16);
 LCD_ShowNum(80,150,AD[6],4,16);
 LCD_ShowNum(120,150,AD[9],4,16);
  LCD_ShowNum(160,150,AD[12],4,16);
//   LCD_ShowNum(200,150,AD[15],4,16);
//   LCD_ShowNum(40,170,AD[18],4,16);
//   LCD_ShowNum(80,170,AD[21],4,16);
//  LCD_ShowNum(120,170,AD[24],4,16);
//  LCD_ShowNum(160,170,AD[27],4,16);
//  LCD_ShowNum(200,170,AD[30],4,16);
//  LCD_ShowNum(40,190,AD[33],4,16);
//  LCD_ShowNum(80,190,AD[36],4,16);
//  LCD_ShowNum(120,190,AD[39],4,16);
//  LCD_ShowNum(160,190,AD[42],4,16);
//  LCD_ShowNum(200,190,AD[45],4,16);
//  LCD_ShowNum(40,210,AD[48],4,16);
//  LCD_ShowNum(80,210,AD[51],4,16);
//  LCD_ShowNum(120,210,AD[54],4,16);
//  LCD_ShowNum(160,210,AD[57],4,16);
//  LCD_ShowNum(200,210,AD[60],4,16);
//  LCD_ShowNum(40,230,AD[63],4,16);
// LCD_ShowNum(80,230,AD[69],4,16);
// LCD_ShowNum(120,230,AD[72],4,16);
// LCD_ShowNum(160,230,AD[75],4,16);
// LCD_ShowNum(200,230,AD[78],4,16);
// LCD_ShowNum(40,250,AD[81],4,16);
// LCD_ShowNum(80,250,AD[84],4,16);
// LCD_ShowNum(120,250,AD[87],4,16);
// LCD_ShowNum(160,250,AD[90],4,16);
// LCD_ShowNum(200,250,AD[93],4,16);
// LCD_ShowNum(40,270,AD[96],4,16);
// LCD_ShowNum(80,270,AD[99],4,16);
// LCD_ShowNum(120,270,AD[102],4,16);
// LCD_ShowNum(160,270,AD[105],4,16);
// LCD_ShowNum(200,270,AD[108],4,16);



      LED0=!LED0;
if(AD[k]<128)//在显示屏上输出
{
AD[k]=0;
}
else

AD[k]=1;
}  
 k++;

}

 k=0;
  }
 }

求助!.zip

7.58 MB, 下载次数: 1391

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-7 23:32:09 | 显示全部楼层
回复

使用道具 举报

53

主题

608

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2013-3-29
在线时间
18 小时
发表于 2014-6-8 00:36:39 | 显示全部楼层
之前用过这个CCD,不存在这个的问题的
学电子,学音乐!!
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-4-16
在线时间
0 小时
发表于 2014-8-10 19:39:48 | 显示全部楼层
回复【3楼】XINSI:
---------------------------------
大神,给我线性CCD  stm32的程序,
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2012-10-7
在线时间
0 小时
发表于 2014-8-11 14:29:06 | 显示全部楼层
我建议用两个方案试一下:第一把AD的采集时间延长,第二就是延长曝光时间或者采集通过运放后的AD值
因为今年我是做飞思卡尔智能车光电组的我就遇到了AD值太低没有多大的区别
我当时就是通过手册改的AD的采集时间
成功的花,人们只惊羡他现实的惊艳,然而当初她的芽儿浸透了奋斗的泪泉,洒遍了牺牲的血雨!!!!!
回复

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2015-4-25
在线时间
0 小时
发表于 2015-5-20 15:57:12 | 显示全部楼层
回复【3楼】XINSI:
---------------------------------
用STM32做CCD应该用什么
回复

使用道具 举报

53

主题

608

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2013-3-29
在线时间
18 小时
发表于 2015-5-21 22:52:26 | 显示全部楼层
回复【6楼】不死的富翁:
---------------------------------
睡边。。。。
学电子,学音乐!!
回复

使用道具 举报

2

主题

3

帖子

0

精华

新手入门

积分
31
金钱
31
注册时间
2015-5-26
在线时间
0 小时
发表于 2015-5-27 16:04:50 | 显示全部楼层
看楼主描述,问题应该是 CCD曝光时间不足引起的。
去了解一下ccd的工作原理就明白了。简单地说每个相点的输出值,是在光照下积攒电荷并把这个电荷量量化得到的,如果曝光时间设置的太短,电荷就来不及攒够。
你看看现在用的这个 CCD 怎么配置曝光时间,调长一点就行了。注意不要设得太长,防止过度曝光。
回复

使用道具 举报

4

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2016-10-27
在线时间
47 小时
发表于 2017-3-6 18:26:15 | 显示全部楼层
你好。我也在研究TCD1209线阵CCD,你的驱动时序调试好了吗
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-5-2
在线时间
4 小时
发表于 2017-3-10 00:31:35 | 显示全部楼层
//采第一个点
  SI(0);
CLK(0);
  delay_us(1);
SI(1);
delay_us(1);
  CLK(1);
delay_us(1);
SI(0);
  delay_us(1);
AD[0]=Get_Adc(0);
CLK(0);
  //采第2~128个点
  for(i=1; i<128; i++)
  {
    delay_us(1);
CLK(1);
delay_us(1);
AD = Get_Adc(0);
    CLK(0);
  }
//第129个结束CLK
delay_us(1);
  CLK(1);
delay_us(1);
CLK(0);
  delay_ms(10);
}
请问是将delay_us(1)改为(5)吗?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 05:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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