找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1909|回复: 0
收起左侧

飞思卡尔B车摄像头程序

[复制链接]
ID:280214 发表于 2018-12-1 13:26 | 显示全部楼层 |阅读模式
十三届飞思卡尔B车程序开源

单片机源程序如下:
  1. //作者:
  2. //说明:saomiao文件下有一个lkcongzhongjiansaomiao()函数是图像处理函数,偏差处理以及舵机控制均在此文件下
  3. //duoji_dianji文件下都是速度控制的相关程序,核心程序就是这两个文件
  4. #include "common.h"
  5. #include "include.h"
  6. #include "math.h"
  7. #include "saomiao.h"
  8. uint8 imgbuff[CAMERA_SIZE];     
  9. int currentzhongjian[60];
  10. int right_heixian[60];
  11. int left_heixian[60];
  12. int quanjuCount;
  13. int OutData[4],tuoluoyivar;
  14. int star_lineflag=0;
  15. int LK_jishi=0;
  16. int LK_jishi_flag=0;
  17. int LK_yanshi=0,zhidao_flag,yunsu_flag,yuzhi;
  18. extern int podao_flag,zhangai_right,zhangai_left,qvlv_quanju,duandian,mubiao_speed,dawan_speed,qulv_jinduan;
  19. extern void  lukuangudge();
  20. char go=0,S1,S,zhichong_flag;
  21. extern char lcd_show_enable1;

  22. //s16 speed_a;
  23. extern int my_piancha;
  24. int zhangaijishiright_flag=0,zhangaijishileft_flag=0;
  25. //int kp=22,kd=10,right_heixian[60],lastpiancha_1,duojijiaodu,left_heixian[60],my_lastzhongjian=40,currentzhongjianzhi=40,rightheixian_flag,leftheixian_flag,xielv;
  26. //函数声明
  27. void PORTA_IRQHandler();
  28. void DMA0_IRQHandler();
  29. void PIT0_IRQHandler();
  30. void Priority_Set();
  31. extern char s_wan_flag;
  32. char pof;
  33. //void PIT1_IRQHandler();
  34. /*!
  35. *  @brief      main函数
  36. *  @since      v5.3
  37. *  @note       山外 DMA 采集摄像头 实验
  38.                 注意,此例程 bus频率设为100MHz(50MHz bus频率会太慢而导致没法及时采集图像)

  39.                 此例程使用的上位机为【山外多功能调试助手】
  40.                 具体资料请参考:山外多功能调试助手资料专辑
  41.       
  42. */
  43. void hecheng()//虚拟中线函数
  44. {
  45. unsigned int ji;
  46. for(ji=0;ji<=59;ji++)
  47.       {
  48.        imgyiwei[ji][currentzhongjian[ji]]=0 ;
  49.       }
  50. }
  51. void sendimg(uint8 *imgaddr,uint32 imgsize)
  52. {
  53. img_extract((u8 *)imgyiwei, imgbuff,CAMERA_SIZE);      //解压图像
  54. lkcongzhongjiansaomiao();
  55. uint8 cmd[4] = {0, 255, 1, 0 };    //yy_摄像头串口调试 使用的命令
  56. hecheng();
  57. uart_putbuff(VCAN_PORT, cmd, sizeof(cmd));    //先发送命令
  58. uart_putbuff(VCAN_PORT, imgaddr, imgsize); //再发送图像
  59. }




  60. void star_line_judg()//起跑线检测
  61. {
  62. int kk,bai_flag=0,hei_flag=0,heibai_flag=0,baihei_flag=0;
  63.   for(kk=5;kk<=72;kk++)
  64.   {
  65.     if(imgyiwei[45][kk]>0)
  66.       bai_flag=1;
  67.     else
  68.     if(bai_flag&&imgyiwei[45][kk]==0)
  69.     {
  70.       baihei_flag++;
  71.       bai_flag=0;
  72.     }
  73.    
  74.     if(imgyiwei[45][kk]==0)
  75.       hei_flag=1;
  76.     else
  77.     if(hei_flag&&imgyiwei[45][kk]>0)
  78.     {
  79.       heibai_flag++;
  80.       hei_flag=0;
  81.     }
  82.       
  83.   }
  84.   if(baihei_flag>=4&&heibai_flag>=4&&baihei_flag-heibai_flag<=2)
  85.     star_lineflag=1;
  86. }


  87. void lkzhongjian()
  88. {
  89.   unsigned int i;
  90. for(i=0;i<=59;i++)
  91.   {
  92.     imgyiwei[i][currentzhongjian[i]]=0;

  93.   }


  94. }
  95. /*void sendimg(uint8 *imgaddr,uint32 imgsize)
  96. {

  97.     uint8 cmd[4] = {0, 255, 1, 0 };    //yy_摄像头串口调试 使用的命令
  98. //hecheng();
  99.     uart_putbuff(VCAN_PORT, cmd, sizeof(cmd));    //先发送命令

  100.    uart_putbuff(VCAN_PORT, imgaddr, imgsize); //再发送图像
  101.        // uart_putbuff(VCAN_PORT, currentzhongjian, 60); //再发送图像
  102. }*/
  103. //**************************************************************************
  104. /*
  105. *  功能说明:SCI示波器CRC校验
  106. 内部调用函数
  107. *  参数说明: 无
  108. *  函数返回:无符号结果值
  109. *  修改时间:2013-2-10
  110. */
  111. //**************************************************************************
  112. static unsigned short CRC_CHECK(unsigned char *Buf, unsigned char CRC_CNT)
  113. {
  114.     unsigned short CRC_Temp;
  115.     unsigned char i,j;
  116.     CRC_Temp = 0xffff;

  117.     for (i=0;i<CRC_CNT; i++)
  118.     {
  119.         CRC_Temp ^= Buf[i];
  120.         for (j=0;j<8;j++) {
  121.             if (CRC_Temp & 0x01)
  122.                 CRC_Temp = (CRC_Temp >>1 ) ^ 0xa001;
  123.             else
  124.                 CRC_Temp = CRC_Temp >> 1;
  125.         }
  126.     }
  127.     return(CRC_Temp);
  128. }

  129. //************************************************
  130. //
  131. /*
  132. *  功能说明:SCI示波器发送函数

  133. *  参数说明:
  134. OutData[]  需要发送的数值赋予该数组
  135. *  函数返回:无符号结果值
  136. *  修改时间:2013-2-10
  137. */
  138. //****************************************************
  139. void OutPut_Data(void)
  140. {   
  141.     int temp[4] = {0};
  142.     unsigned int temp1[4] = {0};
  143.     unsigned char databuf[10] = {0};
  144.     unsigned char i;
  145.     unsigned short CRC16 = 0;
  146.     for(i=0;i<4;i++)
  147.     {
  148.         temp[i]  = (int)OutData[i];
  149.         temp1[i] = (unsigned int)temp[i];

  150.     }

  151.     for(i=0;i<4;i++)
  152.     {
  153.         databuf[i*2]   = (unsigned char)(temp1[i]%256);
  154.         databuf[i*  2+1] = (unsigned char)(temp1[i]/256);
  155.     }

  156.     CRC16 = CRC_CHECK(databuf,8);
  157.     databuf[8] = CRC16%256;
  158.     databuf[9] = CRC16/256;

  159.     for(i=0;i<10;i++)
  160.     {
  161.         uart_putchar (UART0,(char)databuf[i]);
  162.     }
  163. }


  164. void SendHex(unsigned char hex) {
  165.   unsigned char temp;
  166.   temp = hex >> 4;
  167.   if(temp < 10) {
  168.     uart_putchar(UART0,temp + '0');
  169.   } else {
  170.     uart_putchar(UART0,temp - 10 + 'A');
  171.   }
  172.   temp = hex & 0x0F;
  173.   if(temp < 10) {
  174.     uart_putchar(UART0,temp + '0');
  175.   } else {
  176.    uart_putchar(UART0,temp - 10 + 'A');
  177.   }
  178. }

  179. void SendImageData(unsigned char ImageData[][80])
  180. {
  181.   

  182.     int lll1,lll2;
  183.     unsigned char crc = 0;
  184. lkcongzhongjiansaomiao();
  185. lkzhongjian();
  186.     /* Send Data */
  187.     uart_putchar(UART0,'*');
  188.     uart_putchar(UART0,'L');
  189.     uart_putchar(UART0,'D');

  190.     SendHex(0);
  191.     SendHex(0);
  192.     SendHex(0);
  193.     SendHex(0);
  194.    
  195.   //  imgyiwei[60][80];

  196.     for(lll2=0;lll2<80;lll2++)
  197.     {
  198.       
  199.       for(lll1=0;lll1<60; lll1++)
  200.         SendHex(ImageData[lll1][lll2]);
  201.     }
  202.    
  203.    
  204.    /* for(ll1=0;ll1<60;ll1++)
  205. {
  206.   for(ll0=0;ll0<80;ll0++)
  207.   {
  208.    if(imgyiwei[ll1][ll0]==0)
  209.       Draw_potL(ll0,ll1,0,1);
  210.     else
  211.       Draw_potL(ll0,ll1,1,1);
  212.   }
  213. }*/
  214.    

  215.     SendHex(crc);
  216.     uart_putchar(UART0,'#');
  217. }
  218. #if 1
  219. //编码器初始化
  220. void FTM_QUAD_init()
  221. {
  222.     /*开启端口时钟*/
  223.     SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK;

  224.     /*选择管脚复用功能*/
  225.    // PORTA_PCR12 = PORT_PCR_MUX(7);
  226.    // PORTA_PCR13 = PORT_PCR_MUX(7);
  227.     PORTA_PCR10 = PORT_PCR_MUX(6);
  228.     PORTA_PCR11 = PORT_PCR_MUX(6);

  229.     /*使能FTM1、FTM2时钟*/
  230.    // SIM_SCGC6|=SIM_SCGC6_FTM1_MASK;
  231.     SIM_SCGC3|=SIM_SCGC3_FTM2_MASK;

  232.   //  FTM1_MOD = 65535; //可根据需要设置
  233.     FTM2_MOD = 65535;

  234.   //  FTM1_CNTIN = 0;
  235.     FTM2_CNTIN = 0;

  236.   //  FTM1_MODE |= FTM_MODE_WPDIS_MASK; //禁止写保护
  237.     FTM2_MODE |= FTM_MODE_WPDIS_MASK; //禁止写保护
  238.   //  FTM1_MODE |= FTM_MODE_FTMEN_MASK; //FTMEN=1,关闭TPM兼容模式,开启FTM所有功能
  239.     FTM2_MODE |= FTM_MODE_FTMEN_MASK; //FTMEN=1,关闭TPM兼容模式,开启FTM所有功能

  240.   //  FTM1_QDCTRL &= ~FTM_QDCTRL_QUADMODE_MASK; //选定编码模式为A相与B相编码模式
  241.   //  FTM1_QDCTRL |= FTM_QDCTRL_QUADEN_MASK; //使能正交解码模式
  242.   //  FTM2_QDCTRL &= ~FTM_QDCTRL_QUADMODE_MASK; //选定编码模式为A相与B相编码模式   0x8u  0x00001000取反即 0x11110111
  243.    FTM2_QDCTRL |= 0x08;//~0x00u;
  244.    
  245.     FTM2_QDCTRL |= FTM_QDCTRL_QUADEN_MASK; //使能正交解码模式
  246. //QUADMODE=1;
  247. //   FTM1_SC |= FTM_SC_CLKS(3);  //选择外部时钟
  248. //   FTM1_CONF |=FTM_CONF_BDMMODE(3); //可根据需要选择
  249.     FTM2_SC |= FTM_SC_CLKS(3);
  250. //   FTM2_CONF |=FTM_CONF_BDMMODE(3);

  251. }
  252. #endif
  253. //**************************************************************************
  254. void  main(void)
  255. {
  256.     DisableInterrupts;
  257.    

  258.     dianji_canshu_init();

  259.     Priority_Set();
  260.     camera_init(imgbuff);                                  //这里设定  imgbuff 为采集缓冲区!!!!!!

  261.    
  262.     ftm_pwm_init(FTM0,FTM_CH4,10000,0);  //电机初始化
  263.     ftm_pwm_init(FTM0,FTM_CH5,10000,0);
  264.    
  265.    
  266.     ftm_pwm_init(FTM1,FTM_CH0,300,4495);//舵机初始化
  267.       
  268.     ftm_quad_init(FTM2);//编码器初始化

  269.    
  270.     pit_init_ms(PIT0,5);//定时器中断5ms
  271.      my_lcd_init();//液晶初始化
  272.    
  273.     set_vector_handler(PIT0_VECTORn,PIT0_IRQHandler);   // 设置中断服务函数到中断向量表里
  274.     enable_irq(PIT0_IRQn);                             // 使能PIT中断
  275.     set_vector_handler(PORTA_VECTORn,PORTA_IRQHandler);    //设置PORTA的中断服务函数为 PORTA_IRQHandler
  276.     set_vector_handler(DMA0_VECTORn,DMA0_IRQHandler);      //设置DMA0的中断服务函数为 DMA0_IRQHandler
  277.     EnableInterrupts;         
  278.   //  adc_init (ADC1_SE4a);
  279.   
  280. //gpio_init(PTE28,GPO,0);//off

  281.   
  282.     while(1)
  283.     {
  284.   //    gpio_init(PTE28,GPO,0);//off
  285.       camera_get_img();
  286.      // my_lcd_show();
  287.      if(LK_jishi_flag==1)
  288.       star_line_judg();
  289.    // lptmr_delay_ms(1000);
  290.     // gpio_init(PTE28,GPO,1);//off
  291. //sendimg((u8 *)imgyiwei, CAMERA_W * CAMERA_H);//我的上位机,不注释为向电脑发送图像
  292.     }
  293. }

  294. /*!
  295. *  @brief      PORTA中断服务函数
  296. *  @since      v5.0
  297. */
  298. void PORTA_IRQHandler()
  299. {
  300.     uint8  n = 0;    //引脚号
  301.     uint32 flag = PORTA_ISFR;
  302.     PORTA_ISFR  = ~0;                                   //清中断标志位

  303.     n = 29;                                             //场中断
  304.     if(flag & (1 << n))                                 //PTA29触发中断
  305.     {
  306.         camera_vsync();
  307.     }
  308. #if 0             //鹰眼直接全速采集,不需要行中断
  309.     n = 28;
  310.     if(flag & (1 << n))                                 //PTA28触发中断
  311.     {
  312.         camera_href();
  313.     }
  314. #endif
  315. }

  316. /*!
  317. *  @brief      DMA0中断服务函数
  318. *  @since      v5.0
  319. */
  320. //void PIT1_IRQHandler()
  321. //{
  322. //shizi_count++;
  323. //}
  324. void DMA0_IRQHandler()
  325. {
  326.     camera_dma();
  327.     img_extract((u8 *)imgyiwei, imgbuff,CAMERA_SIZE);
  328.          

  329. }

  330. void PIT0_IRQHandler(void)//定时器中断服务函数
  331. {
  332. //lcd_show_enable1=0;//注释掉是调用液晶
  333. PIT_Flag_Clear(PIT0);
  334.   if(lcd_show_enable1)//为0跳出液晶
  335.   {
  336.       my_lcd_show();
  337.   }
  338.   else
  339.   {
  340.      /*****************************************************脉冲提取*************************************************************/     
  341.   get_maichong();//获取电机转速
  342.   
  343.      if(LK_jishi_flag==0)
  344.       LK_jishi++;
  345.         if(LK_jishi==300)//起步延时1.5秒
  346.       go=1;//小车前进

  347.    
  348.     if(LK_jishi>=2000)
  349.         {
  350.           LK_jishi_flag=1;
  351.           LK_jishi=2000;
  352.         }



  353. /*****************************************************边线提取*************************************************************/  

  354. lkcongzhongjiansaomiao();//图像处理

  355.    if(star_lineflag==1)
  356.         LK_yanshi++;
  357.    
  358.        if(!star_lineflag&&go)
  359.      {
  360.        if(yunsu_flag==1)
  361.       mubiao_speed=dawan_speed;
  362.       else
  363.         lukuangudge();//路况判断      
  364.      }
  365.        else
  366.        if(LK_yanshi>30)//检测到起跑线
  367.          mubiao_speed=0;
  368.       //if(pof)
  369.         //mubiao_speed=0;
  370.      DSYJ_dianji_PID(mubiao_speed); //控制电机转速
  371.   
  372. /************************************************************************S弯判定****************************************************/  
  373. if(s_wan_flag)
  374. {
  375.     S1=1;
  376.     //s_wan_flag=0;
  377. }
  378. else
  379. {
  380. S=0;
  381. S1=0;
  382. }
  383.    
  384.     if(S1&&S<=25)
  385.       S++;

  386.    if(S>=25)
  387.    {
  388.      zhichong_flag=1;
  389.      //gpio_set(PTE1,1);
  390.    }
  391.    else
  392.    {
  393.      zhichong_flag=0;
  394.      //gpio_set(PTE1,0);
  395.    }
  396.    /*******************************************************坡道处理*****************************************************/  
  397.    // if(abs(my_piancha)<=16&&qvlv_quanju<=10&&duandian<12&&qulv_jinduan<12)
  398.     // tuoluoyivar=adc_once(ADC1_SE4a,ADC_8bit);
  399.    // else
  400.      // tuoluoyivar=104;
  401.    
  402.   /*  if(abs(tuoluoyivar-104)>40&&!podao_flag)
  403.     {
  404.       podao_flag=1;
  405.      // gpio_set(PTE1,1);
  406.     }
  407.     if(podao_flag&&podao_flag<800)
  408.     {
  409. podao_flag++;

  410.     }
  411. else
  412. {
  413. podao_flag=0;
  414. //gpio_set(PTE1,0);
  415. }

  416. if(podao_flag>0&&podao_flag<130)
  417. pof=1;
  418. else
  419. pof=0;*/
  420. /*******************************************************障碍处理*****************************************************/  

  421.     if(zhangai_right==1)
  422.     {
  423.   zhangaijishiright_flag=1;
  424.   zhangai_right=0;
  425.     }
  426.   else if(zhangai_left==1)
  427.   {
  428. zhangaijishileft_flag=1;
  429.    zhangai_left=0;
  430.   }

  431.   
  432.   if(zhangaijishileft_flag&&zhangaijishileft_flag<35)
  433.   {
  434.    zhangaijishileft_flag++;
  435.    // led(LED0, LED_ON);
  436.   }
  437.   else
  438.     if(zhangaijishiright_flag&&zhangaijishiright_flag<35)
  439.     {
  440.     zhangaijishiright_flag++;
  441.     }
  442.   else
  443.     zhangaijishiright_flag=zhangaijishileft_flag=0;
  444. /************************************************************************直道判定*直道判定*****************************************************/  

  445.     if(abs(my_piancha)<=13&&qvlv_quanju<=13&&duandian<10)
  446.     {
  447.       zhidao_flag++;      
  448.     }
  449.     else
  450.     {
  451.       zhidao_flag=0;
  452.     }
  453.     //gpio_turn(PTA17);
  454. /*****************************************************偏差处理*************************************************************/  

  455.   pianchachuli();
  456.    
  457.   }

  458.      
  459. }

  460. void Priority_Set(void)
  461. {
  462. // NVIC_SetPriorityGrouping(4);            //设置优先级分组,4bit 抢占优先级,没有亚优先级

  463.   NVIC_SetPriority(PORTA_IRQn,0);         //配置优先级
  464.   NVIC_SetPriority(DMA0_IRQn,1);          //配置优先级
  465.   NVIC_SetPriority(PIT0_IRQn,2);          //配置优先级

  466. }
复制代码

iar代码下载:
program of B_CAR.7z (680.72 KB, 下载次数: 32)


回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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