久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1898|回復: 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)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品一区二区三区在线播放 | 色接久久| 色婷婷一区| 国产精品久久久久久久久久免费看 | 久久久无码精品亚洲日韩按摩 | 亚洲 欧美 激情 另类 校园 | 亚洲精品国产a久久久久久 午夜影院网站 | 国产精品久久久久久久岛一牛影视 | 一区二区三区在线看 | 91免费看片 | 欧美极品在线播放 | www国产精品 | 在线2区 | 中文字幕在线一区 | 男人亚洲天堂 | 天天射影院| 欧美综合久久 | 自拍偷拍精品 | 在线视频第一页 | 午夜男人视频 | 伊人狠狠干 | 免费一级欧美在线观看视频 | 亚洲一区亚洲二区 | 亚洲免费网站 | 国产成人在线播放 | 久久999| 成人在线一区二区 | 国产在线一区二区 | av一区在线观看 | 暖暖日本在线视频 | 亚洲视频在线观看 | 亚洲国产精选 | 久久久性色精品国产免费观看 | av免费网址 | 精品一区二区三区免费视频 | 拍真实国产伦偷精品 | 午夜电影网址 | av午夜电影| 青青草网站在线观看 | 欧美一级二级在线观看 | 亚洲精久 |