找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1559|回復: 0
收起左側

基于逐飛科技STC32G單片機開源庫寫的電磁巡跡差速方案 源程序

[復制鏈接]
ID:1032245 發(fā)表于 2023-4-30 11:15 | 顯示全部樓層 |閱讀模式
給你們看看我家哥哥戰(zhàn)車:
1.png 1.png
/******************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2020,逐飛科技
* All rights reserved.
* 以下所有內容版權均屬逐飛科技所有,未經允許不得用于商業(yè)用途,
* 歡迎各位使用并傳播本程序,修改內容時必須保留逐飛科技的版權聲明。
* @author  逐飛科技
********************************************************************************/

#include "headfile.h"
/*
* 系統頻率,可查看board.h中的 FOSC 宏定義修改。
* board.h文件中FOSC的值設置為0,則程序自動設置系統頻率為33.1776MHZ
* 在board_init中,已經將P54引腳設置為復位
* 如果需要使用P54引腳,可以在board.c文件中的board_init()函數中刪除SET_P54_RESRT即可
*/

#include "LED.H"
uint16 adc_data[3];
#define a 14.5
#define tingche P45//停車觸發(fā)
int16 x,y;
uint16 av0,av1,av2,av3;
uint16 max1,min1;
uint16 k;//數字代表小車運行模式
uint16 count;

void main()
{
        WTST=0;
        board_init();                        // 初始化寄存器,勿刪除此句代碼。
        WTST=0;
        DisableGlobalIRQ();
        sys_clk=3500000;
        
        //不斷電下載
        EAXFR = 1;                                 //使能訪問 XFR
        CKCON = 0x00;                 //設置外部數據總線速度為最快
        WTST = 0x00;                         //設置程序代碼等待參數,                                         
        P3M0 = 0x00;      //賦值為 0可將 CPU執(zhí)行程序的速度設置為最快
        P3M1 = 0x00;      //將P3口設置為準雙向口
        P32 = 1;


        
        adc_init(ADC_P00, ADC_SYSclk_DIV_2);        //adc電壓采集
        adc_init(ADC_P01, ADC_SYSclk_DIV_2);        
        adc_init(ADC_P02, ADC_SYSclk_DIV_2);        
        adc_init(ADC_P03, ADC_SYSclk_DIV_2);

        oled_init();
        
        pwm_init(PWMA_CH1P_P10, 10000, 0);  //初始化PWMA  使用引腳P6.0  輸出PWM頻率10000HZ   占空比為百分之 pwm_duty / PWM_DUTY_MAX * 100
  pwm_init(PWMA_CH2N_P13, 10000, 0);
        pwm_init(PWMA_CH3P_P14, 10000, 0);
        pwm_init(PWMA_CH4N_P17, 10000, 0);
        EnableGlobalIRQ();
  tingche=1;
        k=3;//開始正常循跡
        count=0;
        
        while(1)        
                {
                        if(!P32) IAP_CONTR = 0x60;//當檢測到P3.2的電平為低時,軟件復位到系統區(qū)
                        
                        adc_data[0] = adc_once(ADC_P00, ADC_12BIT);        
                        adc_data[1] = adc_once(ADC_P01, ADC_12BIT);        
                        adc_data[2] = adc_once(ADC_P02, ADC_12BIT);               
                        adc_data[3] = adc_once(ADC_P03, ADC_12BIT);
                        
                        av0=adc_data[0];
                        av1=adc_data[1];
                        av2=adc_data[2];
                        av3=adc_data[3];

                        
//oled顯示屏顯示
                        oled_p6x8str(0,1,"ADCcollect");
                        oled_int16(0,2,av0);
                        oled_int16(84,2,av3);
                        oled_int16(20,3,av1);
                        oled_int16(56,3,av2);

                        oled_p6x8str(2,5,"k");
                        oled_int16(38,5,k);
                        oled_p6x8str(2,6,"count");
                        oled_int16(38,6,count);
                        delay_ms(1);
                        
                        //小車模式判斷 temp        
      if(av1>1900||av2>1900)//入環(huán)
                        {
                                k=1;
                        }
                        else if(tingche==0)
                        {
                                k=0;//干簧管停車觸發(fā)
                        }
                        else if(av0<170||av3<170)
                        {
                                k=4;//極限拉扯
                        }
                        else
                        {
                                k=3;//正常巡跡
                        }               
                                
                                //*****小車運行模式
                                                switch(k)
                                                {
                                                        case 0://停車觸發(fā)
                                                                pwm_duty(PWMA_CH1P_P10, 0);     //right
                                                                pwm_duty(PWMA_CH2N_P13, 0);
                                                                pwm_duty(PWMA_CH3P_P14, 0);     //left
                                                                pwm_duty(PWMA_CH4N_P17, 0);
                                                          while(1)
                                                                {
                                                                        LED();
                                                                }
                                                                break;

                                                        case 1://入環(huán)島轉向//檢測特征值然后微調直線行駛距離和入環(huán)差值和持續(xù)時間,從而達到準確入環(huán)
                                                                if(count==1)
                                                                {
                                                                        pwm_duty(PWMA_CH1P_P10, 9999);     //right
                                                                  pwm_duty(PWMA_CH2N_P13, 0);
                                                                  pwm_duty(PWMA_CH3P_P14, 9999);     //left
                                                                  pwm_duty(PWMA_CH4N_P17, 0);        
                                                                        delay_ms(100);
                                                                        pwm_duty(PWMA_CH1P_P10, 4600);     //right
                                                                  pwm_duty(PWMA_CH2N_P13, 0);
                                                                        pwm_duty(PWMA_CH3P_P14, 9700);     //left
                                                                        pwm_duty(PWMA_CH4N_P17, 0);
                                                                        delay_ms(500);
                                                                        count++;
                                                                }
                                                                break;
                                                        
//                                                        case 2://出環(huán)島轉向
//                                                                delay_ms(1000);
//                                                                pwm_duty(PWMA_CH1P_P10, 9000);     //right
//                                                                pwm_duty(PWMA_CH2N_P13, 0);
//                                                                pwm_duty(PWMA_CH3P_P14, 9860);     //left
//                                                                pwm_duty(PWMA_CH4N_P17, 0);
//                                                                delay_ms(1000);
//                                                                k=3;
//                                                                delay_ms(1);
//                                                                break;
                                                
                                                        case 3://正常循跡
                                                          if(av0>av3)
                                                                        {
                                                                         x=9800-a*(av0-av3);
                                                                         y=9800+a*(av0-av3);
                                                                        }
                                                                if(av0<av3)
                                                                {
                                                                                x=10000+a*(av3-av0);
                                                                                y=10000-a*(av3-av0);
                                                                }
                                                                  if(x>10000)
                                                                        x=10000;
                                                                  if(y>10000)
                                                                        y=10000;
                                                                        if(x<0)
                                                                        {
                                                                                x=0;
                                                                        }
                                                                        if(y<0)
                                                                        {
                                                                                y=0;
                                                                        }
                                                                pwm_duty(PWMA_CH1P_P10, y);     //right
                                                                pwm_duty(PWMA_CH2N_P13, 0);
                                                                pwm_duty(PWMA_CH3P_P14, x);     //left
                                                                pwm_duty(PWMA_CH4N_P17, 0);        
                                                                break;
                                                                        
                                                        case 4://極限拉扯,如果遇到小車抽風沒轉過來,還可以靠出軌跡后的微弱電磁差進行修正
                                                                        if(av0>av3)
                                                                                {
                                                                                  y=10000;
                                                                                        //delay_ms(5);
                                                                                  x=4600;
                                                                                }
                                                                        if(av0<av3)
                                                                                {
                                                                                  y=4600;
                                                                                        //delay_ms(5);
                                                                                  x=9999;
                                                                                }
                                                                        
                                                                pwm_duty(PWMA_CH1P_P10, y);     //right
                                                                pwm_duty(PWMA_CH2N_P13, 0);
                                                                pwm_duty(PWMA_CH3P_P14, x);     //left
                                                                pwm_duty(PWMA_CH4N_P17, 0);        
                                                                break;
                                                         
                                                  case 5:
                                                                pwm_duty(PWMA_CH1P_P10, 9999);     //right
                                                                pwm_duty(PWMA_CH2N_P13, 0);
                                                                pwm_duty(PWMA_CH3P_P14, 9999);     //left
                                                                pwm_duty(PWMA_CH4N_P17, 0);        
                 break;               
                                                 }        //switch選擇結束                                                

                                                                oled_p6x8str(0,4,"X");
                                                                oled_int16(10,4,x);
                                                                oled_p6x8str(50,4,"Y");
                                                                oled_int16(56,4,y);                                                        
                                                                //delay_ms(1);        

                }
                        
}

給你們看看我家哥哥戰(zhàn)車:
游客,本帖隱藏的內容需要積分高于 1 才可瀏覽,您當前積分為 0


Keil代碼下載: Keil代碼.7z (131.51 KB, 下載次數: 15)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表