飞思卡尔摄像头代码经过验证
ov7725数字摄像头编程基本知识笔记
PCLKHREFHSYNC 像素值ov7725数字摄像头编程基本知识笔记这里以ov7725为例,对数字摄像头的时序进行分析。
其他数字摄像头的时序也大同小异。
像素输出顺序数字摄像头输出图像时,一般都是从左到右,有上到下逐个输出(部分芯片可配置输出顺序):有些摄像头有奇偶场,是采用隔行扫描方法,把一帧图象分为奇数场和偶数场两场。
(ov7725没有奇偶场之分)行中断时序0 第一个输出像素最后一个输出像素 最后一个像素 消隐区,如果不按照时序来采集,就有可能采集到消隐区,值为0,即黑色。
行与行之间,场与场之间都一行图像数据 第一个 像素 PCLK 上升沿时,MCU 采集图像;下降沿时,摄像头输出图像。
HREF 和HSYNC 都用于行中断信号,但时序有点区别。
HREF 上升沿就马上输出图像数据,而HSYNC 会等待一段时间再输出图像数据,如果行中断里需要处理事情再开始采集,则显然用HREF 的上升沿是很容易来不两个都是行中断信号,共用同一个管脚,由寄存器配置选择哪个信号输出。
场中断时序采集图像思路①使用for 循环延时采集1. 需要采集图像时,开场中断2. 场中断来了就开启行中断,关闭场中断3. 行中断里用for 循环延时采集像素,可以在行中断里添加标志位,部分行不采集,即可跨行采集。
4. 行中断次数等于图像行数时即可关闭行中断,标志图像采集完毕。
②使用场中断和行中断,DMA 传输1. 需要采集图像时,开场中断2. 场中断来了,开行中断和初始化DMA 传输3. 行中断来了就设置DMA 地址,启动DMA 传输。
如果先过滤部分行不采集,则设置一个静态变量,每次行中断来了都自加1,根据值来选择采集或不采集某些行。
4. 每个PCLK 上升沿来了都触发DMA 传输,把摄像头输出的值读取到内存数组里。
当触发n 次(n=图像列数目)后就停止DMA 传输。
5. 行中断次数等于一幅图像的行数,或者等待下一个场中断来临 就结束图像采集,关闭行中断和场中断。
飞思卡尔智能车摄像头代码
**************************************************************************/
void SystemInit(void)
{ AbsoluteTime = 0; // 初始化系统时钟
DDRB = 0xff; // 初始化PORTB,用于数据输出
}
else
{
ie+=e;
speed_0=speed_0-(Kp*e/10)-(int)(Ki*ie/1000)+Kd*(e-e_1);
SetSpeed();
}
}
void SetSpeed(void)
{ if(speed_0>2400)
speed_0=2400;
int e=0,e_1=0;
int ie=0;
int Kp=35;
int Kd=0;
int Ki=10;//5;
int PACN0_i;
int SpeedMin=90,SpeedMax=400;
char a;
/***********************************************************************
PWMCNT23 = 0xFF;
PWMCNT45 = 0xFF;
PWMCNT67 = 0xFF;
PWMPER01 = 60000; // 驱动前轮舵机,周期20ms,频率50Hz
PWMPER23 = 2400; //周期0.1ms,频率10kHz
PWMPER67 = 2400;
PBCTL_PBEN=1;//16位累加器B使能
cascadeclassifier源码详解
Cascadeclassifier源码详解一、前言在计算机视觉和图像处理领域,Cascadeclassifier是一种常用的目标检测算法。
它可以用于人脸识别、物体检测等任务,被广泛应用于人工智能、安防监控、互联网等领域。
Cascadeclassifier引入了Haar-like特征和Adaboost算法,通过级联多个弱分类器构成的强分类器,来实现对目标的高效检测。
本文将对Cascadeclassifier源码进行详细解读,包括算法原理、代码结构、实现细节、优化技巧等方面的内容。
二、算法原理1. Haar-like特征Haar-like特征是Cascadeclassifier算法中的基础。
它通过对图像进行特征提取,将图像转换成一组特征值,用于表示图像中的区域。
Haar-like特征包括直方图、水平/垂直直线特征等,这些特征可以对目标的不同形状、纹理、边缘等进行描述。
2. Adaboost算法Adaboost算法是Cascadeclassifier的核心。
它通过训练一系列弱分类器,然后将这些弱分类器进行级联,构成一个强分类器。
Adaboost 算法的关键在于对训练样本进行加权,使得错误分类的样本在下一轮训练中得到更多重视,从而不断改进弱分类器的准确率。
3. 级联分类器级联分类器是Cascadeclassifier的特点之一。
它将多个弱分类器进行级联,当一个样本通过了第一个弱分类器,才会继续传递给下一个弱分类器。
这种级联结构能够在保证高检测率的大大减少了计算量,提高了算法的效率。
三、代码结构1. 源文件组织Cascadeclassifier的源码通常组织如下:- haarcascade_frontalface_alt.xml:前置摄像头人脸检测模型- haarcascade_frontalface_default.xml:默认人脸检测模型- haarcascade_eye.xml:眼部检测模型- haarcascade_upperbody.xml:上半身检测模型- haarcascade_licence_plate_rus_16stages.xml:车牌检测模型- haarcascade_smile.xml:微笑检测模型- haarcascade_fullbody.xml:全身检测模型2. 源码分析Cascadeclassifier的源码通常包括以下几个部分:- 加载模型:通过读取xml文件,加载预训练的级联分类器模型- 图像预处理:对输入图像进行灰度转换、归一化等预处理操作- 特征提取:利用Haar-like特征对图像进行特征提取- Adaboost分类:通过Adaboost算法对特征进行分类,得到分类结果- 级联分类:对多个弱分类器进行级联,得到较为精确的目标检测结果- 检测输出:将检测结果输出到图像上,或者返回目标的位置坐标四、实现细节1. Haar-like特征提取在Cascadeclassifier的源码中,Haar-like特征提取是一个关键的步骤。
飞思卡尔智能车摄像头组技术报告 (2)
第十届“飞思卡尔”杯全国大学生智能汽车竞赛技术报告摘要本文设计的智能车系统以K60微控制器为核心控制单元,基于CCD摄像头的图像采样获取赛道图像信息,提取赛道中心线,计算出小车与黑线间的位置偏差,采用PD方式对舵机转向进行反馈控制。
使用PID控制算法调节驱动电机的转速,结合特定算法分析出前方赛道信息实现对模型车运动速度的闭环控制。
为了提高模型车的速度和稳定性,我们用C++开发了仿真平台、蓝牙串口模块、SD卡模块、键盘液晶模块等调试工具,通过一系列的调试,证明该系统设计方案是确实可行的。
关键词:K60,CCD摄像头,二值化,PID控制,C++仿真,SD卡AbstractIn this paper, we will design a intelligent vehicle system based on MC56F8366 as the micro-controller unit. using the CCD image sensor sampling to the track image information to extract the track line center, to calculate the positional deviation between the car with the black line, the use of PD on the rudder. The machine turned to the feedback control. We use PID control algorithm to adjust the speed of the drive motor, combined with specific algorithms to achieve closed-loop control of the movement speed of the model car in front of the track. In order to improve the speed and stability of the model car, we use the C++ to develop a simulation platform, Bluetooth serial module, SD card module, keyboard, LCD modules, debugging tools. Through a series of debugging, the system design is feasible.Key words: K60,CCD_camera, binaryzation, PID control, C++ simulation, SD card目录第1章引言................................................................................... - 1 - 第2章系统总体设计................................................................ - 2 - 2.1 系统分析..................................................................................... - 2 - 2.2 车模整体布局............................................................................. - 3 - 2.3 本章小结....................................................................................... - 4 - 第3章系统机械设计及实现................................................... - 5 - 3.1 前轮定位的调整......................................................................... - 5 -3.1.1主销内倾..............................................................................- 6 -3.1.2 后倾角.................................................................................- 6 -3.1.3 内倾角.................................................................................- 7 - 3.2 舵机安装....................................................................................... - 8 -3.2.1 左右不对称问题的发现与解决........................................- 10 - 3.3 编码器的安装............................................................................ - 10 - 3.4 摄像头安装.................................................................................- 11 -3.4.1 偏振镜的使用......................................................................- 12 -3.4.2 摄像头的标定......................................................................- 12 - 3.5 摄像头的选用.............................................................................- 13 - 3.6 红外接收装置.............................................................................- 14 -3.7 防止静电复位.............................................................................- 15 - 3.8 本章小结.......................................................................................- 15 - 第4章硬件电路系统设计及实现 ...................................... - 16 -4.1 硬件设计方案............................................................................- 16 - 4.2 电源稳压......................................................................................- 17 - 4.3 电机驱动......................................................................................- 18 - 4.4 图像处理部分............................................................................- 19 -4.4.1 摄像头升压电路.............................................................- 19 -4.4.2 视频分离电路.................................................................- 19 -4.4.3 硬件二值化.....................................................................- 19 - 4.5 灯塔电路......................................................................................- 21 - 4.6 本章小结......................................................................................- 21 -第5章系统软件设计.............................................................. - 22 -5.1 软件流程图...............................................................................- 22 - 5.2 算法新思路...............................................................................- 23 -5.2.1中心线提取.......................................................................- 23 -5.2.2 直角检测........................................................................... - 24 -5.2.3 单线检测......................................................................... - 24 - 5.3 舵机控制.....................................................................................- 25 - 5.4 速度控制.....................................................................................- 26 - 5.5 PID算法....................................................................................- 26 - 5.6 路径优化.....................................................................................- 31 -第6章系统联调...................................................................... - 33 - 6.1 开发工具.................................................................................... - 33 - 6.2 无线调试蓝牙模块及蓝牙上位机..........................................- 33 - 6.3 键盘加液晶调试......................................................................- 34 - 6.4 TF卡调试模块.........................................................................- 34 -6.4.1 TF卡.............................................................................- 34-6.4.2 SDCH卡 .........................................................................- 35 -6.4.3 软件实现.......................................................................- 36 - 6.5 C++上位机设计........................................................................- 36 - 6.6 电源放电模块...........................................................................- 38-6.6.1 镍镉电池记忆效应…………………………………….. - 39-6.6.2 放电及电池性能检测设备…………………………….. - 39- 6.7 本章小结....................................................................................- 40 - 第7章模型车技术参数........................................................ - 41 - 第8章总结............................................................................... - 42 - 参考文献...................................................................................... - 44 -第1章引言在半导体技术日渐发展的今天,电子技术在汽车中的应用越来广泛,汽车智能化已成为行业发展的必然趋势。
飞思卡尔
光电组、摄像头组、 光电组、摄像头组、电磁组简介
霍尔开关元件: 霍尔开关元件: 霍尔传感器是基于霍尔效应原理,将电流、 霍尔传感器是基于霍尔效应原理,将电流、 磁场、位移、压力、 磁场、位移、压力、压差转速等被测量转换 成电动势输出的一种传感器。虽然转换率低、 成电动势输出的一种传感器。虽然转换率低、 温度影响大、 温度影响大、要求转换精度较高时必须进行 温度补偿,但霍尔传感器具有结构简单、 温度补偿,但霍尔传感器具有结构简单、体 积小、坚固、频率响应宽(从直流到微波)、 积小、坚固、频率响应宽(从直流到微波)、 动态范围(输出电动势的变化) 无触点、 动态范围(输出电动势的变化)大、无触点、 寿命长、可靠性高, 寿命长、可靠性高,以及易于微型化和集成 电路化等优点。 电路化等优点。
光电组、摄像头组、 光电组、摄像头组、电磁组简介
理论上可以用密 绕的线圈作为传感器 去测量通电直导线的 磁场。 磁场。 实际上要用LC并联 实际上要用LC并联 LC 谐振电路放大感应电压, 谐振电路放大感应电压, 并且由于LC LC回路的选频 并且由于LC回路的选频 特性, 特性,可以去除一些噪 声。
‘飞思卡尔’智能车简介
大赛要求使用统一指定的竞赛 车模套件, 车模套件,采用飞思卡尔公司的 位微控制器MC9S12XS128 MC9S12XS128作为 16 位微控制器MC9S12XS128作为 核心控制单元, 核心控制单元,自主构思控制方 案进行系统设计, 案进行系统设计,包括传感器信 号采集处理、动力电机驱动、 号采集处理、动力电机驱动、转 向舵机控制以及控制算法等, 向舵机控制以及控制算法等,完 成智能车工程制作及调试。 成智能车工程制作及调试。
‘飞思卡尔’智能车简介
大赛组委会统一规定了车模和赛道标准, 大赛组委会统一规定了车模和赛道标准, 并且主要以速度为评判标准: 并且主要以速度为评判标准:
飞思卡尔MC9S12XEP芯片的CAN总线代码
#define CAN_GLOBALS#include "can.h"void EEC1_Process(uint8_t OutPtr, uint8_t InPtr);void EEC2_Process(uint8_t OutPtr, uint8_t InPtr);void EEC3_Process(uint8_t OutPtr, uint8_t InPtr);void ET1_Process(uint8_t OutPtr, uint8_t InPtr);void CCVS_Process(uint8_t OutPtr, uint8_t InPtr);void LFE_Process(uint8_t OutPtr, uint8_t InPtr);void AMB_Process(uint8_t OutPtr, uint8_t InPtr);void IC1_Process(uint8_t OutPtr, uint8_t InPtr);void VEP1_Process(uint8_t OutPtr, uint8_t InPtr);void EFL_P1_Process(uint8_t OutPtr, uint8_t InPtr);void LFC_Process(uint8_t OutPtr, uint8_t InPtr);void Digit2Ascii1(uint32_t Digit, uint8_t InPtr); //一位小数void Digit2Ascii0(uint32_t Digit, uint8_t InPtr); //数字转化为ASCII码 0位小数void Digit2AsciiPos0(uint32_t Digit, uint8_t InPtr); //数字转化为ASCII码 0位小数负数uint8_t *Result;HMI_Text_Dis_tPtr HMI_Text_DisPtr;///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------void CANFilterInit(uint8_t CAN){if(CAN<CANS){switch(CAN){case CAN0:CAN0IDAR0 = 0xFF;CAN0IDAR1 = 0xFF; CAN0IDAR2 = 0xFF; CAN0IDAR3 = 0xFF; CAN0IDMR0 = 0xFF; CAN0IDMR1 = 0xFF; CAN0IDMR2 = 0xFF; CAN0IDMR3 = 0xFF; CAN0IDAR4 = 0xFF; CAN0IDAR5 = 0xFF; CAN0IDAR6 = 0xFF; CAN0IDAR7 = 0xFF; CAN0IDMR4 = 0xFF; CAN0IDMR5 = 0xFF; CAN0IDMR6 = 0xFF; CAN0IDMR7 = 0xFF; break;case CAN1:CAN1IDAR0 = 0xFF; CAN1IDAR1 = 0xFF; CAN1IDAR2 = 0xFF; CAN1IDAR3 = 0xFF; CAN1IDMR0 = 0xFF; CAN1IDMR1 = 0xFF; CAN1IDMR2 = 0xFF; CAN1IDMR3 = 0xFF; CAN1IDAR4 = 0xFF; CAN1IDAR5 = 0xFF; CAN1IDAR6 = 0xFF; CAN1IDAR7 = 0xFF; CAN1IDMR4 = 0xFF; CAN1IDMR5 = 0xFF; CAN1IDMR6 = 0xFF; CAN1IDMR7 = 0xFF; break;}}}/*--------------------------------------------------------------------------------------------------------Function:Param:Return:note----------------------------------------------------------------------------------------------------------*/void CANRxQueInit(void){CAN_RxQue.Front = 0;CAN_RxQue.Rear = 0;memset(&CAN_RxQue, 0, sizeof(CAN_RxQue));}/*--------------------------------------------------------------------------------------------------------Function: CAN0 CAN1初始化Param:Return:note----------------------------------------------------------------------------------------------------------*/CAN_EXT void CANInit(uint8_t CAN){if(CAN<CANS){switch(CAN){case CAN0:CAN0CTL1_CANE = 1; //使能CAN模块CAN0CTL1_LISTEN = 0; //除能监听模式CAN0BTR0 = CAN0BTR0_Val; //设置波特率CAN0BTR1 = CAN0BTR1_Val;CANFilterInit(CAN0); //设置验收、屏蔽滤波器CAN0CTL0_INITRQ = 0; //请求退出初始化while(CAN0CTL1_INITAK == 1){ //请求处理ing _asm(nop);}while(CAN0CTL0_SYNCH == 0){_asm(nop);}CAN0RFLG = 0xC3; //清除接收相关标志位CANRxQueInit(); //CAN中断接收队列CAN0RIER_RXFIE = 1; //接收中断允许break;case CAN1:CAN1CTL1_CANE = 1; //使能CAN模块CAN1CTL1_LISTEN = 0; //除能监听模式CAN1BTR0 = CAN1BTR0_Val; //设置波特率CAN1BTR1 = CAN1BTR1_Val;CANFilterInit(CAN1); //设置验收、屏蔽滤波器CAN1CTL0_INITRQ = 0; //请求退出初始化while(CAN1CTL1_INITAK == 1){ //请求处理ing _asm(nop);}while(CAN1CTL0_SYNCH == 0){_asm(nop);}CAN1RFLG = 0xC3; //清除接收相关标志位CANRxQueInit(); //CAN中断接收队列CAN1RIER_RXFIE = 1; //接收中断允许break;}}}/*----------------------------------------------------------------------------------------------------------Function:存储并显示把CAN_RxQue 队列里的数据存放到 FLASH 中,某些数据再存到HMI_Text_Dis_Que 队列里进行显示其中 CAN_RxQue 的ID转换为 PGNTmp 再转换为 HMI_Text_Dis_Que 显示的位置CAN_RxQue 的数据即 HMI_Text_Dis_Que 的数据起始帧命令帧终止帧都已包含Param:Return:note----------------------------------------------------------------------------------------------------------*/CAN_EXT void CANRxQueToProcess(void){ID_tPtr IDPtr;uint32_t PGNTmp;while(CAN_RxQue.Front!= CAN_RxQue.Rear) //源队列未空,可出列{IDPtr = &(CAN_RxQue.PDUs[CAN_RxQue.Front].Bits.ID); //指向出列项ID 域PGNTmp = 0;PGNTmp |= (uint8_t)(IDPtr->Bits.DP | IDPtr->Bits.R<<1);//析取DP和RPGNTmp <<= 8;PGNTmp |= (uint8_t)(IDPtr->Bits.PF0 | IDPtr->Bits.PF1<<2 | IDPtr->Bits.PF2<<5); //析取PFPGNTmp <<= 8;PGNTmp |= (uint8_t)(IDPtr->Bits.PS0 | IDPtr->Bits.PS1<<7);//析取PSif(PGNTmp == (uint16_t)PGN_FAULT_MEMORY){FAULT_flag = 1;}else{FAULT_flag = 0;}switch(PGNTmp){case (uint16_t)PGN_EEC1:EEC1_Process(CAN_RxQue.Front, HMI_Text_Dis_Que.Rear); break;case (uint16_t)PGN_EEC2:EEC2_Process(CAN_RxQue.Front, HMI_Text_Dis_Que.Rear); break;case (uint16_t)PGN_EEC3:EEC3_Process(CAN_RxQue.Front, HMI_Text_Dis_Que.Rear); break;case (uint16_t)PGN_AMB:AMB_Process(CAN_RxQue.Front, HMI_Text_Dis_Que.Rear); break;case (uint16_t)PGN_CCVS:CCVS_Process(CAN_RxQue.Front, HMI_Text_Dis_Que.Rear);break;case (uint16_t)PGN_ET1:ET1_Process(CAN_RxQue.Front, HMI_Text_Dis_Que.Rear); break;case (uint16_t)PGN_LFE:LFE_Process(CAN_RxQue.Front, HMI_Text_Dis_Que.Rear); break;case (uint16_t)PGN_EFL_P1:EFL_P1_Process(CAN_RxQue.Front, HMI_Text_Dis_Que.Rear); break;case (uint16_t)PGN_IC1:IC1_Process(CAN_RxQue.Front, HMI_Text_Dis_Que.Rear); break;case (uint16_t)PGN_VEP1:VEP1_Process(CAN_RxQue.Front, HMI_Text_Dis_Que.Rear); break;case (uint16_t)PGN_LFC: // 时间太大目前只能计算两个字节的LFC_Process(CAN_RxQue.Front, HMI_Text_Dis_Que.Rear);break;case (uint16_t)PGN_FAULT_MEMORY:FAULT_MEMORY_Process(CAN_RxQue.Front, HMI_Text_Dis_Que.Rear, 0, 0); //为了方便触摸屏看故障类型上下条时使用break;default:break;}CAN_RxQue.Front = (uint8_t)(CAN_RxQue.Front+1)%CAN_RXQUE_LEN;//出列一项}CANRxQueInit();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------void EEC1_Process(uint8_t OutPtr, uint8_t InPtr){uint32_t engspeed;uint32_t actualengtorque;eec1 = (EEC1_t *)CAN_RxQue.PDUs[OutPtr].Bits.DataField;engspeed = (((uint32_t)swab16(eec1->EngSpeed))*12) +(((uint32_t)swab16(eec1->EngSpeed))>>1);actualengtorque = ((uint32_t)(eec1->ActualEngTorque)) * 100;if(HMI_Text_Dis_Que.Front !=(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN) {HMI_Text_DisPtr = HMI_Text_Dis_Que.HMI_Text_Dis +HMI_Text_Dis_Que.Rear;HMI_Text_DisPtr->CMD_Start = HMI_CMD_START;HMI_Text_DisPtr->CMD_Type = HMI_CMD_TextDIS_ASCII;HMI_Text_DisPtr->Start_Point.x = 145;HMI_Text_DisPtr->Start_Point.y = 150;Digit2Ascii0(engspeed, InPtr);HMI_Text_DisPtr->CMD_End = HMI_CMD_END;HMI_Text_Dis_Que.Rear =(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN;}if(HMI_Text_Dis_Que.Front !=(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN) {HMI_Text_DisPtr = HMI_Text_Dis_Que.HMI_Text_Dis + HMI_Text_Dis_Que.Rear;HMI_Text_DisPtr->Cmd_Start = HMI_CMD_START;HMI_Text_DisPtr->Cmd_Type = HMI_CMD_TEXTDIS_ASCII;HMI_Text_DisPtr->Start_Point.x = 590;HMI_Text_DisPtr->Start_Point.y = 150;if(actualengtorque<12500){actualengtorque = 12500 - actualengtorque;Digit2AsciiPos0(actualengtorque, HMI_Text_Dis_Que.Rear);}else{actualengtorque = actualengtorque - 12500;Digit2Ascii0(actualengtorque, HMI_Text_Dis_Que.Rear);}HMI_Text_DisPtr->Cmd_End = HMI_CMD_END;HMI_Text_Dis_Que.Rear =(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN; //进列一项}Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------void EEC2_Process(uint8_t OutPtr, uint8_t InPtr){uint32_t accpedalpos1;eec2 = (EEC2_t *)CAN_RxQue.PDUs[OutPtr].Bits.DataField;accpedalpos1 = ((uint32_t)(eec2->accpedalPos1)) * 40;if(HMI_Text_Dis_Que.Front !=(HMI_Text_Dis_Que.Rear+1)%HMI_TextDIS_QUELEN) //目的队列未满,可入列{HMI_Text_DisPtr = HMI_Text_Dis_Que.HMI_Text_Dis +HMI_Text_Dis_Que.Rear; //指向入列项HMI_Text_DisPtr->CMD_Start = HMI_CMD_START; //写入命令头HMI_Text_DisPtr->CMD_Type = HMI_CMD_TEXTDIS_ASCII; //写入命令种类HMI_Text_DisPtr->Start_Point.x = 145; //文本显示位置x坐标HMI_Text_DisPtr->Start_Point.y = 315; //文本显示位置y坐标Digit2Ascii0(accpedalpos1, InPtr); //%HMI_Text_DisPtr->CMD_End = HMI_CMD_END;HMI_Text_Dis_Que.Rear =(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN; //进列一项}Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------void EEC3_Process(uint8_t OutPtr, uint8_t InPtr){eec3 = (EEC3_t *)CAN_RxQue.PDUs[OutPtr].Bits.DataField;Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------void ET1_Process(uint8_t OutPtr, uint8_t InPtr){uint32_t engcoolanttemp;et1 = (ET1_t *)CAN_RxQue.PDUs[OutPtr].Bits.DataField;engcoolanttemp = ((uint32_t)(et1->EngCoolantTemp)) *100;if(HMI_Text_Dis_Que.Front !=(HMI_Text_Dis_Que.Rear+1)%HMI_TextDIS_QUELEN) //目的队列未满,可入列{HMI_Text_DisPtr = HMI_Text_Dis_Que.HMI_Text_Dis +HMI_Text_Dis_Que.Rear; //指向入列项HMI_Text_DisPtr->CMD_Start = HMI_CMD_START; //写入命令头HMI_Text_DisPtr->CMD_Type = HMI_CMD_TEXTDIS_ASCII; //写入命令种类HMI_Text_Dis_Que.HMI_Text_Dis[InPtr].Start_Point.x = 145; //文本显示位置x坐标HMI_Text_Dis_Que.HMI_Text_Dis[InPtr].Start_Point.y = 390;if(engcoolanttemp<4000){engcoolanttemp = 4000 - engcoolanttemp;Digit2AsciiPos0(engcoolanttemp, InPtr);}else{engcoolanttemp = engcoolanttemp - 4000;Digit2Ascii0(engcoolanttemp, InPtr);}HMI_Text_DisPtr->CMD_End = HMI_CMD_END;HMI_Text_Dis_Que.Rear =(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN; //进列一项}Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------void CCVS_Process(uint8_t OutPtr, uint8_t InPtr){uint32_t vehiclespeed;ccvs = (CCVS_t *)CAN_RxQue.PDUs[OutPtr].Bits.DataField;vehiclespeed = (((uint32_t)swab16(ccvs->VehicleSpeed)) * 100) >> 8;if(HMI_Text_Dis_Que.Front !=(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN) //目的队列未满,可入列{HMI_Text_DisPtr = HMI_Text_Dis_Que.HMI_Text_Dis +HMI_Text_Dis_Que.Rear; //指向入列项HMI_Text_DisPtr->CMD_Start = HMI_CMD_START; //写入命令头HMI_Text_DisPtr->CMD_Type = HMI_CMD_TEXTDIS_ASCII; //写入命令种类HMI_Text_DisPtr->Start_Point.x = 370; //文本显示位置x坐标HMI_Text_DisPtr->Start_Point.y = 150; //文本显示位置y坐标Digit2Ascii1(vehiclespeed, InPtr); //%HMI_Text_DisPtr->CMD_End = HMI_CMD_END;HMI_Text_Dis_Que.Rear =(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN; //进列一项}Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------void LFE_Process(uint8_t OutPtr, uint8_t InPtr){uint32_t engfuelrate;lfe = (LFE_t *)CAN_RxQue.PDUs[OutPtr].Bits.DataField;engfuelrate = ((uint32_t)swab16(lfe->EngFuelRate)) * 5;if(HMI_Text_Dis_Que.Front !=(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN) {HMI_Text_DisPtr = HMI_Text_Dis_Que.HMI_Text_Dis +HMI_Text_Dis_Que.Rear;HMI_Text_DisPtr->Cmd_Start = HMI_CMD_START;HMI_Text_DisPtr->Cmd_Type = HMI_CMD_TEXTDIS_ASCII;HMI_Text_DisPtr->Start_Point.x = 370;HMI_Text_DisPtr->Start_Point.y = 365;Digit2Ascii0(engfuelrate, InPtr);HMI_Text_DisPtr->Cmd_End = HMI_CMD_END;HMI_Text_Dis_Que.Rear =(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN; //进列一项}Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------static void AMB_Process(uint8_t OutPtr, uint8_t InPtr){amb = (AMB_t *)CAN_RxQue.PDUs[OutPtr].Bits.DataField;Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------void IC1_Process(uint8_t OutPtr, uint8_t InPtr){uint32_t engintakemanifold1temp; // 进气温度uint32_t engairinletpressure; //绝对增压压力ic1 = (IC1_t *)CAN_RxQue.PDUs[OutPtr].Bits.DataField;engintakemanifold1temp = ((uint32_t)(ic1->EngIntakeManifold1Temp)) * 100;engairinletpressure = ((uint32_t)(ic1->EngAirInletPressure)) * 200;if(HMI_Text_Dis_Que.Front !=(HMI_Text_Dis_Que.Rear+1)%HMI_TextDIS_QUELEN) //目的队列未满,可入列{HMI_Text_DisPtr = HMI_Text_Dis_Que.HMI_Text_Dis +HMI_Text_Dis_Que.Rear; //指向入列项HMI_Text_DisPtr->CMD_Start = HMI_CMD_START; //写入命令头HMI_Text_DisPtr->CMD_Type = HMI_CMD_TEXTDIS_ASCII; //写入命令种类HMI_Text_DisPtr->Start_Point.x = 370; //文本显示位置x坐标HMI_Text_DisPtr->Start_Point.y = 255;if(engintakemanifold1temp<4000){engintakemanifold1temp = 4000 - engintakemanifold1temp;Digit2AsciiPos0(engintakemanifold1temp, InPtr);}else{engintakemanifold1temp = engintakemanifold1temp - 4000;Digit2Ascii0(engintakemanifold1temp, InPtr);}HMI_Text_DisPtr->CMD_End = HMI_CMD_END;HMI_Text_Dis_Que.Rear =(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TextDIS_QUELEN; //进列一项}if(HMI_Text_Dis_Que.Front !=(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN) {HMI_Text_DisPtr = HMI_Text_Dis_Que.HMI_Text_Dis +HMI_Text_Dis_Que.Rear;HMI_Text_DisPtr->CMD_Start = HMI_CMD_START;HMI_Text_DisPtr->Cmd_Type = HMI_CMD_TEXTDIS_ASCII;HMI_Text_DisPtr->Start_Point.x = 590;//590HMI_Text_DisPtr->Start_Point.y = 255;Digit2Ascii0(engairinletpressure, HMI_Text_Dis_Que.Rear);HMI_Text_DisPtr->Cmd_End = HMI_CMD_END;HMI_Text_Dis_Que.Rear =(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN; //进列一项}Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------void VEP1_Process(uint8_t OutPtr, uint8_t InPtr){uint32_t batterybotentialswitched;vep1 = (VEP1_t *)CAN_RxQue.PDUs[OutPtr].Bits.DataField;batterybotentialswitched = ((uint32_t)swab16(vep1->BatteryPotentialSwitched))*5;if(HMI_Text_Dis_Que.Front !=(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN) {HMI_Text_DisPtr = HMI_Text_Dis_Que.HMI_Text_Dis +HMI_Text_Dis_Que.Rear;HMI_Text_DisPtr->Cmd_Start = HMI_CMD_START;HMI_Text_DisPtr->Cmd_Type = HMI_CMD_TEXTDIS_ASCII;HMI_Text_DisPtr->Start_Point.x = 590;HMI_Text_DisPtr->Start_Point.y = 365;Digit2Ascii1(batterybotentialswitched, InPtr);HMI_Text_DisPtr->Cmd_End = HMI_CMD_END;HMI_Text_Dis_Que.Rear =(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TextDIS_QUELEN;}Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------void EFL_P1_Process(uint8_t OutPtr, uint8_t InPtr){uint32_t engoilpressure;efl_p1 = (EFL_P1_t *)CAN_RxQue.PDUs[OutPtr].Bits.DataField;engoilpressure = ((uint32_t)(efl_p1->EngOilPressure)) * 400;if(HMI_Text_Dis_Que.Front !=(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN) //目的队列未满,可入列{HMI_Text_DisPtr = HMI_Text_Dis_Que.HMI_Text_Dis +HMI_Text_Dis_Que.Rear; //指向入列项HMI_Text_DisPtr->CMD_Start = HMI_CMD_START; //写入命令头HMI_Text_DisPtr->CMD_Type = HMI_CMD_TEXTDIS_ASCII; //写入命令种类HMI_Text_DisPtr->Start_Point.x = 145; //文本显示位置x坐标HMI_Text_DisPtr->Start_Point.y = 230; //文本显示位置y坐标Digit2Ascii0(engoilpressure, InPtr);HMI_Text_DisPtr->Cmd_End = HMI_CMD_END;HMI_Text_Dis_Que.Rear =(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN; //进列一项}Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------void LFC_Process(uint8_t OutPtr, uint8_t InPtr){uint32_t engtotalfuelused;lfc = (LFC_t *)CAN_RxQue.PDUs[OutPtr].Bits.DataField;engtotalfuelused = ((uint32_t)swab32(lfc->EngTotalFuelUsed))>>1 ;if(HMI_Text_Dis_Que.Front !=(HMI_Text_Dis_Que.Rear+1)%HMI_TextDIS_QUELEN) //目的队列未满,可入列{HMI_Text_DisPtr = HMI_Text_Dis_Que.HMI_Text_Dis +HMI_Text_Dis_Que.Rear; //指向入列项HMI_Text_DisPtr->CMD_Start = HMI_CMD_START; //写入命令头HMI_Text_DisPtr->CMD_Type = HMI_CMD_TEXTDIS_ASCII; //写入命令种类HMI_Text_DisPtr->Start_Point.x = 125; //文本显示位置x坐标HMI_Text_DisPtr->Start_Point.y = 220; //文本显示位置y坐标Digit2Ascii1(engtotalfuelused, InPtr);HMI_Text_DisPtr->Cmd_End = HMI_CMD_END;HMI_Text_Dis_Que.Rear =(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN; //进列一项}Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------CAN_EXT void FAULT_MEMORY_Process(uint8_t OutPtr, uint8_t InPtr, uint8_t Touch_flag, uint16_t num){uint16_t Fault_Type;uint8_t error1[]="安全晶体管电磁阀阵列1(高边)故障"; uint8_t error2[]="安全晶体管电磁阀阵列1(低边)故障"; uint8_t error3[]="安全晶体管电磁阀阵列3(高边)故障"; uint8_t error4[]="存储器控制错误";uint8_t error5[]="看门狗控制错误";uint8_t error6[]="处理器控制错误";uint8_t error7[]="TRAP控制错误";uint8_t error8[]="5V电压控制错误";uint8_t error9[]="12V传感器电压控制错误";uint8_t error10[]="12.5V电压控制错误";uint8_t error11[]="24V电压错误";uint8_t error12[]="nvSRAM控制错误";uint8_t error13[]="nvSRAM数据控制错误";uint8_t error14[]="CAN接口初始化错误";uint8_t error15[]="SEAJ1939协议错误";uint8_t error16[]="传感器电缆堵塞";uint8_t error17[]="温度传感器。
(整理)飞思卡尔8位单片机MC9S08JM60开发板实践教程
第一章搭建实验环境系统时钟设置#include "App\Include\App.h"#ifndef _MCG_C#define _MCG_C//oscillator 12MHZ 倍频为24MHZ()先8分频后16倍频void S_MCGInit(void){/* the MCG is default set to FEI mode, it should be change to FBE mode*//************************************************************************** ***********MCGC2[7:6] BDIV总线频率分频因子–选择由MCGC1寄存器中CLKS位决定的时钟源的分频。
这控制总线频率。
00 编码0 –时钟1分频01 编码1 –时钟2分频(复位后默认)10 编码2 –时钟4分频11 编码3 –时钟8分频[5] RANGE频率范围选择–选择外部振荡器或者外部时钟源的频率范围。
1 选择1MHz到16MHz外部振荡器的频率范围。
(1MHz到40MHz的外部时钟电源)的高频率范围0 选择32kHz到100kHz外部振荡器的频率范围。
(32kHz到1MHz的外部时钟电源)的低频率范围[4] HGO高增益振荡器选择–控制外部振荡器操作模式。
1 配置外部振荡器为高增益运行0 配置外部振荡器为低功耗运行[3] LP低功耗选择–控制在忽略模式中FLL(或者PLL)是否为无效1 FLL(或PLL)在忽略模式(低功耗)中为无效的。
0 FLL(或PLL)在忽略模式中为无效的。
[2] EREFS外部参考时钟选择–为外部参考选择时钟源1 选择振荡器0 选择外部时钟源[1] ERCLKEN外部参考时钟使能–使能外部参考时钟作为MCGERCLK1 MCGERCLK激活0 MCGERCLK 无效[0] EREFSTEN外部参考时钟停止使能MCGC2 0b0011 0110 激发外部时钟(晶振)(没有使能)*************************************************************************** ***********/MCGC2=MCGC2_RANGE_MASK|MCGC2_HGO_MASK|MCGC2_EREFS_MASK|MCGC2_ERCLK EN_MASK;while(!MCGSC_OSCINIT);//MCGSC寄存器中OSCINIT(第1位)为1,表示由EREFS位选择的晶振被初始化。
摄像头pid算法思路
基于CCD摄像头智能车分段PID控制算法设计自动寻迹智能车涉及到当前高技术领域内的许多先进技术,其中最主要的是传感技术、路径规划和运动控制。
本课题是以飞思卡尔智能车竞赛为背景,以单片机作为核心控制单元,以摄像头作为路径识别传感器,以直流电机作为小车的驱动装置,以舵机控制小车转向。
车模竞赛的赛道是一个具有特定几何尺寸约束、摩擦系数及光学特性的KT板,其中心贴有对可见光及不可见光均有较强吸收特性的黑色条带作为引导线,宽度为2.5 cm。
在行驶过程中,系统通过摄像头获取前方赛道的图像数据,同时通过测速传感器实时获取智能车的速度,采用路径搜索算法进行寻线判断和速度分析,然后作控制决策,控制转向舵机和直流驱动电机工作。
智能车通过实时对自身运动速度及方向等进行调整来“沿”赛道快速行驶。
本文主要介绍摄像头通过提取赛道黑线信息交予单片机处理,通过单片机输出控制信号控制舵机转向来控制车模的转向,从而很好的自动循迹。
1 总体软硬件结构及思路此智能车辆定位系统用摄像头拍摄车辆前方的赛道,通过MC9S12XS128采样视频信号,获得图像数据。
然后用合适的算法,如跟踪边缘检测算法,分析图像数据,提取目标指引线。
然后,系统根据目标指引线的位置信息,对舵机和电机施以合适的控制。
本智能车运动系统的结构图如图1所示。
因为系统是一个有机的整体,所以需配合好系统的摄像头、控制单片机、电机(包括直流伺服电动机、光电编码器)、舵机和辅助电路(电源板、电机驱动板)等各个部分。
舵机是实时控制车模的转向,是比赛快速性和稳定性的关键,舵机控制有很多的控制算法,如:PID经典控制算法、模糊算法、人工智能算法等。
2 系统程序总体控制流程系统的基本软件流程是:首先,对各功能模块和控制参数进行初始化;然后,通过图像采集模块获取前方赛道的图像数据,同时通过速度传感器模块获取赛车的速度。
采用PID对舵机进行反馈控制。
另外根据检测到的速度,结合速度控制策略,对赛车速度不断进行适当调整,使赛车在符合比赛规则的前提下,沿赛道快速行驶。
第十一届飞思卡尔常见问题解答
00、打开第一个eww文件,第二个为整个工程的代码,一般不用!
1、关于IAR
(1)、使用IAR时出现这种问题
需要右键选择options---linker,改一下路径就可以了,那个icf文件为fire_ROM_K60N512,在程序文件夹里有。
即“第十一届飞思卡尔智能车光电组\build\config files”中的fire_ROM_K60N512然后点确定就可以了。
(2)、下载完程序无法设置断点,只需要把这个勾去掉重新编译下载一次,在重新打一次勾进行编译下载即可。
(3)、有时出现这种问题,缺少ADC的文件夹
原因是路径中没有找到,需要添加该文件所在的文件夹路径,解决办法:添加$PROJ_DIR$\..\..\src\drivers\adc同理,缺少其他文件也是这么解决
(4)、一些常用设置
(5)、使用IAR编译效率快,在IAR中一定要注意各种变量的定义,unsigned char与unsigned short int的使用界限,如果超过了255,就不要用unsigned char了,尤其是在图像采集存到数组中时。
正交解码功能用s16型变量,即typedef short ints16;直接读取即可,就能测出正反转。
2、在直道上小车靠一边跑,多半是安装不正,靠右跑把摄像头靠右掰。
3、加权值的选择,这个其实只要是近小远大就可以了,跑的过于切弯或是其他问题,多是中线没提取好或是有效行判断错误或是P大了。
4、如出现这种现象(白赛道变黑了),是摄像头数据口的排线断了。
摄像头测试验证项目
摄像头测试验证项目摄像头测试验证项目是针对摄像头的性能和功能进行全面测试的过程。
这些测试项目旨在验证摄像头的图像质量、分辨率、对比度、曝光、对焦、白平衡、色彩还原等方面的表现。
以下是一个很全面的摄像头测试验证项目,包含了从硬件到软件各个方面的测试。
1.硬件测试a.检查摄像头外观是否完好,并且没有任何损坏。
b.检查摄像头镜头是否清晰,无灰尘和划痕。
c.检查摄像头组件的连接是否稳定,并确保所有线缆和接口都没有松动。
2.基础功能测试a.测试摄像头是否可以正常启动和关闭。
b.测试摄像头是否可以拍摄照片。
c.测试摄像头是否可以录制视频,并检查录制的视频质量。
d.测试摄像头是否可以进行实时预览。
3.图像质量测试a.测试摄像头的分辨率,包括水平和垂直像素值。
b.测试摄像头的对比度,确保图像中的颜色和明暗部分能够清晰区分。
c.测试摄像头的曝光,确保图像的亮度和细节能够适应不同的光线条件。
d.测试摄像头的对焦功能,确保图像的焦点可以调整到不同的距离。
e.测试摄像头的白平衡,确保图像中的颜色可以准确还原。
f.测试摄像头的色彩还原,确保图像中的色彩饱满且准确。
4.异常场景测试a.测试摄像头在低光条件下的图像质量。
b.测试摄像头在强光条件下的图像质量。
c.测试摄像头在快速移动或晃动的情况下的图像质量。
d.测试摄像头在不同环境光照下的图像质量。
5.功能测试a.测试摄像头是否支持变焦功能,并检查变焦的质量。
b.测试摄像头是否支持HDR(高动态范围)功能,并检查HDR照片的质量。
c.测试摄像头是否支持人脸识别功能,并检查识别准确度和速度。
d.测试摄像头是否支持拍摄连拍照片,并检查连拍效果。
e.测试摄像头是否支持拍摄全景照片,并检查全景效果。
6.厂商特定功能测试a.如果摄像头有特定厂商的拍摄模式(如夜景模式、肖像模式等),测试这些模式的功能和效果。
b.如果摄像头支持特定的智能功能(如自动识别场景、自动优化照片等),测试这些功能的准确度和效果。
飞思卡尔智能车各模块原理及元器件
飞思卡尔智能车各模块原理及元器件在准备比赛的过程中,我们小组成员经过分析讨论,对智能车各模块的元器件使用方面做如下说明:1、传感器模块:路径识别模块是智能车系统的关键模块之一,目前能够用于智能车辆路径识别的传感器主要有光电传感器和CCD/CMOS传感器。
光电传感器寻迹方案的优点是电路简单、信号处理速度快,但是其前瞻距离有限;CCD 摄像头寻迹方案的优点则是可以更远更早地感知赛道的变化,但是信号处理却比较复杂,如何对摄像头记录的图像进行处理和识别,加快处理速度是摄像头方案的难点之一。
在比较了两种传感器优劣之后,考虑到CCD传感器图像处理的困难后,决定选用应用广泛的光电传感器,相信通过选用大前瞻的光电传感器,加之精简的程序控制和较快的信息处理速度,光电传感器还是可以极好的控制效果的,我们使用11个TK-20型号的光电传感器。
2、驱动模块:驱动电路的性能很大程度上影响整个系统的工作性能。
电机驱动电路可以用MC33886驱动芯片或者用MOS管搭建H桥驱动电路。
MC33886体积小巧,使用简单,但由于是贴片的封装,散热面积比较小,长时间大电流工作时,温升较高,如果长时间工作必须外加散热器,而且MC33886的工作内阻比较大,又有高温保护回路,使用不方便。
采用MOS管构成的H桥电路,控制直流电机紧急制动。
用单片机控制MOS管使之工作在占空比可调的开关状态,精确调整电动机转速。
这种电路由于MOS管工作在饱和截止状态,而且还可以选择内阻很小的MOS管,所以效率可以非常高,并且H桥电路可以快速实现转速和方向控制。
MOS管开关速度高,所以非常适合采用PWM调制技术。
所以我们选择了用MOS管搭建H桥驱动电路。
3、电源模块:比赛使用智能车竞赛统一配发的标准车模用7.2V 供电,而单片机系统、路径识别的光电传感器、光电码编码器等均需要5V电源,伺服电机工作电压范围4V到6V(为提高伺服电机响应速度,采用7.2V 供电),直流电机可以使用7.2V 蓄电池直接供电,我们采用的电源有串联型线性稳压电源(LM2940、7805等)和开关型稳压电源(LM2596)两大类。
飞思卡尔智能车摄像头组入门指南
飞思卡尔智能车摄像头组入门指南摄像头摄像头的组成主要分为三部分:镜头、含传感器的处理芯片、外围电路板。
镜头主要就是一个凸透镜,透镜焦距越小越广角,同时桶形失真越严重;焦距越大,视角越窄,透镜越接近理想的“薄透镜”则可忽略桶形失真。
处理芯片将传感器上的电压信号按照已定义的协议输出。
外围电路主要提供电源、稳压、时钟等功能。
摄像头按照信号类型可分为模拟摄像头、数字摄像头两种。
由于单片机普通IO口只能读取数字信号,故对于模拟摄像头要设计模数转换(ATD)。
数字摄像头数据可以直接进单片机。
用模拟摄像头的缺点是要自己设计模数转换电路,同步信号分离电路。
优点是可以自行加入硬件二值化电路,即对某一个像素点只用1、0来表示黑、白。
摄像头按照传感器,可分为CCD、CMOS。
CCD成像质量好,贵。
CMOS 成像质量略差,便宜。
摄像头的选取从尽快实现,缩短开发时间的方面考虑,应购买数字摄像头。
典型的型号是OV7620(该型号是指处理芯片的型号)。
OV7620是CMOS数字摄像头,采用PAL制式,默认隔行扫描,默认YUV颜色空间输出(详见后文)。
长远考虑,应选取CCD模拟摄像头。
一来可以避免高速状态下的运动模糊,二来可以自行设计硬件二值化电路,FIFO电路等,大大降低CPU 运算压力。
摄像头信号协议介绍每秒超过24帧的连续图片即可形成动态的视频。
考虑到我国采用50Hz交流电,为了实现方便,摄像头被设计为每秒25帧,每帧耗时两个周期。
还是为了实现方便,每一帧图片被分为两半,每半帧耗时一个周期。
半帧的划分方式为:奇数行和偶数行各组成半帧。
即通常的电视机,每20ms奇数行的信息刷新一次,接下来20ms偶数行刷新一次,再20ms奇数行刷新一次……。
欧美采用60Hz交流电,摄像头每16.6ms刷新一次,被称为PAL制式。
摄像头拍摄的一帧画面被称为“一场”(field),一场又分为“奇场”和“偶场”,各称“半场”,合称“全场”。
像这样分奇偶场分别刷新的扫描方式被称作“隔行扫描”(interlace),某些摄像头支持“逐行扫描”(progressive),其意自见。
摄像头上位机说明
飞思卡尔智能车无线调试工具说明
1.上位机配置部分,选择相应的串口序号,选择波特率(推荐9600)打开串口即可
其中长为摄像头数据行,宽为列,阈值为进行简单二值化的临界值,如128,则<128显示黑。
上位机支持实时参数显示,支持图像显示,或者同时显示两者。
选中复选框即可。
2.上位机接图像接受部分
左图为原始图像,右图为二值化处理之后图像。
3.实时参数显示
其中,编码器脉冲,电机pwm ,舵机pwm 最
大显示数值为256*256,自定义数据 1234最
大显示数据256.(可用来调整pid 参数)。
4.速度曲线绘图
绘图原理是,每接收到一个编码器数值(实时参数),进行一次绘图,横坐标变化为△X,其他4值为纵坐标显示范围,如果想得到更好的显示效果,根据自身情况,调整横纵坐标即可。
5.下位机SCI初始化(如果代码不可复制,请下载Adobe Reader或SumatraPDF(推荐))
6.下位机发送部分
7.下位机接收部分
8.关于正版
试用版软件程序,功能有所限制,敬请原谅。
正版软件包括以下功能
1.简单二值化图像处理
2.曲线绘图功能全部开始(试用版仅限舵机PWM)
如欲购买正版软件,请访问/,将机器码告予店主即可。
购买用户将得到无限期技术支持和免费版本更新。
支持正版是我开发新版本的动力!谢谢。
飞思卡尔 I.MX6Q-vpu视频编解码
飞思卡尔 I.MX6Q-vpu视频编解码前言对应使用飞思卡尔的vpu进行硬件编解码,你需要配置出你linux 下LTIB环境,导出imx-test中的mxc_vpu_test源码,这方面的内容在之前文档已经说明,可以去查看,这篇文章主要介绍视频采集以及编解码,对于摄像头设备主要有两种,一种是USB摄像头,另一种是摄像头模组,例如:ov5640;本文主要分析这两种视频采集后再编解码。
1、摄像头模组ov5640视频采集编解码如果你是买着天嵌的开发板,那么这方面的驱动都已经有了,如果你是自己编译的内核或者没这个驱动,那么你需要手动去加载,下面这些都需要去加载:insmod ipu_prp_enc.koinsmod ipu_bg_overlay_sdc.koinsmod ipu_fg_overlay_sdc.koinsmod ipu_csi_enc.koinsmod ov5642_camera.koinsmod mxc_v4l2_capture.ko加载完成后,就可以直接用mxc_vpu_test编译出来的mxc_vpu_test.out去进行编解码:./mxc_vpu_test.out -E "-o vpu.h264 -f 2 -w 640 -h 480"//摄像头采集后编码./mxc_vpu_test.out -D "-i vpu.h264 -f 2 -u 1 -w 640 -h 480"//解码对于mxc_vpu_test.out更多的功能,你可以使用mxc_vpu_test.out -help去查看,或者直接去看源码。
2、USB摄像头视频采集编解码对于usb摄像头,只要你的ARM板支持usb摄像头,就会在/dev/下产生设备video*,这就是usb摄像头设备,你可以直接对它操作,对于usb摄像头难的不是驱动,而是飞思卡尔官方代码mxc_vpu_test是不支持usb摄像头的,所以你需要去修改源码来实现对usb摄像头的支持,对于代码的修改,主要有两点:修改v4l2代码适合usb摄像头、把摄像头采集的数据YUV422转为420(NV12)。
飞思卡尔 摄像头dma采集
DMA_TCD0_SLAST = 0;//主循环结束后源地址0回写tcd
DMA_TCD0_DLASTSGA = 0;
DMA_TCD0_DADDR=(uint32)video;//设置目的地址,video数组第一个元素
//disable_irq(91);
void delay(void);
//全局变量
uint16 dma_r_m=0;
uint8 video[21000];//[140][ROW];
//uint16 a[10000], *p=a, *q;
/********************************************************************/
PORT_PCR_REG(PORTA_BASE_PTR, channel-3) = PORT_PCR_MUX(0);
}
ADC_SC1_REG(adcmap,A) |= ADC_SC1_ADCH(channel);
return ADC_R_REG(adcmap, 0);
主程序:
#include "common.h"
//#include "HAL_ADC.h"
#include "liu_adc.h"
#include "uart.h"
#include "HAL_GPIO.h"
#include "dma.h"
//函数定义
void init_pwm(void);
(仅供参考)会议摄像机VISCA协议中控编程控制代码
一、SONY会议摄像机中控编程接线1、SONY摄像头RS-232控制连接方法1、RS-232 Mini-DIN 8-pin的端口定义:2、RS-232的连接方式:(1)电脑或普通的控制键盘和SONY摄像头连接方法:SONY摄像头级联连接方法:2、SONY摄像头RS-422控制连接方法1、RS-422 9-pin的SONY EVI和SRG系列端口定义:2、RS-422 9-pin的SONY BRC系列端口定义:二、SONY摄像头中控编程控制代码上:8X 01 06 01 VV WW 03 01 FF下:8X 01 06 01 VV WW 03 02 FF左:8X 01 06 01 VV WW 01 03 FF右:8X 01 06 01 VV WW 02 03 FF(X表示摄像头的编号,VV代表上下的速度,WW代表左右的速度<0-18>16进制)停止:8X 01 06 01 18 18 03 03 FF焦距近:8X 01 04 07 2P FF(P表示速度<0-7>)焦距远:8X 01 04 07 3P FF存储:8X 01 04 3F 01 0P FF(P表示预置位的序号)调用:8X 01 04 3F 02 0P FF级联命令:88 01 00 01 FF 88 30 01 FF 81 09 00 02 FF 81 09 00 02 FF(多台摄像机串联需发送连接命令以确定每台摄像机的地址位)20个预置位的代码(指向命令):8X 01 06 02 VV WW 0Y 0A 0B 0C 0D 0E 0F 0G 0H 0I FF 8X 01 04 47 0P 0Q 0R 0S FF 位置查询的后11位和0Y 0A 0B 0C 0D 0E 0F 0G 0H 0I FF一一对应,焦距查询的后5位和0P 0Q 0R 0S FF一一对应。
查询地址码:8X 09 06 12 FF查询焦距地址:8X 09 04 47 FF1到16个用本身摄像头的预置位代码,17到20个预置位用查询代码查出预置位代码编入中控就可以。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TFLG1=0xFF; //清中断标志位
}
/***************************************************
** 函数名称: IO_Init
/*************************************************************/
void Init_pwm(void)
{
PWMPRCLK = 0x31; //A时钟和B时钟的分频系数为2和15,频率为40MHz和10MHz
PWMCTL_CON01= 1; //联结通道0,1为16位的PWM
PWMPOL_PPOL1= 1; //通道01的极性为高电平有效
PWMSCLA = 5; //SA时钟频率为4MHz
PWMCLK =0x22; //通道01 45 用SA时钟作为时钟源
#define ROW_START 10
#define ROW_MAX 200
#define THRESHOLD 0x7D
unsigned char Buffer[ROW][COLUMN]={0};
char image_left[ROW]={0};
char image_right[ROW]={0};
POSTDIV=0x00; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=160MHz;
_asm(nop); //BUS CLOCK=80M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
1688,1670,1650,1635,1625,1610,1595,1580,1565,1550,1535,1520,1510,
1500,1500,1500,1500,
1490,1480,1465,1450,1440,1430,1415,1400,1390,1380,1350,1330,1300,
CLKSEL=0X00; //disengage PLL to system
PLLCTL_PLLON=1; //turn on PLL
SYNR =0xc0 | 0x09;
REFDV=0x80 | 0x01;
#include <hidef.h>
#include "derivative.h"
#include <mc9s12xs128.h>
/*************************************************************/
};
/*************************************************************/
/* 舵机电机变量定义 */
** 功能描述: IO 口初始化函数
** 说明:
****************************************************/
190,190,190,190,
140,130,120,110,100,90,80,70,60,50,40,30,20,
}; //定每场采哪几行。 根据像素决定。上面下面采到0了说明超出像素了
unsigned int duoji[]={
77,81,85,89,94,99,105,111,117,123,129,135,141,147,153,159,166,173,180,187,194,/*
194,201,208,215,222,229,236 */
/*************************************************************/
unsigned char Dianji_data;
unsigned char Dianji_data1;
unsigned int Duoji_data;
/***************************************************
}
/***************************************************
** 函数名称: TIM_Init
** 功能描述: 行场中断初始化函数
** 说明:பைடு நூலகம்
****************************************************/
}
/*************************************************************/
/************************舵机控制子函数*************************/
void PWMDuo_Duty(int duo_duty)
};
unsigned int dianji[]={
20,30,40,50,60,70,80,90,100,110,120,130,140,
unsigned int Line;
unsigned int hang;
unsigned int zuo_danxian=1,you_danxian=1;
unsigned int get_n[]={
17,19,21,23,25,28,31,34,37,40,43,46,49,53,57, 61,65,69,73,
/* 摄像头初始化 */
/*************************************************************/
#define ROW 40
#define COLUMN 120
PWMPER01 = 200; //通道01的周期为20KHz
PWMDTY01 = 0; //通道01的占空比为10%
PWME_PWME1 = 1; //使能通道01
PWMCTL_CON45= 1; //联结通道0,1为16位的PWM
PWMPOL_PPOL5= 1; //通道01的极性为高电平有效
char image_center[ROW]={0};
char image_piancha[ROW]={0};
unsigned char SampleFlag=0; //奇偶场标记
unsigned char availFlag=0; //有效场标记
unsigned int m=0;
void TIM_Init(void)
{
TIOS=0x00; //外部输入捕捉0,1通道
TCTL4=0x09; //通道0 上升沿触发,通道1下降沿触发
TSCR1=0x80; //使能
PWME_PWME3=0x00; // Disable PWM (PP3) 禁止
PWMCTL_CON23=1; //2,3级联,寄存器为通道3的
PWMCAE_CAE3=0; //通道3左对齐
PWMCNT23=0; // 计时器清零
PWMPOL_PPOL3=1; // 先置高电平,DYT反
{
PWMDTY23=duo_duty;
PWME_PWME3=1; // Enable PWM3使能
}
/*************************************************************/
/* 占空比子函数,PID调速入口 */
** 函数名称: PLL_Init
** 功能描述: 时钟初始化函数
** 说明:
****************************************************/
void PLL_Init(void) { //80m时钟频率
PWMSCLB=5; //COLCK SB进行16分频
PWMDTY23=1500; // 舵机静止占空比为7.5%=1500/20000
PWMPER23=20000; //周期20MS
PWMCLK_PCLK3=1; // CLOCK SB 作时钟源
PWME_PWME3=1;
/*************************************************************/
void PWMdian_Duty(unsigned char duty,unsigned char duty1) {
PWMDTY01=duty;
PWMDTY45=duty1;
PWMSCLA = 5; //SA时钟频率为4MHz
//通道01用SA时钟作为时钟源
PWMPER45 = 200; //通道01的周期为20KHz
PWMDTY45 = 0; //通道01的占空比为10%
PWME_PWME5 = 1; //使能通道01
CLKSEL_PLLSEL =1; //engage PLL to system;
}
/*************************************************************/
/* 初始化PWM */