給你們看看我家哥哥戰(zhàn)車:
/******************************************************************************
* 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)
2023-4-30 14:42 上傳
點擊文件名下載附件
源碼
|