找回密码
 立即注册
楼主: 神***

2023年电赛申领奖金,奖金已发放; 2025年,最高奖100万@STC32

[复制链接]
  • TA的每日心情
    奋斗
    1 小时前
  • 签到天数: 34 天

    [LV.5]常住居民I

    12

    主题

    185

    回帖

    1117

    积分

    版主

    STC

    积分
    1117
    发表于 2023-10-13 11:49:03 | 显示全部楼层
    本帖最后由 大刀阔斧 于 2024-1-15 09:11 编辑

    西安建筑科技大学(队伍编号1810E--获得全国大学生电子设计竞赛2023,本科组二等奖
    ===【E】题:   运动目标控制与自动追踪系统STC32G12K128作为唯一主控MCU实现
    按规定二等奖奖金人民币伍仟元@STC32G12K128
    ===2023/12/13审核通过 !

    截图202312131722526318.jpg
    为确保奖金发放评审的公平公正,经广大老师推荐,委托第三方资深团队组织评审,点评如下:
    按照程序框图可以看出STC32G为该作品中的唯一控制芯片,但其他内容(包括提交程序)与其他同校队伍1811E一致,并且其提交的材料内容混乱,包含太多训练内容。
    结合STC评审:整个系统中STC32G12K128确实是唯一主控并且完成了作为唯一主控的任务。
    结论: 建议颁发二等奖全额奖金,人民币5000元 , 以资鼓励!

    ================================以下是获奖团队文件描述和相关资料================================
    获奖证书: 获奖证书-队伍编号1810E.jpg
    视频演示:

    2023年全国大学生电子设计竞赛使用STC32G12K128为主控芯片-本科组




        本作品为两台步进电机云台组成的系统,系统包括模拟目标运动的红色的光斑位置控制系统和指示自动追踪的绿色光斑位置控制系统。根据任务要求设计了两类不同系统,包括搭载光电门和编码器的红色光斑位置控制系统以及搭载相机的绿色光斑位置控制系统。
        控制系统使用 STC32G12K128 主控制器,K210 模块进行机器视觉处理,完成对屏幕位置的识别及光斑追踪。云台方向控制采用了 MPU6050 进行姿态解算,利用模糊算法控制云台旋转过程中的方向控制。并用连续声光进行提示。机械结构采用上下步进电机实现全方位控制,编码器控制实时位置,光电门实现复位功能,摄像头捕捉运动光斑。经过多次测试,本作品可以完成各项任务。

    结合经验修改部分电路图如下:

           步进电动机能将外来输入的驱动脉冲信号转变成电机转子相应的角位移,一个脉冲信号驱动一个对应的角位移,这就是电机的一步。假如步进电机接收符合要求的连续驱动脉冲则步进电机将会连续的转动,步进电机的驱动脉冲频率越大其转速越快,频率越小其转速慢。改变电机驱动的脉冲频率可以直接改变电机的转动速度,如果给多台电机输入同一种驱动脉冲那么可以使这些电机同步运行与停止。步进电机的最大优点是:电机每转一周都有固定的步数,在不转动失步的前提下,步距误差不会长期的产生积累效应。如上优点完全使它适于在数字控制的开环系统中当做伺服元件来用即使整个系统大大的简化又可保证运行可靠。
           在电路设计中,我们使用主控制器STC32G12K128完成运动目标控制与自动追踪。STC32G12K128采用32位8051架构,该架构和外设接口相对简单,具有高速、低功耗、超强抗干扰特性,对于制作步进电机云台性能足够,且价格较便宜,使用起来还是很香的。我们的系统由电源模块、驱动模块、稳压模块、OLED显示模块、光电门模块和图像识别模块组成,机械结构采用上下步进电机实现全方位控制,编码器控制实时位置,光电门实现复位功能,摄像头捕捉运动光斑。系统结构框图如下。

           考虑到激光笔的复位功能,需要将激光笔安装在距地面30cm处,为节省打印时间,我们使用钢条进行加高,底部使用面积较大的亚克力板增加地盘稳定程度。比较不足的就是我们没有在比赛的时候使用垫板确定好位置,导致每次摆放的位置不一样都要重新调参,测评的时候也因此失分,一二号机下图。

          

    我们的系统软件设计采取了顺序控制的设计方法,根据每个任务的需要完成的步骤,按步设计相应函数,完成控制任务。首先对各个外设进行初始化,保证其能够完成相应任务,之后图像处理模块采集和处理,根据编码器进入不同的程序,完成控制任务,软件流程图如下。



    https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4068
    (出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)







    电话:0513-55012982、18106296593 (微信同)
    QQ : 1347154513
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    1 小时前
  • 签到天数: 34 天

    [LV.5]常住居民I

    12

    主题

    185

    回帖

    1117

    积分

    版主

    STC

    积分
    1117
    发表于 2023-10-13 11:49:47 | 显示全部楼层
    本帖最后由 大刀阔斧 于 2023-12-14 08:21 编辑

    西安建筑科技大学 -2023电赛【E】题--运动目标控制和自动追踪系统(队伍编号1810E),国二,软件开源
    1810E程序.rar (1.08 MB, 下载次数: 7)
    void main(void)
    {
            System_init();  //系统初始化        
            PIT_init_ms(0,1);                //用户任务定时器1ms
              PIT_init_us(1,400);                //步进电机脉冲专用定时器
            
            OLED_Init();


            Motors_Init();  //电机使能
            
            GPIO_init_pin(13,1);
            LASER=0;
            
            EA = 1;  //允许所有中断
            ET0=0;
            Delay_X_mS(200);
    //        Motors_Home(Y_axis,0,100);        //电机复位
    //        Motors_Home(X_axis,0,100);
    //        motor_go(2230,-102,40);  //从复位位置返回到设定X,Y中点
    //        while(motor_busy);
    //        Delay_X_mS(10);
            Set_motor_origin(X_axis);
            Set_motor_origin(Y_axis);
            
            
            LASER=1;
            OLED_ShowChar(0,6,'a',16);
            while(P32);
            
    //        Motors_Stop(X_axis);
    //        Motors_Stop(Y_axis);
            ET0=1;
            while(1)
            {
                            LED=!LED;
                   
                   
                            Laser_go(0,-250,5);                        //位置调试
                            while(motor_busy);
                            Delay_X_mS(100);
                            Laser_go(-250,-250,5);
                            while(motor_busy);
                            Delay_X_mS(100);
                            Laser_go(-250,250,5);
                            while(motor_busy);
                            Delay_X_mS(100);
                            Laser_go(250,250,5);
                            while(motor_busy);
                            Laser_go(250,-250,5);
                            while(motor_busy);
                            Delay_X_mS(100);
                   
                   
    //                        Laser_go(40,55,5);
    //                        while(motor_busy);
    //                        Delay_X_mS(100);
    //                        Laser_go(-240,55,5);
    //                        while(motor_busy);
    //                        Delay_X_mS(100);
    //                        Laser_go(-240,250,5);
    //                        while(motor_busy);
    //                        Delay_X_mS(100);
    //                        Laser_go(40,250,5);
    //                        while(motor_busy);
    //                        Delay_X_mS(100);


                   
            }
    }


    void Task1(void) //任务1,电机失能,回原点
    {
            Motors_Stop(X_axis);
            Motors_Stop(Y_axis);
            LASER=1;
    }
            
    void Task2(void) //任务2,走500mm方框
    {
            LASER=0;
            Task_flag=1;
            


                    Laser_go(-250,-250,10);
                    while(motor_busy && Task_flag);
                    LASER=1;
                    Delay_X_mS(50);
                    Laser_go(-250,250,10);
                    while(motor_busy && Task_flag);
                    Delay_X_mS(50);
                    Laser_go(250,250,10);
                    while(motor_busy && Task_flag);
                    Delay_X_mS(50);
                    Laser_go(250,-250,10);
                    while(motor_busy && Task_flag);
                    Delay_X_mS(50);
                    Laser_go(-250,-250,10);
                    while(motor_busy && Task_flag);


            
            Task_flag=0;
    }


    void Task3(void) //任务3,走A4纸边框
    {
            LASER=0;
            Task_flag=1;


            Laser_go(39,47,10);
            while(motor_busy && Task_flag);
            LASER=1;
            Delay_X_mS(50);
            Laser_go(-245,47,10);
            while(motor_busy && Task_flag);
            Delay_X_mS(50);
            Laser_go(-242,242,10);
            while(motor_busy && Task_flag);
            Delay_X_mS(50);
            Laser_go(39,245,10);
            while(motor_busy && Task_flag);
            Delay_X_mS(50);
            Laser_go(39,47,10);
            while(motor_busy && Task_flag);
            
            Task_flag=0;
    }






    void Set_motor_origin(unsigned char Chs)        //电机位置初始化函数
    {
            switch(Chs)
            {
                    case X_axis:
                    {
                            Motors_Current[X_axis] = 0;
                            Motors_target[X_axis] = 0;
                            Motors_target_old[X_axis]=0;
                            X_MOTOR_OFFSET = Get_magnetic_pos(X_axis);  //记录当前磁编码器值
                    }break;
                    case Y_axis:
                    {
                            Motors_Current[Y_axis] = 0;
                            Motors_target[Y_axis] = 0;
                            Motors_target_old[Y_axis]=0;
                            Y_MOTOR_OFFSET = Get_magnetic_pos(Y_axis);   //记录当前磁编码器值
                    }break;
            }
    }




    void Motors_Init(void)        //步进电机电机初始化函数
    {
            GPIO_init_8pin(2,1);
            
            P23=1;  //步进电机细分设置
            P27=1;
            
            Motors_Current[X_axis] = 0;  //每轴绝对位置清0
            Motors_Current[Y_axis] = 0;


            
            X_Current =0.0;    //每轴实际位置清0
            Y_Current =0.0;
            
            
            Motors_Start(X_axis);  //电机使能
            Motors_Start(Y_axis);
    }




    代码.rar

    1.1 KB, 下载次数: 18

    摄像头识别源代码.rar

    3.6 KB, 下载次数: 13

    电话:0513-55012982、18106296593 (微信同)
    QQ : 1347154513
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    1 小时前
  • 签到天数: 34 天

    [LV.5]常住居民I

    12

    主题

    185

    回帖

    1117

    积分

    版主

    STC

    积分
    1117
    发表于 2023-10-13 11:50:31 | 显示全部楼层
    本帖最后由 大刀阔斧 于 2023-10-23 11:03 编辑

    西安建筑科技大学 -2023电赛【E】题--运动目标控制和自动追踪系统(队伍编号1810E),国二,硬件开源

    巩固模电知识,提前备战综合测评
    使用面包板方波、三角波、矩形波信号发生电路
    截图202310231048005050.jpg
    截图202310231048313519.jpg
    截图202310231048229671.jpg

    学习嘉立创eda电路图绘制,布线打板
    tps5450稳压布线
    截图202310231049029320.jpg


    stc32开发板绘制


    截图202310231050105802.jpg
    上电正常
    截图202310231050291236.jpg
    stc32开发板焊接,驱动稳压焊接
    截图202310231050501167.jpg

    stc32控制的搭建小车
    截图202310231051065455.jpg
    截图202310231051137774.jpg
    舵机云台搭建
    截图202310231051279580.jpg
    2023年4月红外寻迹小车调试成功,第一次使用stc32完成控制

    截图202310231051405718.jpg 截图202310231051453997.jpg
    2023年5月成功完成2021年国赛G题送药小车
    截图202310231052076014.jpg 截图202310231052161734.jpg 截图202310231052283106.jpg 截图202310231052365618.jpg

    基于送药小车的完成情况看,PID控制稍有欠缺,所以使用往年省赛题目(滚轴控制系统)练习

    截图202310231053419283.jpg
    截图202310231053497123.jpg
    截图202310231054006105.jpg
    截图202310231054192260.jpg








    截图202310231052537191.jpg
    电话:0513-55012982、18106296593 (微信同)
    QQ : 1347154513
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-19 16:02
  • 签到天数: 39 天

    [LV.5]常住居民I

    5

    主题

    112

    回帖

    1080

    积分

    版主

    积分
    1080
    发表于 2023-10-23 09:31:37 | 显示全部楼层
    本帖最后由 STC32位8051芯片 于 2023-12-14 13:14 编辑

    中山大学===获得2023年全国大学生电子设计竞赛,本科组二等奖
    E题:运动目标控制与自动追踪系统, STC32G12K128作为唯一主控MCU实现
    按规定二等奖奖金人民币5000元@STC32G12K128

    ===2023/12/13审核 通过
    2023年全国大学生电子设计竞赛使用STC32G12K128为主控芯片-本科组
    截图202312131416228399.jpg
    为确保奖金发放评审的公平公正,经广大老师推荐,委托第三方资深团队组织评审点评如下
    通过作品照片以及描述可知使用了STC32G作为主控芯片,且接收来着视觉模块发出的激光位置信息,
    由STC32G实现位置闭环计算以及激光云台控制,程序中也能找到关于位置计算的代码部分,
    可以认为是唯一主控芯片。
    结论:建议颁发二等奖全额奖金,人民币5000元,以资鼓励!
    ================================以下是获奖团队文件描述和相关资料================================
    中山大学2023年电赛E题二等奖获奖证书如下:
    截图202312131417182141.jpg

    截图202312131417543215.jpg

    中山大学2023年电赛E题二等奖获奖视频如下:

    截图202311221039022050.jpg
    这次国赛 为了打造亮点,全部方案都选择国产、性价比高的,同时用了STC32屠龙刀、SSD202D、ESP32这三个芯片。SSD202D移植OPENCV做图像处理,STC32控制舵机,ESP32做激光点识别。
    硬件部分:
    ①硬件总体方案:
    1)红色激光器:由STC32G12K128作为主控芯片,通过串口连接SSD202D移植Opencv负责图像处理,最终通过STC32高级PWM做两轴舵机云台控制。
    2)绿色激光器:STC32G12K128作为主控芯片,连接ESP32芯片驱动OV2640进行图像处理,最终通过STC32高级PWM做两轴舵机云台控制。

    ②硬件原理图:
    截图202311291343392510.jpg
    截图202311291344184271.jpg

    (1)红色激光器:
    截图202311211116131101.jpg
    (2)绿色激光器:
    截图202311291104214758.jpg

    www.stcmcudata.com/STC8F-datasheet/STC8H.pdf
    www.stcmcudata.com/STC8F-datasheet/STC32G.pdf
    http://www.stcmcudata.com/STCISP/stc-isp-15xx-v6.92H.zip
    https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4153











    原理图.pdf

    164.67 KB, 下载次数: 9

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-19 16:02
  • 签到天数: 39 天

    [LV.5]常住居民I

    5

    主题

    112

    回帖

    1080

    积分

    版主

    积分
    1080
    发表于 2023-10-23 09:40:06 | 显示全部楼层
    本帖最后由 STC32位8051芯片 于 2023-11-27 15:28 编辑

    软件部分介绍
    ①简易UART协议
    由于STC32与另外两个外设芯片之间通过UART通信,为了设计方便,定义一种简单的UART通信协议:
    截图202311271522068635.jpg
    ②红色激光部分,STC32与图像识别模块的通信指令表:
    (1)STC32发送给图像识别模块
    动作
    指令
    数据
    1
    自动五点校准
    0x01
    五个字节,第一个字节表示目前进行到第几个点(0为第一个点),第二个到第五个字节为一个坐标,表示当前校准位置在屏幕坐标系下的坐标。(浮点值乘以一千倍取整,高位在前,例:(0.250.2)表示为[0,250,0,200]))
    2
    进行矩形检测,并请求获取A4靶标的四个顶点图像坐标
    0x02
    (2)图像识别模块发送给STC32
    动作
    指令
    数据
    1
    返回校准结果的透视矩阵
    0x01
    透视矩阵的9个浮点数。(浮点值乘以一千倍取整,高位在前,例:(0.250.2)表示为[0,250,0,200]))
    2
    返回矩形顶点在图像中的坐标
    0x02
    四个坐标(每个数值用两个字节,高位在前)

    ③坐标处理算法
    (1)寻找PWM占空比与屏幕坐标的关系
    通过简单几何建模,使得红色激光点可以停留在屏幕上任意指定的坐标位置,从而实现回原点、绕着屏幕边框走的要求。简单几何建模,确定舵机角度值与激光点在屏幕上的坐标值的一一对应关系:
    截图202311271523179916.jpg
    截图202311271523428224.jpg
    2)透视变换,确定图像坐标系与屏幕坐标系的转换关系:
    截图202311271524023651.jpg
    透视变换矩阵表达:
    截图202311271524181463.jpg
    其中,参数ωa33等于 1,通过透视变换后得到屏幕坐标xy
    截图202311271524356664.jpg
    ④红色激光器部分工作流程与实现方法:
    1)用户按下与STC32连接的[回原点按键,STC32立刻调整PWM占空比,使得云台带动激光点落在屏幕正中央。(此时的占空比为提前手动测量并保存的定值,由于红色激光部分与屏幕之间的位置关系固定,因此可以这么做)。
    2)用户按下与STC32连接的[校准按键,STC32立即进入校准模式,动作如下:
    1STC32通过调整PWM占空比,使得云台带动激光点落在(-0.2,0.45)坐标,并通过UART向图像处理模块发送[自动五点校准命令,附带参数为:当前校准第1个点,坐标为(-0.2,0.45)
    2STC32通过调整PWM占空比,使得云台带动激光点落在(0.2,0.45)坐标,并通过UART向图像处理模块发送[自动五点校准命令,附带参数为:当前校准第2个点,坐标为(0.2,0.45)
    3STC32通过调整PWM占空比,使得云台带动激光点落在(0.2,0.05)坐标,并通过UART向图像处理模块发送[自动五点校准命令,附带参数为:当前校准第3个点,坐标为(0.2,0.05)
    4STC32通过调整PWM占空比,使得云台带动激光点落在(-0.2,0.05)坐标,并通过UART向图像处理模块发送[自动五点校准命令,附带参数为:当前校准第4个点,坐标为(-0.2,0.05)
    5STC32通过调整PWM占空比,使得云台带动激光点落在(-0.010.25)坐标,并通过UART向图像处理模块发送[自动五点校准命令,附带参数为:当前校准第5个点,坐标为(-0.010.25
    6、图像处理模块自发计算透视矩阵M[3*3],并通过UARTSTC32发送。STC32接收后将其储存。
    3)用户按下与STC32连接的[绕屏运行按键,STC32立刻调整PWM占空比,使得云台带动激光点绕着屏幕边框运动。由于红色激光部分与屏幕之间的位置关系固定,只需提前手动测量并储存屏幕边框四个点的坐标,即可通过简单插值让激光点绕着屏幕边框运动。
    4)用户按下与STC32连接的[绕靶标运行按键,STC32通过UART向图像处理模块发送[进行矩形检测,并请求获取A4靶标的四个顶点图像坐标命令,图像处理模块识别矩形并通过UARTSTC32发送[返回矩形顶点在图像中的坐标命令,附带参数为:四个顶点在摄像头视角下的坐标值。STC32接收到之后,将坐标值与透视矩阵进行矩阵乘法运算,得到A4靶标的四个顶点在屏幕坐标系下的坐标,并立刻调整PWM占空比,使得云台带动激光点绕着A4靶标边框运动。

    ⑤图像识别模块发送给STC32UART指令
    动作
    指令
    数据
    1
    红激光坐标
    0x01
    坐标(每个数值用两个字节,高位在前)
    2
    绿激光坐标
    0x02
    坐标(每个数值用两个字节,高位在前)

    ⑤绿色激光器部分工作流程与实现方法:
    用户按下与STC32连接的[开始按键,STC32立刻进入[寻找模式,调整PWM占空比,使得云台带动绿色激光点快速在屏幕上扫描运动。图像识别模块不停地检测摄像头画面中的红色、绿色激光点并且将其坐标值通过UARTSTC32汇报。一旦STC32发现画面中出现了红色激光点,则立刻转入[跟踪模式,此时STC32会通过PID算法调整PWM占空比,使得绿色激光器跟随红色激光器;同时,STC32控制有源蜂鸣器发声,控制LED亮起,做到声光提示。

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-19 16:02
  • 签到天数: 39 天

    [LV.5]常住居民I

    5

    主题

    112

    回帖

    1080

    积分

    版主

    积分
    1080
    发表于 2023-10-23 09:57:32 | 显示全部楼层
    本帖最后由 STC32位8051芯片 于 2023-11-29 13:42 编辑

    源代码如下:


    #include "STC32G.h"  //包含此头文件后,不需要再包含"reg51.h"头文件
    #include "usb.h"     //USB调试及复位所需头文件

    /****************************** 用户定义宏 ***********************************/

    #define MAIN_Fosc       35000000L   //定义主时钟
    #define Timer0_Reload   (65536UL -(MAIN_Fosc / 100))       //Timer 0 中断频率, 50次/秒

    /*****************************************************************************/

    #define PWM5_1      0x00        //P2.0
    #define PWM6_1      0x00        //P2.1
    #define ENO5P       0x01
    #define ENO6P       0x04


    #define PWM_PERIOD  20000    //设置周期值

    /***************************** 本地变量声明 **********************************/

    struct pointI{
            int x;
            int y;
    };
    struct pointF{
            float x;
            float y;
    };

    struct pointI rad2pwm(struct pointF rad);
    struct pointF cor2rad(struct pointF cor);
    void move(float x,float y);
    void walk_panel(void);
    void walk_home(void);
    void walk_A4_ai(void);
    struct pointF cvt_point(struct pointI src);
    void corr(void);







    float M[9]={0};//透视变换矩阵

    u16 PWM5_Duty;
    u16 PWM6_Duty;
    bit PWM5_Flag;
    bit PWM6_Flag;
    void UpdatePwm(u16 pwm5,u16 pwm6);
    #define Baudrate1   (65536 - MAIN_Fosc / 115200 / 4)
    #define UART1_BUF_LENGTH    128
    u8  TX1_Cnt;   
    u8  RX1_Cnt;   
    bit B_TX1_Busy;
    u8  RX1_Buffer[UART1_BUF_LENGTH];
    /*************  UART函数 **************/

    void UART1_config(u8 brt);  
    void PrintString1(u8 *puts);
    //========================================================================
    //=============串口单字节发送函数======================================
    //========================================================================
    void sendByte(u8 dat)
    {
            SBUF = dat;
            B_TX1_Busy = 1;
            while(B_TX1_Busy);
    }

    //========================================================================
    //=============串口单字节序列发送函数======================================
    //========================================================================
    void sendByteArray(u8* dat,u8 len)
    {
            int i;
            for(i=0;i<len;i++)
            {
                    sendByte(dat);
            }
    }

    //========================================================================
    //=============串口命令发送函数======================================
    //========================================================================
    void send(u8 cmd,u8 len,u8* dat)
    {
            char head[4]={0};
            head[0]=cmd;
            head[1]=len/256/256;
            head[2]=len/256%256;
            head[3]=len%256;
            sendByteArray(head,4);
      sendByteArray(dat,len);
    }



    //=================串口时钟配置函数============================================
    void SetTimer2Baudraye(u32 dat)
    {
        T2R = 0;                //Timer stop
        T2_CT = 0;        //Timer2 set As Timer
        T2x12 = 1;        //Timer2 set as 1T mode
        T2H = (u8)(dat / 256);
        T2L = (u8)(dat % 256);
        ET2 = 0;   
        T2R = 1;                //Timer run enable
    }


    //==================串口配置=============================================
    void UART1_config(u8 brt)
    {
        if(brt == 2)
        {
            S1BRT = 1;        //S1 BRT Use Timer2;
            SetTimer2Baudraye(Baudrate1);
        }

        else
        {
            TR1 = 0;
            S1BRT = 0;                //S1 BRT Use Timer1;
            T1_CT = 0;                //Timer1 set As Timer
            T1x12 = 1;                //Timer1 set as 1T mode
            TMOD &= ~0x30;
            TH1 = (u8)(Baudrate1 / 256);
            TL1 = (u8)(Baudrate1 % 256);
            ET1 = 0;   
            TR1 = 1;
        }
        /*************************************************/

        SCON = (SCON & 0x3f) | 0x40;   
    //  PS  = 1;   
        ES  = 1;   
        REN = 1;   
        P_SW1 &= 0x3f;
        P_SW1 |= 0x40;     

        B_TX1_Busy = 0;
        TX1_Cnt = 0;
        RX1_Cnt = 0;
    }

    void UART1_rec_p2(u8 cmd,u8*dat,u8 len);


    //========================================================================
    //=============串口命令接收处理函数======================================
    //========================================================================
    void UART1_rec_p1(char* dat,int len)
    {
        static char* ctrl_data[50]={0};//接收的数据,声明被放在很前面,为了实现注册时无需复制
        static unsigned char ctrl_cmd=0;//接收的命令  
                    static unsigned char ctrl_sta=0;  //目前状态,0为命令,1,2,3 为长度的高位到低位,4为数据
                    static u8 data_total_len=0,data_now_len=0;
                    int i,j;

        for(i=0;i<len;i++)
        {
            if(ctrl_sta==0)
            {
                ctrl_cmd=dat;
                data_total_len=0;
                ctrl_sta++;
            }
            else if(ctrl_sta==4)
            {
                if((len-i)<(data_total_len-data_now_len))
                {
                    for(j=i;j<len;j++)
                    {
                        ctrl_data[data_now_len+j-i]=dat[j];
                    }
                    data_now_len+=(len-i);
                    return;
                }
                else
                {
                    for(j=data_now_len;j<data_total_len;j++)
                    {
                        ctrl_data[j]=dat[j-data_now_len+i];
                    }
                    i+=(data_total_len-data_now_len);
                    //收到指令+数据!
                    UART1_rec_p2(ctrl_cmd,ctrl_data,data_total_len);
                    ctrl_sta=0;

                }
            }
            else
            {
                data_total_len*=256;
                data_total_len+=dat;
                ctrl_sta++;
                if(ctrl_sta==4)
                {
                    data_now_len=0;
                    if(data_total_len==0)
                    {
                        ctrl_sta=0;
                        //收到指令!
                        UART1_rec_p2(ctrl_cmd,ctrl_data,data_total_len);
                    }
                   
                }
            }
        }
    }

    //========================================================================
    //=============串口命令处理函数======================================
    //========================================================================
    void UART1_rec_p2(u8 cmd,u8*dat,u8 len)
    {
            int i;
            if(cmd==0x01)//保存透视矩阵
            {
                    for(i=0;i<9;i++)
                    {
                            M=dat;
                    }
            }
            else if(cmd==0x02)//绕着A4矩形走
            {

        float x[4]={0};
        float y[4]={0};
                    struct pointF in;
                    struct pointF out;
                    int i;
                    int cnt=0;

        for(i=0;i<4;i++)
        {

            x=dat[4*i]*256+dat[4*i+1];
            y=dat[4*i+2]*256+dat[4*i+3];
                              in.x=x;
                              in.y=y;
                              

        }
                   
                   
                   



        while(1)
        {
            
            cnt++;


            if(cnt<200)
            {
                move((200-(cnt-0))*x[0]/200+(cnt-0)*x[1]/200,(200-(cnt-0))*y[0]/200+(cnt-0)*y[1]/200);
            }
            else if(cnt<400)
            {
                move((200-(cnt-200))*x[1]/200+(cnt-200)*x[2]/200,(200-(cnt-200))*y[1]/200+(cnt-200)*y[2]/200);
            }
            else if(cnt<600)
            {
                move((200-(cnt-400))*x[2]/200+(cnt-400)*x[3]/200,(200-(cnt-400))*y[2]/200+(cnt-400)*y[3]/200);
            }
            else if(cnt<800)
            {
                move((200-(cnt-600))*x[3]/200+(cnt-600)*x[0]/200,(200-(cnt-600))*y[3]/200+(cnt-600)*y[0]/200);
            }
            else
            {

                break;
            }
            usleep(25000);


        }
            }
    }

    void UART1_int (void) interrupt 4
    {
            u8 dat;
            u16 d1=0,d2=0;
            u8 sum;
            int i;
        if(RI)
        {
                            dat=SBUF;
                            UART1_rec_p1(&dat,1);
                            RI = 0;

        }

        if(TI)
        {
            TI = 0;
            B_TX1_Busy = 0;
        }
    }


    void Delay10ms()                //@35MHz
    {
            unsigned char data i, j, k;

            _nop_();
            _nop_();
            i = 10;
            j = 85;
            k = 113;
            do
            {
                    do
                    {
                            while (--k);
                    } while (--j);
            } while (--i);
    }




    /******************************** 设置激光点位置函数 ************************************/
    void move(float x,float y)
    {
            struct pointF p;
            struct pointF rad;        
            struct pointI pwm;
            p.x=x;
            p.y=y;
            rad= cor2rad(p);
            pwm=rad2pwm(rad);
    }

    struct pointF cor2rad(struct pointF cor)
    {
        float phi,theta;
        float x=cor.x,y=cor.y;
              struct pointF res;
        phi=atan(x);
        theta=atan(y/(sqrt(x*x+1)) );
       
        res.x=phi;
        res.y=theta;
        return res;
    }
    struct pointI rad2pwm(struct pointF rad)
    {
        const float k_phi=605.102;
        const float k_theta=609.37;
        float phi=rad.x;
        float theta=rad.y;
              struct pointI res;
        int x,y;
        x=8832+k_phi*phi;
        y=8197-k_theta*theta;
        res.x=x;
        res.y=y;
        return res;

    }
    /******************************** 激光点绕屏幕边框运动函数 ************************************/
    void walk_panel(void)
    {
                    static int cnt=0;
                    const float x[]={-0.28,0.25,0.225,-0.28};
                    const float y[]={0.52,0.525,0.03,0.025};        
        while(1)
        {


            if(cnt<200)
            {
                move((200-(cnt-0))*x[0]/200+(cnt-0)*x[1]/200,(200-(cnt-0))*y[0]/200+(cnt-0)*y[1]/200);
                if(cnt==0)
                {
                   Delay10ms();
                }
            }
            else if(cnt<400)
            {
                move((200-(cnt-200))*x[1]/200+(cnt-200)*x[2]/200,(200-(cnt-200))*y[1]/200+(cnt-200)*y[2]/200);
            }
            else if(cnt<600)
            {
                move((200-(cnt-400))*x[2]/200+(cnt-400)*x[3]/200,(200-(cnt-400))*y[2]/200+(cnt-400)*y[3]/200);
            }
            else if(cnt<800)
            {
                move((200-(cnt-600))*x[3]/200+(cnt-600)*x[0]/200,(200-(cnt-600))*y[3]/200+(cnt-600)*y[0]/200);
            }
            else
            {

                break;
            }
            Delay10ms();
            cnt++;


        }
    }





    /******************************** 激光点回原点函数 ************************************/
    void walk_home(void)
    {
        move(-0.01,0.25);
    }

    /******************************** 激光点A4靶标边框运动函数 ************************************/
    void walk_A4_ai(void)
    {
            send(0x02,"",0);
            

    }

    /******************************** 透视变换函数 ************************************/
    struct pointF cvt_point(struct pointI src)
    {
        int u = src.x;
        int v = src.y;
        struct pointF dst;
        dst.x= (M[0*3+0]*u+M[0*3+1]*v+M[0*3+2])/(M[2*3+0]*u+M[2*3+1]*v+M[2*3+2]);
        dst.y=(M[1*3+0]*u+M[1*3+1]*v+M[1*3+2])/(M[2*3+0]*u+M[2*3+1]*v+M[2*3+2]);
        return dst;

    }

    /******************************** 五点校准函数 ************************************/
    void corr(void)
    {
            int i;
            float pos[]={-0.2,0.45,0.2,0.45,0.2,0.05,-0.2,0.05};
            u8 dat[5]={0};
            for(i=0;i<5;i++)
            {
                    move(pos[2*i],pos[2*i+1]);
                    dat[0]=i;
                    dat[1]=(u16)(pos[2*i]*1000)/256;
                    dat[2]=(u16)(pos[2*i]*1000)%256;
                    dat[3]=(u16)(pos[2*i+1]*1000)/256;
                    dat[4]=(u16)(pos[2*i+1]*1000)%256;               
                   
                    send(0x01,dat,5);
            }
    }

    /******************************** 主函数 ************************************/
    void main(void)
    {
            unsigned long i=0;
            unsigned long j=0;
            char a[20]="is xxxx,and xx\r\n";
            bit flag=0;
            int cntb;
            
            

            
        WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
        EAXFR = 1; //扩展寄存器(XFR)访问使能
        CKCON = 0; //提高访问XRAM速度

        RSTFLAG |= 0x04;   //设置硬件复位后需要检测P3.2的状态选择运行区域,否则硬件复位后进入USB下载模式

        P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
        P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
        P2M1 = 0x00;   P2M0 = 0xFF;   //设置为准双向口
        P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
        P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
        P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
        P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
        P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

        PWM5_Flag = 0;
        PWM6_Flag = 0;
            
        PWM5_Duty = 0;
        PWM6_Duty = 12680;

                   
                   
                    PWMB_PSCRH=0x00;
                    PWMB_PSCRL=0X23;//700div
        //-------------------------



        PWMB_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
        PWMB_CCER2 = 0x00;
        PWMB_CCMR1 = 0x60; //通道模式配置
        PWMB_CCMR2 = 0x60;
        PWMB_CCMR3 = 0x60;
        PWMB_CCMR4 = 0x60;
        PWMB_CCER1 = 0x33; //配置通道输出使能和极性
        PWMB_CCER2 = 0x33;

        PWMB_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
        PWMB_ARRL = (u8)PWM_PERIOD;

        PWMB_ENO = 0x00;
        PWMB_ENO |= ENO5P; //使能输出
        PWMB_ENO |= ENO6P; //使能输出

        PWMB_PS = 0x00;    //高级 PWM 通道输出脚选择位
        PWMB_PS |= PWM5_1; //选择 PWM5_1 通道
        PWMB_PS |= PWM6_1; //选择 PWM6_1 通道

        PWMB_BRK = 0x80;   //使能主输出
        PWMB_CR1 |= 0x01;  //开始计时

        EUSB = 1;   //IE2相关的中断位操作使能后,需要重新设置EUSB
        EA = 1;     //打开总中断
                   
                   
                    UART1_config(2);
                            PWM5_Duty=0;
                            PWM6_Duty=0;
        while (1)
        {
      Delay10ms();
                            if(P35==0)//校准
                            {
                                    Delay10ms();
                                    if(P35==0)
                                    {
                                            corr();
                                            while(!P35);
                                    }
                            }

                            if(P34==0)//回原点
                            {
                                    Delay10ms();
                                    if(P34==0)
                                    {
                                            walk_home();
                                            while(!P34);
                                    }
                            }

                            if(P33==0)//绕屏走
                            {
                                    Delay10ms();
                                    if(P33==0)
                                    {
                                            walk_panel();
                                            while(!P33);
                                    }
                            }

                            if(P32==0)//绕靶走
                            {
                                    Delay10ms();
                                    if(P32==0)
                                    {
                                            walk_A4_ai();
                                            while(!P32);
                                    }
                            }                        
                            
        }
    }


    void UpdatePwm(u16 pwm5,u16 pwm6)
    {
                    if((pwm5!=PWM5_Duty) || (pwm6!=PWM6_Duty))
                    {
                    PWM5_Duty=pwm5;
                    PWM6_Duty=pwm6;
                    }               
        PWMB_CCR5H = (u8)(PWM5_Duty >> 8); //设置占空比时间
        PWMB_CCR5L = (u8)(PWM5_Duty);
        PWMB_CCR6H = (u8)(PWM6_Duty >> 8); //设置占空比时间
        PWMB_CCR6L = (u8)(PWM6_Duty);
    }


    void delay_ms(u8 ms)
    {
        u16 i;
        do{
            i = MAIN_Fosc / 6000;
            while(--i);   //6T per loop
        }while(--ms);
    }


    源代码.zip

    269.3 KB, 下载次数: 19

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    1 小时前
  • 签到天数: 112 天

    [LV.6]常住居民II

    3

    主题

    89

    回帖

    1403

    积分

    超级版主

    积分
    1403
    发表于 2023-10-25 11:25:24 | 显示全部楼层
    本帖最后由 芯芯向荣up 于 2024-1-15 10:51 编辑

    电赛本科国一
    共有6 支队伍使用STC32G12K128为主控芯片获得,分别是:

    华北理工大学,  获得了本科E题国一:
    E题:运动目标控制与自动追踪系统, STC32G12K128作为唯一主控MCU实现
    按规定一等奖奖金人民币2万元@STC32G12K128

    ===该校有 STC 联合实验室,并且是正式挂牌,该校在学习STC15F2K60S2系列

    浙江科技学院,  获得了本科E题国一:
    E题:     运动目标控制与自动追踪系统 STC32G12K128完成了 2/3 的工作量
    E题要求:设计制作一个运动目标控制与自动追踪系统
    ===奖金人民币 13333元; 该校有 STC 联合实验室,并且是正式挂牌
    ===STC大学计划该校服务人员强烈建议,将 奖金提升RMB15000

    中国计量大学 , 获得了本科E题国一:
    E 题: 运动目标控制与自动追踪系统@STC32G12K128 STC32完成了 1/3 控制功能
    E题要求:设计制作一个运动目标控制与自动追踪系统

    ===奖金人民币 6667元;===STC大学计划该校服务人员建议,虽然实验室未挂牌
            但该校都在学习 STC89C52RC/STC12C5A60S2
    ===STC大学计划该校服务人员强烈建议将 奖金提升RMB8000

            在内部评比中,不挂牌还是吃亏啊,人都是讲感情好面子的


    哈尔滨理工大学  获得了本科E题国一:
    E题:运动目标控制与自动追踪系统@STC32位8051 STC32完成了 1/3 控制功能
    E题要求:设计制作一个运动目标控制与自动追踪系统
    ===奖金人民币 6667元; 该校有 STC 联合实验室,并且是正式挂牌
            该校在学习STC15F2K60S2系列
    ===STC大学计划该校服务人员强烈建议将 奖金提升RMB10000
            鼓励高校 STC实验室还是正式挂牌,树立国产STC光辉形象
            虽然 《单片机原理及应用》都是从STC入门,谁都跑不掉,还是鼓励挂牌


    北方民族大学,  获得本科G题国一:
    【G】题:空地协同智能消防系统@STC32位8051 STC32完成了 1/3 控制功能
    ===奖金人民币 6667元; 该校有 STC 联合实验室,并且是正式挂牌
            该校都在学习 STC89C52RC/STC15F2K60S2系列,后续会升级到STC32位8051
    ===STC大学计划该校服务人员强烈建议将 奖金提升RMB10000元,要比不挂牌的高
            鼓励高校 STC 实验室还是正式挂牌,树立国产STC光辉形象



    电赛专科国一 @STC32
    杭州科技职业技术学院,获得大专J题国一:
    J题:线路故障自动检测系统@STC32G12K128实现,STC是唯一主控MCU,奖金人民币2万
    J题要求:设计一套线路故障自动检测装置,能判定并显示线路中故障位置和类型
    杭州科技职业技术学院2023年全国大学生电子设计竞赛使用STC32位8051为主控芯片

    ===该校全校都在学习 STC89C52RC,集训队都在用 STC32G12K128培训
            STC实验室 挂牌协议已签,STC 会全力支持 32位8051实验箱

    电赛专科国一 @STC8H
    专科国一共有 1支队伍使用STC8H8K64U为主控芯片获得,是:
    南通职业大学,获得大专K题国一:
    K题: 辨音识键奏乐系统, STC8H8K64U作为唯一主控MCU实现
    按规定一等奖奖金人民币1万@STC8H8K64U,其实用32位8051,奖金就是2万元了
    ===按规定一等奖奖金人民币2万@STC32G12K128,这个吃亏了

    ===该校全校都在学习 STC15F2K60S2系列,已在转到 STC32位8051赛道
            STC实验室 协议已签,STC 会全力支持 32位8051实验箱


    电赛本科国二共有 7 支队伍使用STC32G12K128为主控芯片获得,分别是:

    中山大学本科组E题国二:
    E题:运动目标控制与自动追踪系统, STC32G12K128作为唯一主控MCU实现
    按规定二等奖奖金人民币5000元@STC32G12K128

    ===该校有 STC 联合实验室

    鲁东大学本科E题国二:

    鲁东大学航空队===获得2023年全国大学生电子设计竞赛,本科组二等奖
    E题:运动目标控制与自动追踪系统STC32G12K128作为唯一主控MCU实现
    按规定二等奖奖金人民币5000@STC32G12K128

    ===该校在学习STC12C5A60S2系列
    河南科技大学本科G题国二:
    G题空地协同智能消防系统STC32G12K128作为唯一主控MCU实现
    按规定二等奖奖金人民币5000@STC32G12K128

    ===该校有 STC 联合实验室,并且是正式挂牌,该校在学习IAP15W4K58S4系列
    西安建筑科技大学两支队伍本科E题国二:
    1,西安建筑科技大学(队伍编号1811E)--获得2023年全国大学生电子设计竞赛,本科组二等奖
    【E】题:   运动目标控制与自动追踪系统STC32G12K128作为唯一主控MCU实现
    按规定二等奖奖金人民币5000@STC32G12K128


    2,西安建筑科技大学(队伍编号1810E--获得全国大学生电子设计竞赛2023,本科组二等奖
    ===【E】题:   运动目标控制与自动追踪系统STC32G12K128作为唯一主控MCU实现
    按规定二等奖奖金人民币5000@STC32G12K128

    ===该校在学习STC32G12K128系列
    嘉兴学院,获得本科E题国二 :
    E题:运动目标控制与自动追踪系统@STC32G12K128二等奖奖金人民币5000
    E题要求:设计制作一个运动目标控制与自动追踪系统
    ===两个云台使用的主控芯片均为STC32G12K128

    ===该校有 STC 联合实验室,并且是正式挂牌,该校在学习IAP15W4K58S4系列和STC32G12K128系列
    重庆交通大学本科E题国二:
    E题:运动目标控制与自动追踪系统@STC32G12K128STC32完成了 1/3 控制功能
    ===奖金人民币 1667元;
    ===STC大学计划该校服务人员强烈建议:
            该校都在学习 STC89C52RC,比赛核心团队培训用的是 STC8H8K64U, STC32G12K128
            因为全校比赛精英团队都是紧密跟踪支持STC最新发展方向
            强烈建议将奖金提升到RMB4000,引导全国紧密跟踪学习STC最新技术

    获奖队伍资料链接:
    国一共有6 支队伍使用STC32G12K128为主控芯片获得,分别是:
    华北理工大学,  获得了本科E题国一https://www.stcaimcu.com/forum.p ... ptid=4560&pid=30987
    浙江科技学院,  获得了本科E题国一https://www.stcaimcu.com/forum.p ... ptid=4560&pid=30745
    中国计量大学,  获得了本科E题国一:https://www.stcaimcu.com/forum.p ... ptid=4560&pid=30937
    哈尔滨理工大学  获得了本科E题国一
    https://www.stcaimcu.com/forum.p ... ptid=4560&pid=30968
    北方民族大学,  获得了本科G题国一
    https://www.stcaimcu.com/forum.p ... ptid=4560&pid=30996

    杭州科技职业技术学院,获得大专J题国一
    https://www.stcaimcu.com/forum.p ... ptid=4560&pid=31059

    国一共有 1支队伍使用STC8H8K64U为主控芯片获得,是:
    南通职业大学,获得大专K题国一
    https://www.stcaimcu.com/forum.p ... ptid=4560&pid=31107

    国二共有 7 支队伍使用STC32G12K128为主控芯片获得,分别是:
    中山大学本科组E题国二
    https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=4560&pid=32067
    鲁东大学本科E题国二
    https://www.stcaimcu.com/forum.p ... ptid=4560&pid=31182
    河南科技大学本科G题国二
    https://www.stcaimcu.com/forum.p ... ptid=4560&pid=31185
    西安建筑科技大学两支队伍本科E题国二
    https://www.stcaimcu.com/forum.p ... ptid=4560&pid=31196
                                                               https://www.stcaimcu.com/forum.p ... ptid=4560&pid=31202
    嘉兴学院,获得本科E题国二
    https://www.stcaimcu.com/forum.p ... ptid=4560&pid=31124
    重庆交通大学本科E题国二https://www.stcaimcu.com/forum.p ... ptid=4560&pid=31176

    比赛视频合集:

    南通职业大学2023年电赛K题一等奖获奖视频

      



































    www.STCAI.com
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    回帖

    16

    积分

    新手上路

    积分
    16
    发表于 2023-11-5 00:07:01 来自手机 | 显示全部楼层
    您好请问西安建筑科技大学有两队国二均使用贵公司芯片,请问是不是遗漏了

    点评

    好的,我核查一下。  详情 回复 发表于 2023-11-10 08:51
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    1 小时前
  • 签到天数: 112 天

    [LV.6]常住居民II

    3

    主题

    89

    回帖

    1403

    积分

    超级版主

    积分
    1403
    发表于 2023-11-10 08:51:40 | 显示全部楼层
    Serein21 发表于 2023-11-5 00:07
    您好请问西安建筑科技大学有两队国二均使用贵公司芯片,请问是不是遗漏了 ...

    好的,我核查一下。
    www.STCAI.com
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    1

    回帖

    63

    积分

    注册会员

    积分
    63
    发表于 2024-1-25 17:02:58 | 显示全部楼层
    中山大学-基因拟态酶队奖金已经收到了!!!一直在也永远会支持STC!!!
    1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-28 10:50 , Processed in 0.086380 second(s), 66 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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