找回密码
 立即注册
楼主: 上杉慕容

宁德师范学院 电磁组 爱丽丝绮想乐||第二十届智能车赛奖金已收到,特此致谢 STCAI

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-11-10 13:36:40

4

主题

45

回帖

276

积分

中级会员

积分
276
发表于 2025-11-10 13:36:40 | 显示全部楼层
主程序
#include "bsp_system.h"

#define time_limit_gyro  80
#define time_limit_speed 150

//        UI_task                        UI_alter

int32 cnt_test=0;
int32 speed_LL=0,speed_RR=0;

float v_next;                //测量电压

void main_init(void)
{
        distance_target = St_2;
        BT_state =1;
        UI         = UI_alter;
       
        task = task_xunji;
        READY = 0;
}


void task_run(void);
void task_trace(void);
void state_run(void);
void Pit_fuwu(void);
void key_long_excute(void);

void main(void)
{       
        /***********初始化************/
        clock_init(SYSTEM_CLOCK_40M);
        debug_init();
        gpio_init(IO_P32,GPO,0,GPO_PUSH_PULL);
       
        main_init();
        task_init();
        system_delay_init();
               
        //初始化使用
        //按键 跳过读取
        if(key_D == 1){iap_scan();ips200_string(19,4,"scan");}
        else{ips200_string(19,4,"no scan");}
       
        /*中断服务*/
       
        //调参or启动
        if(key_E == 0)
        {
                system_delay_ms(50);
                ips200_string(19,3,"OK");
                while(key_E==0);
                system_delay_ms(50);
               
                UI  = UI_alter;
               
                ips200_string(19,4,"        ");
        }
        else{UI = UI_task;}
        //中断时间选择
        if(UI  == UI_task)        {pit_ms_init(TIM_1,5);}
        else                                                                {UI_ips200_init();pit_ms_init(TIM_1,50);}
       
        interrupt_set_priority(TIMER1_IRQn, 0);       // 设置 PIT1 对周期中断的中断优先级为 0,0为最低优先级
        tim1_irq_handler = Pit_fuwu;       

        /************循环*************/
        while(1)
        {
               
//                if(UI == UI_task && adc_v<=5.3 && distance > 10000)
//                {
//                        UI = UI_alter;
//                        motor_L(0);
//                        motor_R(0);
//                        pit_ms_init(TIM_1,50);
////                        aoi_bee(1);
//                }
               
        }//while
}


void Pit_fuwu(void)
{
        //0-获取数据
        get_data();
        distance = abs_int32(distance_text);
        //电压检测
        v_next  = (adc_sample(ADC_V));
        adc_v   = adc_v_sample(v_next);

        if(UI == UI_task)
        {
                state_run();
                task_run();
                if(READY ==3){time_run+=5;}       
        }
       
        //3-串口信息打印
        my_debug_excute();
       
                //0-调参
        if(UI == UI_alter )
        {
                siai_adc_all_sample();                                                        //中间平均滤波
                adc_normalizing();                                                                        //电磁归一化

                key_loop();
                key_long_excute();
                UI_key_excute();
                UI_ips200_proc();

                speed_target = speed_straight;
        }
       
}



void task_run(void)
{

       
        switch(READY)
        {
                case 0:                                //零漂解算
                        READY = null_drift_calculate();
                        //#if chongdian == 0
                        //                if(READY == 1){READY=3;}
                        //#endif
//                        if(READY == 1){system_delay_ms(4000);READY=3;}
                        break;
                case 1:                                //等待电压
                        if(adc_v>adc_start)
                        {
                                angle_clear();
                                READY =2;       
                        }
                        break;
                case 2:                                //起跑
                        if(turn_direction == 1)
                        {
                                speed_target = 195;
                               
                                gyro_loop(-gyro_adv_out);               

                                if(out_gyro>0)
                                {
                                        loop_speed_LR(speed_target + small_t*out_gyro,speed_target - large_t*out_gyro);
                                }
                                else
                                {
                                        loop_speed_LR(speed_target + large_t*out_gyro,speed_target - small_t*out_gyro);
                                }
                                motor_L(out_L);
                                motor_R(out_R);
                                /**********记得改大小于号********/
                                if(angle_ringR<-angle_start)
                                {
                                        READY = 3;
                                }
                       
                        }
                        else if(turn_direction == 2)
                        {
                                speed_target = 195;
                               
                                gyro_loop(gyro_adv_out);               

                                if(out_gyro>0)
                                {
                                        loop_speed_LR(speed_target + small_t*out_gyro,speed_target - large_t*out_gyro);
                                }
                                else
                                {
                                        loop_speed_LR(speed_target + large_t*out_gyro,speed_target - small_t*out_gyro);
                                }
                                motor_L(out_L);
                                motor_R(out_R);
                                /**********记得改大小于号********/
                                if(angle_ringR>angle_start)
                                {
                                        READY = 3;
                                }
                        }
                        else if(turn_direction == 3)
                        {
                                speed_target = 190;
                               
                                gyro_loop(0);               

                                if(out_gyro>0)
                                {
                                        loop_speed_LR(speed_target + small_t*out_gyro,speed_target - large_t*out_gyro);
                                }
                                else
                                {
                                        loop_speed_LR(speed_target + large_t*out_gyro,speed_target - small_t*out_gyro);
                                }
                                motor_L(out_L);
                                motor_R(out_R);
                                if(distance > (pid_motor_ringR.Kd*100))
                                {
                                        READY = 3;
                                }
                       
                        }
                        else
                        {

                                        READY = 3;
                        }
               
                       
               

                        break;
                case 3:
                        task_trace();
                        break;
                default:break;
       
        }
       
       
}



void task_trace(void)
{
        if(distance < distance_target)                //循迹
        {       
                task_excute(task);
        }
        else                                                                                                                        //停车
        {
                pid_loop_speed = pid_loop_speed_start;
                speed_target = 0;
                loop_speed();

                turn_flag = 2;
                motor_L(out_L);
                motor_R(out_L);
        }
       
        speed_LL = abs_int32(speed_L);
        speed_RR = abs_int32(speed_R);
        if( distance > 10000 && distance <distance_target && speed_LL<50 && speed_RR<50)        //堵转停车
        {
                motor_L(0);
                motor_R(0);
                UI = UI_alter;
                aoi_bee(1);

                turn_flag = 3;

        }
}

void state_run(void)
{
        if(time_run > time_limit_gyro)
        {
                limit_gyro =limit_gyro_t;
        }
        else
        {
                limit_gyro =300;
        }
       
        if(time_run > time_limit_speed)
        {
                pid_loop_speed = pid_loop_speed_run;
        }
        else
        {
          pid_loop_speed = pid_loop_speed_start;
        }

}

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-11-10 13:36:40

4

主题

45

回帖

276

积分

中级会员

积分
276
发表于 2025-11-10 13:39:19 | 显示全部楼层
相关原理图
截图202511101338566909.jpg
截图202511101339051515.jpg
截图202511101339116520.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-11-10 13:36:40

4

主题

45

回帖

276

积分

中级会员

积分
276
发表于 2025-11-10 19:16:35 | 显示全部楼层
pcb
截图202511101916287287.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-11-30 10:07:56
已绑定手机

1

主题

4

回帖

27

积分

新手上路

积分
27
发表于 2025-11-30 10:07:56 | 显示全部楼层

lz,后来给你发奖金了吗?
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-12-17 15:57 , Processed in 0.273854 second(s), 60 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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