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

2019-10-12 14:12发布

弄了两周了,一直没有解决。我刚开始学,用的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;
  }
 }

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
正点原子
1楼-- · 2019-10-12 14:59
帮顶....
XINSI
2楼-- · 2019-10-12 17:00
 精彩回答 2  元偷偷看……
明天会更好
3楼-- · 2019-10-12 19:20
回复【3楼】XINSI:
---------------------------------
大神,给我线性CCD  stm32的程序,
向浩
4楼-- · 2019-10-12 22:59
我建议用两个方案试一下:第一把AD的采集时间延长,第二就是延长曝光时间或者采集通过运放后的AD值
因为今年我是做飞思卡尔智能车光电组的我就遇到了AD值太低没有多大的区别
我当时就是通过手册改的AD的采集时间
不死的富翁
5楼-- · 2019-10-13 04:26
回复【3楼】XINSI:
---------------------------------
用STM32做CCD应该用什么
XINSI
6楼-- · 2019-10-13 07:58
回复【6楼】不死的富翁:
---------------------------------
睡边。。。。

一周热门 更多>