十三屆飛思卡爾B車程序開源
單片機源程序如下:
- //作者:
- //說明:saomiao文件下有一個lkcongzhongjiansaomiao()函數是圖像處理函數,偏差處理以及舵機控制均在此文件下
- //duoji_dianji文件下都是速度控制的相關程序,核心程序就是這兩個文件
- #include "common.h"
- #include "include.h"
- #include "math.h"
- #include "saomiao.h"
- uint8 imgbuff[CAMERA_SIZE];
- int currentzhongjian[60];
- int right_heixian[60];
- int left_heixian[60];
- int quanjuCount;
- int OutData[4],tuoluoyivar;
- int star_lineflag=0;
- int LK_jishi=0;
- int LK_jishi_flag=0;
- int LK_yanshi=0,zhidao_flag,yunsu_flag,yuzhi;
- extern int podao_flag,zhangai_right,zhangai_left,qvlv_quanju,duandian,mubiao_speed,dawan_speed,qulv_jinduan;
- extern void lukuangudge();
- char go=0,S1,S,zhichong_flag;
- extern char lcd_show_enable1;
- //s16 speed_a;
- extern int my_piancha;
- int zhangaijishiright_flag=0,zhangaijishileft_flag=0;
- //int kp=22,kd=10,right_heixian[60],lastpiancha_1,duojijiaodu,left_heixian[60],my_lastzhongjian=40,currentzhongjianzhi=40,rightheixian_flag,leftheixian_flag,xielv;
- //函數聲明
- void PORTA_IRQHandler();
- void DMA0_IRQHandler();
- void PIT0_IRQHandler();
- void Priority_Set();
- extern char s_wan_flag;
- char pof;
- //void PIT1_IRQHandler();
- /*!
- * @brief main函數
- * @since v5.3
- * @note 山外 DMA 采集攝像頭 實驗
- 注意,此例程 bus頻率設為100MHz(50MHz bus頻率會太慢而導致沒法及時采集圖像)
- 此例程使用的上位機為【山外多功能調試助手】
- 具體資料請參考:山外多功能調試助手資料專輯
-
- */
- void hecheng()//虛擬中線函數
- {
- unsigned int ji;
- for(ji=0;ji<=59;ji++)
- {
- imgyiwei[ji][currentzhongjian[ji]]=0 ;
- }
- }
- void sendimg(uint8 *imgaddr,uint32 imgsize)
- {
- img_extract((u8 *)imgyiwei, imgbuff,CAMERA_SIZE); //解壓圖像
- lkcongzhongjiansaomiao();
- uint8 cmd[4] = {0, 255, 1, 0 }; //yy_攝像頭串口調試 使用的命令
- hecheng();
- uart_putbuff(VCAN_PORT, cmd, sizeof(cmd)); //先發送命令
- uart_putbuff(VCAN_PORT, imgaddr, imgsize); //再發送圖像
- }
- void star_line_judg()//起跑線檢測
- {
- int kk,bai_flag=0,hei_flag=0,heibai_flag=0,baihei_flag=0;
- for(kk=5;kk<=72;kk++)
- {
- if(imgyiwei[45][kk]>0)
- bai_flag=1;
- else
- if(bai_flag&&imgyiwei[45][kk]==0)
- {
- baihei_flag++;
- bai_flag=0;
- }
-
- if(imgyiwei[45][kk]==0)
- hei_flag=1;
- else
- if(hei_flag&&imgyiwei[45][kk]>0)
- {
- heibai_flag++;
- hei_flag=0;
- }
-
- }
- if(baihei_flag>=4&&heibai_flag>=4&&baihei_flag-heibai_flag<=2)
- star_lineflag=1;
- }
- void lkzhongjian()
- {
- unsigned int i;
- for(i=0;i<=59;i++)
- {
- imgyiwei[i][currentzhongjian[i]]=0;
- }
-
-
- }
- /*void sendimg(uint8 *imgaddr,uint32 imgsize)
- {
-
- uint8 cmd[4] = {0, 255, 1, 0 }; //yy_攝像頭串口調試 使用的命令
- //hecheng();
- uart_putbuff(VCAN_PORT, cmd, sizeof(cmd)); //先發送命令
- uart_putbuff(VCAN_PORT, imgaddr, imgsize); //再發送圖像
- // uart_putbuff(VCAN_PORT, currentzhongjian, 60); //再發送圖像
- }*/
- //**************************************************************************
- /*
- * 功能說明:SCI示波器CRC校驗
- 內部調用函數
- * 參數說明: 無
- * 函數返回:無符號結果值
- * 修改時間:2013-2-10
- */
- //**************************************************************************
- static unsigned short CRC_CHECK(unsigned char *Buf, unsigned char CRC_CNT)
- {
- unsigned short CRC_Temp;
- unsigned char i,j;
- CRC_Temp = 0xffff;
- for (i=0;i<CRC_CNT; i++)
- {
- CRC_Temp ^= Buf[i];
- for (j=0;j<8;j++) {
- if (CRC_Temp & 0x01)
- CRC_Temp = (CRC_Temp >>1 ) ^ 0xa001;
- else
- CRC_Temp = CRC_Temp >> 1;
- }
- }
- return(CRC_Temp);
- }
- //************************************************
- //
- /*
- * 功能說明:SCI示波器發送函數
- * 參數說明:
- OutData[] 需要發送的數值賦予該數組
- * 函數返回:無符號結果值
- * 修改時間:2013-2-10
- */
- //****************************************************
- void OutPut_Data(void)
- {
- int temp[4] = {0};
- unsigned int temp1[4] = {0};
- unsigned char databuf[10] = {0};
- unsigned char i;
- unsigned short CRC16 = 0;
- for(i=0;i<4;i++)
- {
- temp[i] = (int)OutData[i];
- temp1[i] = (unsigned int)temp[i];
- }
- for(i=0;i<4;i++)
- {
- databuf[i*2] = (unsigned char)(temp1[i]%256);
- databuf[i* 2+1] = (unsigned char)(temp1[i]/256);
- }
- CRC16 = CRC_CHECK(databuf,8);
- databuf[8] = CRC16%256;
- databuf[9] = CRC16/256;
- for(i=0;i<10;i++)
- {
- uart_putchar (UART0,(char)databuf[i]);
- }
- }
- void SendHex(unsigned char hex) {
- unsigned char temp;
- temp = hex >> 4;
- if(temp < 10) {
- uart_putchar(UART0,temp + '0');
- } else {
- uart_putchar(UART0,temp - 10 + 'A');
- }
- temp = hex & 0x0F;
- if(temp < 10) {
- uart_putchar(UART0,temp + '0');
- } else {
- uart_putchar(UART0,temp - 10 + 'A');
- }
- }
- void SendImageData(unsigned char ImageData[][80])
- {
-
- int lll1,lll2;
- unsigned char crc = 0;
- lkcongzhongjiansaomiao();
- lkzhongjian();
- /* Send Data */
- uart_putchar(UART0,'*');
- uart_putchar(UART0,'L');
- uart_putchar(UART0,'D');
- SendHex(0);
- SendHex(0);
- SendHex(0);
- SendHex(0);
-
- // imgyiwei[60][80];
- for(lll2=0;lll2<80;lll2++)
- {
-
- for(lll1=0;lll1<60; lll1++)
- SendHex(ImageData[lll1][lll2]);
- }
-
-
- /* for(ll1=0;ll1<60;ll1++)
- {
- for(ll0=0;ll0<80;ll0++)
- {
- if(imgyiwei[ll1][ll0]==0)
- Draw_potL(ll0,ll1,0,1);
- else
- Draw_potL(ll0,ll1,1,1);
- }
- }*/
-
- SendHex(crc);
- uart_putchar(UART0,'#');
- }
- #if 1
- //編碼器初始化
- void FTM_QUAD_init()
- {
- /*開啟端口時鐘*/
- SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK;
- /*選擇管腳復用功能*/
- // PORTA_PCR12 = PORT_PCR_MUX(7);
- // PORTA_PCR13 = PORT_PCR_MUX(7);
- PORTA_PCR10 = PORT_PCR_MUX(6);
- PORTA_PCR11 = PORT_PCR_MUX(6);
- /*使能FTM1、FTM2時鐘*/
- // SIM_SCGC6|=SIM_SCGC6_FTM1_MASK;
- SIM_SCGC3|=SIM_SCGC3_FTM2_MASK;
- // FTM1_MOD = 65535; //可根據需要設置
- FTM2_MOD = 65535;
- // FTM1_CNTIN = 0;
- FTM2_CNTIN = 0;
- // FTM1_MODE |= FTM_MODE_WPDIS_MASK; //禁止寫保護
- FTM2_MODE |= FTM_MODE_WPDIS_MASK; //禁止寫保護
- // FTM1_MODE |= FTM_MODE_FTMEN_MASK; //FTMEN=1,關閉TPM兼容模式,開啟FTM所有功能
- FTM2_MODE |= FTM_MODE_FTMEN_MASK; //FTMEN=1,關閉TPM兼容模式,開啟FTM所有功能
- // FTM1_QDCTRL &= ~FTM_QDCTRL_QUADMODE_MASK; //選定編碼模式為A相與B相編碼模式
- // FTM1_QDCTRL |= FTM_QDCTRL_QUADEN_MASK; //使能正交解碼模式
- // FTM2_QDCTRL &= ~FTM_QDCTRL_QUADMODE_MASK; //選定編碼模式為A相與B相編碼模式 0x8u 0x00001000取反即 0x11110111
- FTM2_QDCTRL |= 0x08;//~0x00u;
-
- FTM2_QDCTRL |= FTM_QDCTRL_QUADEN_MASK; //使能正交解碼模式
- //QUADMODE=1;
- // FTM1_SC |= FTM_SC_CLKS(3); //選擇外部時鐘
- // FTM1_CONF |=FTM_CONF_BDMMODE(3); //可根據需要選擇
- FTM2_SC |= FTM_SC_CLKS(3);
- // FTM2_CONF |=FTM_CONF_BDMMODE(3);
- }
- #endif
- //**************************************************************************
- void main(void)
- {
- DisableInterrupts;
-
- dianji_canshu_init();
- Priority_Set();
- camera_init(imgbuff); //這里設定 imgbuff 為采集緩沖區!!!!!!
-
- ftm_pwm_init(FTM0,FTM_CH4,10000,0); //電機初始化
- ftm_pwm_init(FTM0,FTM_CH5,10000,0);
-
-
- ftm_pwm_init(FTM1,FTM_CH0,300,4495);//舵機初始化
-
- ftm_quad_init(FTM2);//編碼器初始化
-
- pit_init_ms(PIT0,5);//定時器中斷5ms
- my_lcd_init();//液晶初始化
-
- set_vector_handler(PIT0_VECTORn,PIT0_IRQHandler); // 設置中斷服務函數到中斷向量表里
- enable_irq(PIT0_IRQn); // 使能PIT中斷
- set_vector_handler(PORTA_VECTORn,PORTA_IRQHandler); //設置PORTA的中斷服務函數為 PORTA_IRQHandler
- set_vector_handler(DMA0_VECTORn,DMA0_IRQHandler); //設置DMA0的中斷服務函數為 DMA0_IRQHandler
- EnableInterrupts;
- // adc_init (ADC1_SE4a);
-
- //gpio_init(PTE28,GPO,0);//off
-
- while(1)
- {
- // gpio_init(PTE28,GPO,0);//off
- camera_get_img();
- // my_lcd_show();
- if(LK_jishi_flag==1)
- star_line_judg();
- // lptmr_delay_ms(1000);
- // gpio_init(PTE28,GPO,1);//off
- //sendimg((u8 *)imgyiwei, CAMERA_W * CAMERA_H);//我的上位機,不注釋為向電腦發送圖像
- }
- }
- /*!
- * @brief PORTA中斷服務函數
- * @since v5.0
- */
- void PORTA_IRQHandler()
- {
- uint8 n = 0; //引腳號
- uint32 flag = PORTA_ISFR;
- PORTA_ISFR = ~0; //清中斷標志位
- n = 29; //場中斷
- if(flag & (1 << n)) //PTA29觸發中斷
- {
- camera_vsync();
- }
- #if 0 //鷹眼直接全速采集,不需要行中斷
- n = 28;
- if(flag & (1 << n)) //PTA28觸發中斷
- {
- camera_href();
- }
- #endif
- }
- /*!
- * @brief DMA0中斷服務函數
- * @since v5.0
- */
- //void PIT1_IRQHandler()
- //{
- //shizi_count++;
- //}
- void DMA0_IRQHandler()
- {
- camera_dma();
- img_extract((u8 *)imgyiwei, imgbuff,CAMERA_SIZE);
-
- }
- void PIT0_IRQHandler(void)//定時器中斷服務函數
- {
- //lcd_show_enable1=0;//注釋掉是調用液晶
- PIT_Flag_Clear(PIT0);
- if(lcd_show_enable1)//為0跳出液晶
- {
- my_lcd_show();
- }
- else
- {
- /*****************************************************脈沖提取*************************************************************/
- get_maichong();//獲取電機轉速
-
- if(LK_jishi_flag==0)
- LK_jishi++;
- if(LK_jishi==300)//起步延時1.5秒
- go=1;//小車前進
-
- if(LK_jishi>=2000)
- {
- LK_jishi_flag=1;
- LK_jishi=2000;
- }
- /*****************************************************邊線提取*************************************************************/
- lkcongzhongjiansaomiao();//圖像處理
- if(star_lineflag==1)
- LK_yanshi++;
-
- if(!star_lineflag&&go)
- {
- if(yunsu_flag==1)
- mubiao_speed=dawan_speed;
- else
- lukuangudge();//路況判斷
- }
- else
- if(LK_yanshi>30)//檢測到起跑線
- mubiao_speed=0;
- //if(pof)
- //mubiao_speed=0;
- DSYJ_dianji_PID(mubiao_speed); //控制電機轉速
-
- /************************************************************************S彎判定****************************************************/
- if(s_wan_flag)
- {
- S1=1;
- //s_wan_flag=0;
- }
- else
- {
- S=0;
- S1=0;
- }
-
- if(S1&&S<=25)
- S++;
- if(S>=25)
- {
- zhichong_flag=1;
- //gpio_set(PTE1,1);
- }
- else
- {
- zhichong_flag=0;
- //gpio_set(PTE1,0);
- }
- /*******************************************************坡道處理*****************************************************/
- // if(abs(my_piancha)<=16&&qvlv_quanju<=10&&duandian<12&&qulv_jinduan<12)
- // tuoluoyivar=adc_once(ADC1_SE4a,ADC_8bit);
- // else
- // tuoluoyivar=104;
-
- /* if(abs(tuoluoyivar-104)>40&&!podao_flag)
- {
- podao_flag=1;
- // gpio_set(PTE1,1);
- }
- if(podao_flag&&podao_flag<800)
- {
- podao_flag++;
- }
- else
- {
- podao_flag=0;
- //gpio_set(PTE1,0);
- }
- if(podao_flag>0&&podao_flag<130)
- pof=1;
- else
- pof=0;*/
- /*******************************************************障礙處理*****************************************************/
- if(zhangai_right==1)
- {
- zhangaijishiright_flag=1;
- zhangai_right=0;
- }
- else if(zhangai_left==1)
- {
- zhangaijishileft_flag=1;
- zhangai_left=0;
- }
-
-
- if(zhangaijishileft_flag&&zhangaijishileft_flag<35)
- {
- zhangaijishileft_flag++;
- // led(LED0, LED_ON);
- }
- else
- if(zhangaijishiright_flag&&zhangaijishiright_flag<35)
- {
- zhangaijishiright_flag++;
- }
- else
- zhangaijishiright_flag=zhangaijishileft_flag=0;
- /************************************************************************直道判定*直道判定*****************************************************/
- if(abs(my_piancha)<=13&&qvlv_quanju<=13&&duandian<10)
- {
- zhidao_flag++;
- }
- else
- {
- zhidao_flag=0;
- }
- //gpio_turn(PTA17);
- /*****************************************************偏差處理*************************************************************/
- pianchachuli();
-
- }
-
- }
- void Priority_Set(void)
- {
- // NVIC_SetPriorityGrouping(4); //設置優先級分組,4bit 搶占優先級,沒有亞優先級
- NVIC_SetPriority(PORTA_IRQn,0); //配置優先級
- NVIC_SetPriority(DMA0_IRQn,1); //配置優先級
- NVIC_SetPriority(PIT0_IRQn,2); //配置優先級
- }
復制代碼
iar代碼下載:
program of B_CAR.7z
(680.72 KB, 下載次數: 32)
2021-11-20 03:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|