飞思卡尔智能车摄像头上位机…
基于飞思卡尔XS128单片机 摄像头采集测试程序
OV7620采集程序说明:摄像头数据口接PA0-PA7;行中断接PT0,场中断接PT1;
S0为单片机RXD,接到串口模块的TXD中,S1为单片机TXD,接到单片机RXD中
波特率默认为9600,用户可自行修改波特率,图像大小为64*50,帧头帧尾都为0x01
#include <hidef.h>
#include "derivative.h"
#define uint unsigned int
#define uchar unsigned char
#define RowMax 50 //图像行数
#define ColumnMax 64 //图像列数
uchar hang_count;
uint hang,lie;
unsigned char ImageData[RowMax][ColumnMax]; //图像数据数组
void Delay(uint tt)
{
uint i;
for(i=0;i}
void crg_init(void) //时钟初始化函数
{
CLKSEL=0X00; //时钟选择寄存器
PLLCTL_PLLON=1; //锁相环电路允许
SYNR=0XC0|0X07; //时钟合成寄存器
REFDV=0X80|0X01; //pllclok=2osc(1+SYNR)(1+REFDV)=128M
POSTDIV=0X00;
_asm(nop);
_asm(nop);
while(!(CRGFLG_LOCK==1)); //等待锁相环稳定
CLKSEL_PLLSEL=1; //应用锁相环
}
void IO_init(void)
{ // IO初始化函数
DDRA = 0X00;
}
void ect_init()
{
TIOS=0x00; //T0、T1设置为输入捕捉,摄像头行场中断---关输出比较通道7
TCTL4=0x09; //通道0为上升沿捕捉,1为下降沿捕捉
TIE=0x03; //开场中断,行中断
TSCR1=0x80; //定时器正常工作
TSCR2=0x00; //最后三位为预分频因子选择位
TFLG1=0xFF; //清除该位
TFLG2=0x80; //清除 TOF
}
void Init_SCI(void)
{
SCI0CR1 = 0x00; // 8位数据位,无奇偶校验
SCI0CR2 = 0x2c; //允许接收和发送数据,允许接收中断功能
SCI0BD = 0x22; // 115200波特率
}
void SCI_Send_Byte(unsigned char data)
{
while (!SCI0SR1_TDRE); // 等待发送数据寄存器中的值->发送移位寄存器中
while (!SCI0SR1_TC); // 等待发送移位寄存器中的数值发送完成
SCI0DRL = data;
}
void SCI_Send_Image_String(unsigned char *putchar, uint num)
{
uint i = 0;
for(i=0;i
{
if(putchar[i]==0x01)putchar[i]=0x02;
SCI_Send_Byte(putchar[i]);
}
}
void main(void)
{
crg_init();
ect_init();
IO_init() ;
Init_SCI();
EnableInterrupts;
for(;;)
{
}
}
#pragma CODE_SEG NON_BANKED
void interrupt 8 Port0_Interrupt()
{
int i=0;
TFLG1=0x01; //清行中断标志位
if(hang%4==0) //隔4行采集一次
{
Delay(35);
for(lie=0;lie
{
ImageData[hang_count][lie]=PORTA; //隔一小段时间采集一列数据
asm("nop");
asm("nop");
}
hang_count++;
}
hang++; //行计数器加 1
if(hang_count==RowMax)
{
TIE=0x02; //关行中断
DisableInterrupts;
SCI_Send_Byte(0x01);
SCI_Send_Image_String(&ImageData[0][0],RowMax*ColumnMax); //发送图像数组
SCI_Send_Byte(0x01);
TIE=0x02; //开场中断
EnableInterrupts;
}
}
#pragma CODE_SEG NON_BANKED
interrupt 9 void PT1_Interrupt(void)
{
TFLG1=0x03; //清场中断,行中断
TIE=0x03; //开行中断
hang=0; //行列计数清空
lie=0;
hang_count=0;
}
智能车上位机全功能版
-------摄像头组协议说明文档
一、发送图像的协议:
要想上位机能够正确显示下位机发送过来的灰度图像数据就必须注意以下几点:
A. 首先要确保上下位机设置的波特率要一致。否则接收到的数据全部是乱的,此时上位机的状态是:接收到字节数,但显示全部丢失。
B. 设置好上位机的图像大小,要保证跟下位机发送的图像大小一致。
图像宽度,即图像数组的总列数,图像高度,即图像数组的总行数。
如果上位机的图像大小跟下位机发送的不一致,那么此时上位机的状态将是:
C. 发送图像数据之前请先发送一个帧头0x01到串口。
D. 发送图像数据的过程中,请你多加一个判断语句,如果当前要发送的图像数据跟帧头0x01一样,请你该发另一个数比如0x02。(我们最好要这么样做,因为帧头是告诉上位机一帧图像的接收开始,当上位机接收到0x01时就要从0开始计数,当计数到一幅图像的大小后,如果再接收到一个0x01,就表明这幅图像完整接收了,中途中没有数据的丢失,这时候上位机才把这幅正确的图像显示出来。否则,当上位机的计数尚未等于一幅图像的全部字节数又接收到一个0x01,就认为这幅图像是已经在传输中有丢失了。此时上位机的处理是直接丢弃这幅不完整的图像,也许你可能要说干嘛要全部丢掉呢,把接收不足的字节数用0或者1任意一个字节来填充不就好了吗。想法固然是好的,但是这是不可行的,因为我们不知道这幅图像数据到底丢失哪一部分,我们无法对这部分进行填充处理,假如我们填充的地方错误,那么图像将混乱不清,这时候对你的调试将带来无限的麻烦,不知道到底哪里出了问题的。)
E. 在一幅图像数据全部发送完的后面再发一个0x01到串口,因为上位机接收的一幅图像的判断是前一个0x01后一个0x01中间长度恰好是一幅图像大小。如果在一幅图像数据全部发送完的后面不发送0x01时,如果是连续发送过程,那么你将丢失最后的一幅图像,如果你只发一幅图像,那么上位机将显示不出任何图像。
发送灰度图像经典样例:
比如说你采集的图像尺寸为80*30,ImageData[HEIGHT][WIDTH]为二维数组存放图像,SendByte(c)为发送c到串口的函数
首先我们先打开上位机,设置好上位机的图像大小为80*30.
然后下位机的发送代码如下:
#define WIDTH 80 //图像宽度,即数组列数
#define HEIGHT 30 //图像高度,即数组行数
unsigned char ImageData[HEIGHT][WIDTH];
/发送一帧图像的函数里面要写的代码开始
//先发送帧头,发送0x01到串口
SendByte(0x01);
//发送图像数据
for(i=0;i
{
for(j=0;j
{
//如果图像数据中跟帧头一样的数据,则改之。
// 避免图像数据与帧头冲突,导致上位机误判断为图像边界而
//引起的数据大量丢失的情况。
if(ImageData[j] == 0x01) {ImageData[j]=0x02;}
SendByte(ImageData[j]);
}
}
// 最好在一帧图像数据发完后也要发一个帧头标志.
//避免只发一帧图像的时候上位机检测不到下一个帧头而显示不出图像//的尴尬局面。
SendByte(0x01);//发送0x01到串口
///发送一帧图像的函数里面要写的代码结束//
二、只发图像中心线的协议:
A、问题描述:
我们发送的完整一幅图像数据的时候,由于数据量大,只能在前期调试和研究图像处理的时候有用处,但是当我们到后期调试的时候,我们就没有必要发送完整的一幅图像数据了。我们只想看看我们对图像进行的中心线提取到底稳定情况如何。所以我们只要发送提取到的中心线数据就行了。因为中心线数据很少,所以可以让车边跑边发送中心线回来。
B、操作第一步:把上位机界面上的只接收中心线选项打勾。
C、设置好上位机的图像大小跟下位机的图像大小一致。(说明:
因为上位机接收到一条完整的中心线后需要还原出这条中心线在这幅图像的位置。如果没有设置,那么上位机还原出来的中心线位置就不是原图实际的中心线位置了。)
C、下位机发送的数据格式如下:
首先先发两个字节0XFF 0XFF的帧头数据
然后再发送中心线数组:假如你的图像数组大小为:100列,50行。
那么你提取到的中心线将是一个50个字节大小的数组。
你只要再发送这50个大小的中心线数组数据就可以了。
此时整个发送数据有:0XFF 0XFF + 一个中心线数组。
飞思卡尔智能车摄像头上位机…相关推荐
- 智能车改舵机中值步骤_飞思卡尔智能车摄像头组新手指南(10)--控制算法进阶篇之舵机3...
曲率 彭岸辉 从理论上讲,相对于偏差量,曲率是智能车更好的一个控制变量.但由于路径检测单元的局限性,很难计算出非常精确的曲率. 注意:计算曲率的方法如果要提高精度,最好是能够将采到的畸形图像做一下校正 ...
- 飞思卡尔智能车之摄像头使用篇
飞思卡尔智能车之摄像头使用 今天来给大家说说摄像头的使用,很显然摄像头对摄像头组的重要性是不言而喻的,因为摄像头是小车提取赛道信息最关键的传感器了,所以只有把摄像头使用好才能让你的小车快速稳定的 ...
- ai电磁组属于什么组_飞思卡尔智能车电磁组分区算法介绍
写在之前的话: 1.目前我是一名在校学生,这也是我第一次写博客,不周之处,请多谅解: 2.此算法并非原创,借鉴自山东德州学院第八届白杨队(PS:个人看法,对于一些人把别人的开源东西改头换面一下就说是自 ...
- 第五届“飞思卡尔”智能车竞赛分赛区赛后总结
两天紧张的比赛结束了,第五届"飞思卡尔"智能车竞赛安徽省分赛区的全部比赛也到此结束了.在黄山,我体验了黄山风景的美丽,也体会了各院校在"飞思卡尔"项目上的强大. ...
- 最小二乘法在飞思卡尔智能车路径搜索中的应用
1.什么是最小二乘法 最小二乘法就是要使得观测点和估计点的距离的平方达到最小,我们可以使用一些已知的离散的点,拟合出一条与这些离散点最为接近的曲线,从而可以分析出这些离散点的走向趋势. 如图所示是一个 ...
- 飞思卡尔智能车—无线充电电源(节能组)
飞思卡尔智能车-无线充电电源(节能组) 详细参赛要求请以智能车官方为准,此文章仅分享本人参赛经验,开源硬件电路设计,供大家学习! 无线充电部分设计思路: 无线充电接收线圈,超级电容充电,启动电压5V, ...
- 红外寻迹小车基于K128单片机的红外对管飞思卡尔智能车(5个对管)程序部分
红外寻迹小车基于K128单片机的红外对管飞思卡尔智能车(5个对管)软件部分包括: 出库 直行模块 大,小弯道 环岛 s弯 停车 #include "headfile.h" #inc ...
- 飞思卡尔智能车—电磁循迹(节能组)
飞思卡尔智能车-电磁循迹(节能组) 详细参赛要求请以智能车官方为准,此文章仅分享本人参赛经验,开源硬件电路设计,供大家学习! 电磁循迹部分设计思路: 电感采集电磁信号,放大,整流,滤波,AD采集 电磁 ...
- 回忆属于我的第五届“飞思卡尔”智能车竞赛
飞思卡尔,一个原本陌生,而现在常常挂在嘴边的名字-- 09年高考的结束,注定了我只能来到芜湖职业技术学院这个专科,当时的心情很失落,其实无论拿哪次模拟考的成绩,我都是可以上个二本的,郁闷了-- 因为自 ...
最新文章
- 数字证书及CA的扫盲介绍
- boost::hof::flip用法的测试程序
- 观察者模式在个人网站邮件发布与订阅中的实践
- Error installing bundler:bundler requires Ruby version >= 2.3.0.
- 使用jstack查看某个Java进程内的线程堆栈信息
- android 汽车 源码_汽车级Linux,无需Google即可运行Android等
- 一张图11招学会Python网络黑客
- excel vlookup多个条件匹配多列_Excel教程第12课:VLOOKUP函数近似匹配到底怎么回事,原理+操作...
- 支持向量机SVM分析
- 直插式电阻电容封装与尺寸图…
- 申论文章观点的打造技巧
- html 飘窗链接,飘窗html
- Codeforces Round #645 (Div. 2)
- ug998逻辑思维导图
- 【C语言】输入一个正整数 n,输入 n 个数,生成一个 n*n 的矩阵, 矩阵中第 1 行是输入的 n 个数,以后每一行都是上一行循环左移一个元素。
- Altium Designer 20 (6)——二极管以及光耦元件创建
- 模块内高内聚?模块间低耦合?MVC+EF演示给你看!
- linux系统键盘被锁定,Unix系统键盘失效等问题讲解
- 04.声明式服务调用:Spring Cloud Feign(Greenwich.SR2)
- 阿里云服务器java项目踩坑日记