智能车制作
标题:
CCD模拟摄像头可以采集后,加了奇偶场分工就歇菜了,谁来救救啊!!!
[打印本页]
作者:
lanx
时间:
2010-3-7 16:59
标题:
CCD模拟摄像头可以采集后,加了奇偶场分工就歇菜了,谁来救救啊!!!
改的实在头晕了,或者我思维受困了,请帮忙看看哪里出来问题。
注:外部中断E1接行同步,J口中断接场同步,PORTA口0位接奇偶场,AD转化1口接视频信号。
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */#define VERTICAL 30 // 垂直分辨率
#define HORIZONTAL 16 //水平分辨率
int line_now,catch_line; // 现在行数及捕捉后存放的行数
int n,m; //普通循环变量
unsigned int r,l; //场行循环变量
int field_ready=0; //场开始标志
unsigned char ccd[VERTICAL][HORIZONTAL]; // 像素存储数组
char txtbuf[16]=""; //串行通讯时用字符缓存
const unsigned int Line_catch[30]={26,30,34,38,43,
48,53,59,65,71,
78,85,92,110,118,
126,135,144,153,163,
173,183,194,205,216,
228,238,250,262,273
}; //要采集行的行号
//****************************************************** 毫秒级延时
void delayms(int ms)
{
int ii,jj;
if (ms<1) ms=1;
for(ii=0;ii<ms;ii++)
for(jj=0;jj<3338;jj++); //40MHz--1ms
}//****************************************************** 串行通信初始化
static void SCI_Init(void)
{
SCI0CR2=0x2c; //enable Receive Full Interrupt,RX enable,Tx enable
SCI0BDH=0x00; //busclk 8MHz,19200bps,SCI0BDL=0x1a
SCI0BDL=0x68; //SCI0BDL=busclk/(16*SCI0BDL)
//busclk 16MHz, 9600bps,SCI0BDL=0x68
} //****************************************************** AD初始化 1void AD_Init1(void)
{
ATD0CTL1=0x00; //7:1-外部触发,65:00-8位精度,4:放电,3210:ch
ATD0CTL2=0x40; //禁止外部触发, 中断禁止
ATD0CTL3=0x88; //10001000 转换长度为一
ATD0CTL4=0x01; // fATDCLK=fBUS/[2 × (PRS + 1)]
ATD0CTL5=0x20; //0单通道连续转换
ATD0DIEN=0x00; //缓冲区禁止~~;
} //****************************************************** PLL设置
void init_PLL()
{
REFDV=1;
SYNR=1;
while(0==CRGFLG_LOCK);
CLKSEL=0x80; //32Mhz
}
//****************************************************** 初始化B口灯和A口输入 void INIT_PORT(void)
{
DDRB=0XFF;
PORTB=0X00;
DDRA=0X00;
}
//****************************************************** 主函数
void main(void)
{
DisableInterrupts;
init_PLL() ;
SCI_Init();
IRQCR_IRQEN =1; //中断使能
IRQCR_IRQE=1; //下降沿触发
AD_Init1() ;
DDRJ=0X00;
PPSJ=0X00; //J口作为中断初始化
PIEJ=0X80;
PIFJ=0XFF;
//PUCR_PUPAE=1;
INIT_PORT();
//putstr("\ntest.");
EnableInterrupts; for(;;) { } ;
}
//******************************************************
#pragma CODE_SEG __NEAR_SEG NON_BANKED
//******************************************************
void interrupt 6 IRQ_interrupt(void) //外部中断作为行同步处理函数
{
if(PORTA_PA0&&field_ready){
if(line_now==Line_catch[r]){
for(l=0;l<HORIZONTAL;l++){
while(!ATD0STAT0_SCF);
ccd[catch_line][l]=ATD0DR0L;
}
catch_line++; r++; l=0;
}
line_now++;
}
}
//******************************************************
void interrupt 24 Field_PJ(void) //PJ口作为场同步中断处理函数
{
DisableInterrupts;
field_ready=1; //关中断
if(PORTA_PA0==0){
IRQCR_IRQEN =0; //停止行输入
for(m=0;m<VERTICAL;m++){
for(n=0;n<HORIZONTAL;n++){
while(!(SCI0SR1&0x80)) ;
SCI0DRL=ccd[m][n];
} while(!(SCI0SR1&0x80)) ; SCI0DRL=0;
} while(!(SCI0SR1&0x80)) ; SCI0DRL=0; while(!(SCI0SR1&0x80)) ; SCI0DRL=0;
}
PORTB++;
line_now=0 ;
PIEJ=0XFF;
IRQCR_IRQEN =1; //中断使能
EnableInterrupts; //开中断
}
作者:
lanx
时间:
2010-3-7 18:20
看来不冒泡顶上去都没人看到哦……
作者:
zouyf12
时间:
2010-3-8 15:49
看不懂
能简练一点否
作者:
hangbaby
时间:
2010-3-8 16:22
来点注释啊,不然很难看懂!
作者:
cqqjliyuan
时间:
2010-3-8 16:43
就是呀 自己写都比看你的快 还是加点注释好
作者:
dkmy
时间:
2010-3-8 19:22
没注释... 咋整?
作者:
lanx
时间:
2010-3-9 20:01
额……注释很全了啊。
另外我重新写了算法,这个问题解决了。有兴趣的话我上传上来。
作者:
lanx
时间:
2010-3-9 20:02
此问题已解决,不过还是放在这里,另外大家有需要我可以把改过后的代码给贴上来。
作者:
一灯师太
时间:
2010-3-13 12:06
摄像头用数字的好还是模拟的好啊
作者:
786892880
时间:
2010-3-13 12:40
回复
9#
一灯师太
硬件做得好的话肯定是数字好了。
作者:
一灯师太
时间:
2010-3-14 12:02
回复
10#
786892880
哦。那用数字的话对那部分硬件条件要求高啊,谢啦
作者:
吾陪你
时间:
2010-3-14 12:32
好东东 顶起
作者:
吾陪你
时间:
2010-3-14 12:33
新手啊
看到就头大
作者:
786892880
时间:
2010-3-16 12:34
回复
11#
一灯师太
我没用过数字摄像头,但是根据报告说明,数字摄像头是最简单的,而且很容易就满足要求。硬件上应该要做到去耦等工作,保证摄像头有一个稳定的工作环境,还有中断优先级要选取好。
作者:
youan4
时间:
2010-4-23 09:53
回复
1#
lanx
我们的AD初始化和你差不多,为什么我们用CCD摄像头采集到的数值特别小,而且也极不稳定,你们的怎么样?敬请不吝赐教
作者:
haojinweiwei
时间:
2010-5-2 11:55
很需要,贴上参考一下,我们调试很多天了,总是有一段数据不对,根本不变,一直是0 48,郁闷!
作者:
lanx
时间:
2010-5-10 02:01
回复
15#
youan4
参考电压调一下试试
作者:
王怀玉
时间:
2010-5-18 18:07
程序没有看的太明白
不过感觉你应该是开中断和关中断的问题
建议你采集完需要的行后关闭行中断
试试看行不行
可能会发生串场的反应
如果那样就同时开关行场中断
等所有程序执行完后在打开中断
注意代码处理时间
作者:
t5pkok
时间:
2010-5-18 23:27
没必要这么多,场中断中只要关掉场中断,开启行中段就可以了,我就是
作者:
吾陪你
时间:
2010-5-19 08:47
你的时钟计算错误了 尤其是超频部分
作者:
yxh12345678910
时间:
2010-5-21 13:10
ha
作者:
yxh12345678910
时间:
2010-5-21 13:11
haoya
作者:
ouyangjin1226
时间:
2010-6-24 17:09
虚心学习的:
void vPLLInit(void)//锁相环初始化
{ //BUS-CLOCK=PLL-CLOCK/2=32M
REFDV = 1; // set the REFDV register 16M*2*(3+1)/(1+1)=64M
SYNR =3; // set the SYNR register to give us a 64 MHz PLL-clock.
asm nop // nops required for PLL stability.
asm nop
asm nop
asm nop
while ((CRGFLG&0x08)==0); // wait here till the PLL is locked.
CLKSEL|=0x80; // switch the bus clock to the PLL.
}
设置总线时钟为32M
void vECTInit(void)//定时器初始化
{
TIOS =0x00; //设为输入捕捉
TSCR1=0x80; //定时器使能
TSCR2=0x83; //允许定时器溢出中断,定时器时钟32M/(2^3)=4M
TCTL4=0xAA; //触发电平:下降沿
TIE =0x07; //开中断
TFLG1=0xFF; //清除中断标志
}
输入捕捉的1,2通道接行场中断。
void vADInit(void)//AD转换初始化程序
{
//ATD1设置
//上电,标志位快速清零,忽略外部触发,执行一次停止,中断禁止。
ATD1CTL2 = (ATD1CTL2_AFFC_MASK | ATD1CTL2_ADPU_MASK);
//转换序列长度为1,FIFO模式,Freeze模式下继续转换。|ATD0CTL3_FIFO_MASK
ATD1CTL3 = (ATD1CTL3_S1C_MASK);
//8位精度,2AD采样周期,采样长度8。
//ATDClock=[BusClock*0.5]/[PRS+1] ; PRS=15, divider=32
ATD1CTL4 =(ATD1CTL4_SRES8_MASK|ATD1CTL4_PRS0_MASK);
//右对齐无符号,扫描模式连续采样,单通道采样//多通道采样|ATD0CTL5_MULT_MASK。
ATD1CTL5 = (ATD1CTL5_DJM_MASK|ATD1CTL5_SCAN_MASK);
//禁止数字输入缓冲
ATD1DIEN=0x00;
}
ATD1的0通道用于AD转换
下面是真正的图像采集程序
//当前采样图像的行和列。
unsigned int ui_SampleRow=0,ui_SampleColumn=0;
//图像数据缓存
unsigned char uca_Buffer1[IMAGE_ROW][IMAGE_COLUMN];
unsigned char uca_Buffer2[IMAGE_ROW][IMAGE_COLUMN];
//指向当前采集数据采样缓存首地址的指针
unsigned char *puca_BufferSample=&uca_Buffer1[0][0];
//指向当前处理数据采样缓存首地址的指针
unsigned char *puca_BufferProcess=&uca_Buffer2[0][0];
//用于图像采集和处理交换缓存。(注意:在每次交换指针后保证puca_BufferTemp与puca_BufferSample相同)
unsigned char *puca_BufferTemp=&uca_Buffer1[0][0];
#pragma CODE_SEG NON_BANKED
//输入捕捉2通道中断函数,行同步 ,用于数据采集。
void interrupt 10 vIC2ISR(void)
{
unsigned char ucTemp;
unsigned char *pucTemp;
TFLG1_C2F=1;
if(ui_SampleRow>=SAMP_ROW_START&&ui_SampleRow<SAMP_ROW_MAX)
{
if(ui_SampleRow%SAMP_ROW_SEP==0)
{
for(ui_SampleColumn=0;ui_SampleColumn<SAMP_COL_MAX;ui_SampleColumn++)
{
while(!ATD1STAT1_CCF0);
if(ui_SampleColumn>=SAMP_COL_START)
{
if(ui_SampleColumn%SAMP_COL_SEP==0)
{
pucTemp=puca_BufferSample
+((ui_SampleRow-SAMP_ROW_START)/SAMP_ROW_SEP)*IMAGE_COLUMN
+(ui_SampleColumn-SAMP_COL_START)/SAMP_COL_SEP;
*pucTemp=ATD1DR0L;
}
}
}
}
}
ucTemp=ATD1DR0L;
ui_SampleRow++; //采样行坐标加一。
}
//输入捕捉1通道中断函数,场同步,交换缓存以及图像处理和模型车控制。
void interrupt 9 vIC1ISR(void)
{
TFLG1_C1F=1;
ui_SampleRow=0; //把采样行坐标清零。
ui_SampleColumn=0;
//交换图像采集和处理缓存
puca_BufferSample=puca_BufferProcess;
puca_BufferProcess=puca_BufferTemp;
puca_BufferTemp=puca_BufferSample;
//系统时间加一。
ul_SystemTime+=1;
//开中断,允许行信号中断进行采样。
EnableInterrupts;
if(uc_CarState==STATE_START)
{
// PORTB_BIT1=1;
//分析图像,获取路径参数,根据路径参数控制模型车。。
vImageProcess();
//根据路径参数控制模型车。
vAutoControl();
// PORTB_BIT1=0;
}
}
作者:
ouyangjin1226
时间:
2010-6-24 17:11
楼主,我想问一下用串口大师收集不到摄像头采集的图像该怎么办,摄像头调试都没好
作者:
ouyangjin1226
时间:
2010-6-24 17:28
楼主,我的程序也有问题,能不能把改过后的代码给贴上来
作者:
Elec_Ramble
时间:
2010-11-28 22:49
我觉得没什么经验,还是数字的好!
作者:
437334816
时间:
2010-11-29 11:34
作者:
天高云淡
时间:
2012-4-17 18:44
我也遇到了楼主遇到的问题,接入奇偶场同步信号之后就不行了,希望楼主指点一下
作者:
箫声默
时间:
2014-1-14 08:42
lanx 发表于 2010-3-9 20:01
额……注释很全了啊。
另外我重新写了算法,这个问题解决了。有兴趣的话我上传上来。
能不能把你的资料发过来一份 ?? 不知如何利用采集的信息 控制转弯。
924514210@qq.com
欢迎光临 智能车制作 (http://111.231.132.190/)
Powered by Discuz! X3.2