chb2005 发表于 前天 21:01

2025年电赛奖金申领--2025年电赛I题非接触智能控制盘国二

2025年电赛I题非接触智能控制盘国二
辽宁机电职业技术学院===非接触智能控制盘:
我们在硬件上面遇到了各种难题,需要自制硬件超声波传感器,设计电机调压调速控制电路。最后完成基本要求和发挥部分。
我们一开始使用运放构成运算放大器和比较器的方法处理超声波信号,发现效果并不理想后来采取CS100A为核心搭建的
超声波收发电路外围电路简单可靠性高,工作时序由图1超声波距离测量时序图所示:
                                          

离计算公式:file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml5468/wps22.jpg
   file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml5468/wps23.jpg为超声波在空气中的传播速度(340m/s),代入得简化公式:

理论误差:主要来自声速随温度的变化,修正公式为v=331.5+0.607T(T 为环境温度℃)。
测量误差: Ai8051U的定时器精度为25ns,对应距离分辨率 0.00017cm,满足 ±1cm 的设计要求。

风扇电压控制电路采用 "PWM - 低通滤波 - 线性稳压" 三级调节架构,下图PWM电压调节器的电路模型。
                                    


单片机输出占空比为D,频率1kHz的 PWM 信号,经RC低通滤波器转换为直流电压。该电压通过 LM358组成的缓冲器和电压PI调节器,
控制LM317 的输出电压:file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml5468/wps26.jpg


其中 k 为运放增益(实测 1.259),通过校准得到 PWM 占空比与输出电压的线性关系为UD = 0.1259x + 0.0064 (R2=0.9998)

通过 11 组实测数据验证,该模型在 23.25%-87.5% 占空比范围内的拟合误差≤0.05V,满足电压调节精度要求。


PWM 占空比与风扇电压控制电路输出的测试数据

占空比%23.252424.7537.543.755062.575808587.5
电压UD(V)2.8953.0193.1344.745.536.317.889.4510.0810.7110.98
                                                            

最终版风扇电压控制电路图如下所示:

                                                         



本系统采用 Ai8051U单片机,这款单片机不需要外部晶振和外部复位便可正常工作比传统8051约快70倍以上;支持在系统编程方式(ISP)更新用户应用程序
无需专用编程器;支持12位高精度15通道的模数转换,速度最快能达到800K。主控单片机最小系统电路图如下。

                                                                                    
四个漫反射光电开关(U12-U14)采用并联设计,额外的LED3~6提供良好的状况反馈。当手掌遮挡光电开关时,输出端从高电平跳变为低电平
单片机在中断服务程序中记录触发时间和通道号,通过时序分析识别手势轨迹。电开关电路图如下所示。

                                                                                       
程序基于Keil C51编译器开发环境,程序流程图如下:
                                                                                 
主要程序模块包括:
1.主程序模块:采用前后台架构,主循环负责状态刷新和显示,中断服务程序处理实时事件(代码片段如下):
void main(void)
{
unsigned char i;
unsigned char a;
unsigned char temp;
unsigned int max_val = 0;
unsigned int min_val = 0;

P_SW2 = 0x80;

System_Init();

    EA = 1;   

Delay500ms();

EEPROM_read_n(0x0000,(unsigned char*)f3_data1,64);

Bee = 1;
Delay500ms();
Delay500ms();
Bee = 0;
Delay500ms();
Delay500ms();
Bee = 1;
Delay500ms();
Delay500ms();
Bee = 0;

    while (1)
{
TCON &= 0xfc;

Check();

max_val = csb_dat;
min_val = csb_dat;

for (i = 1; i < 5; i++)
{
if (csb_dat > max_val)
{
max_val = csb_dat;// 更新最大值
}

if (csb_dat < min_val)
{
min_val = csb_dat;// 更新最小值
}

}

if((max_val - min_val < biaozhunzhi) && (Timer1_All < 350))
{
juliwending = 10;
P37 = 0;

if(Timer1_All != 0)
wendingjuli = Timer1_All;
}
else
{
juliwending = 0;
P37 = 1;
}

temp = 0;
while(P27 == 0)
{
Delay10ms();
temp++;
if(temp>50)
{
for(a=0;a<16;a++)
{
f3_data1 = 0;
f3_data1 = 0;
EEPROM_SectorErase(0x0000);
EEPROM_write_n(0x0000,(unsigned char*)f3_data1,64);
}
}
}
2.手势识别模块:通过中断记录开关触发时序,采用数组存储最近 5 次触发事件,通过模式匹配识别手势:
unsigned char key(void)
{

if((K_S1 == K_ON)||(K_S2 == K_ON)||(K_S3 == K_ON)||(K_S4 == K_ON))//四个当中有一个被按下
{
if(K_S1 == K_ON)//按下的是按钮1
{
Delay10ms();
if(K_S1 == K_ON)
{
k_cs = k_off_d;
while(K_S1 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}//1s内不释放就报错
k_cs = k_sts_d;
while(!((K_S1 == K_ON)||(K_S2 == K_ON)||(K_S3 == K_ON)||(K_S4 == K_ON)))//1s内释放,1s内不按下一个就报错
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
if(K_S1 == K_ON)
{
Delay10ms();
if(K_S1 == K_ON)
{
k_cs = k_off_d;
while(K_S1 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
return s1s1;
}
}
if(K_S2 == K_ON)
{
Delay10ms();
if(K_S2 == K_ON)
{
k_cs = k_off_d;
while(K_S2 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
return s1s2;
}
}
if(K_S3 == K_ON)
{
Delay10ms();
if(K_S3 == K_ON)
{
k_cs = k_off_d;
while(K_S3 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
return s1s3;
}
}
if(K_S4 == K_ON)
{
Delay10ms();
if(K_S4 == K_ON)
{
k_cs = k_off_d;
while(K_S4 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
return s1s4;
}
}
}
return zero;

}
else if(K_S2 == K_ON)
{
Delay10ms();
if(K_S2 == K_ON)
{
k_cs = k_off_d;
while(K_S2 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
k_cs = k_sts_d;
while(!((K_S1 == K_ON)||(K_S2 == K_ON)||(K_S3 == K_ON)||(K_S4 == K_ON)))
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
if(K_S1 == K_ON)
{
Delay10ms();
if(K_S1 == K_ON)
{
k_cs = k_off_d;
while(K_S1 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
return s2s1;
}
}
if(K_S2 == K_ON)
{
Delay10ms();
if(K_S2 == K_ON)
{
k_cs = k_off_d;
while(K_S2 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
return s2s2;
}
}
if(K_S3 == K_ON)
{
Delay10ms();
if(K_S3 == K_ON)
{
k_cs = k_off_d;
while(K_S3 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
return s2s3;
}
}
if(K_S4 == K_ON)
{
Delay10ms();
if(K_S4 == K_ON)
{
k_cs = k_off_d;
while(K_S4 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
return s2s4;
}
}
}
else return zero;
}
else if(K_S3 == K_ON)
{
Delay10ms();
if(K_S3 == K_ON)
{
k_cs = k_off_d;
while(K_S3 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
k_cs = k_sts_d;
while(!((K_S1 == K_ON)||(K_S2 == K_ON)||(K_S3 == K_ON)||(K_S4 == K_ON)))
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
if(K_S1 == K_ON)
{
Delay10ms();
if(K_S1 == K_ON)
{
k_cs = k_off_d;
while(K_S1 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
return s3s1;
}
}
if(K_S2 == K_ON)
{
Delay10ms();
if(K_S2 == K_ON)
{
k_cs = k_off_d;
while(K_S2 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
return s3s2;
}
}
if(K_S3 == K_ON)
{
Delay10ms();
if(K_S3 == K_ON)
{
k_cs = k_off_d;
while(K_S3 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
return s3s3;
}
}
if(K_S4 == K_ON)
{
Delay10ms();
if(K_S4 == K_ON)
{
k_cs = k_off_d;
while(K_S4 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
return s3s4;
}
}
}
else return zero;
}
else if(K_S4 == K_ON)
{
Delay10ms();
if(K_S4 == K_ON)
{
k_cs = k_off_d;
while(K_S4 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
k_cs = k_sts_d;
while(!((K_S1 == K_ON)||(K_S2 == K_ON)||(K_S3 == K_ON)||(K_S4 == K_ON)))
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
if(K_S1 == K_ON)
{
Delay10ms();
if(K_S1 == K_ON)
{
k_cs = k_off_d;
while(K_S1 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
return s4s1;
}
}
if(K_S2 == K_ON)
{
Delay10ms();
if(K_S2 == K_ON)
{
k_cs = k_off_d;
while(K_S2 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
return s4s2;
}
}
if(K_S3 == K_ON)
{
Delay10ms();
if(K_S3 == K_ON)
{
k_cs = k_off_d;
while(K_S3 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
return s4s3;
}
}
if(K_S4 == K_ON)
{
Delay10ms();
if(K_S4 == K_ON)
{
k_cs = k_off_d;
while(K_S4 == K_ON)
{
Delay_key();
k_cs--;
if(k_cs == 0)return K_Err;
}
return s4s4;
}
}
}
else return zero;
}
return zero;
}
else return zero;
}

3.PWM 调节模块:采用定时器 0 输出 10kHzPWM,通过查表法实现电压快速调节:
#define PINLV5000      //修改频率PWMA
#define System 40000000//晶振,下载时选择的频率

#define PINLVB1000   //修改频率PWMB#define PWMB5_0      0x00 //P:P0.1
#define PWMB5_1      0x01 //P:P1.1
#define PWMB5_2      0x02 //P:P2.1
#define PWMB5_3      0x03 //P:P5.0#define ENO5P       0x01
#define ENO6P       0x04
#define ENO7P       0x10
#define ENO8P       0x40unsigned int PWM_PERIODB = System/PINLVB;unsigned int PWM5_Duty;//百分比变void UpdatePwm(void)//放在while循环里面,如果有断点自动下载,放在if的前面
{
//    PWMA_CCR1H = (u8)(PWM1_Duty >> 8);
//    PWMA_CCR1L = (u8)(PWM1_Duty);
//    PWMA_CCR2H = (u8)(PWM2_Duty >> 8);
//    PWMA_CCR2L = (u8)(PWM2_Duty);
//    PWMA_CCR3H = (u8)(PWM3_Duty >> 8);
//    PWMA_CCR3L = (u8)(PWM3_Duty);
//    PWMA_CCR4H = (u8)(PWM4_Duty >> 8);
//    PWMA_CCR4L = (u8)(PWM4_Duty);

    PWMB_CCR5H = (u8)(PWM5_Duty >> 8);
    PWMB_CCR5L = (u8)(PWM5_Duty);
//    PWMB_CCR6H = (u8)(PWM6_Duty >> 8);
//    PWMB_CCR6L = (u8)(PWM6_Duty);
//    PWMB_CCR7H = (u8)(PWM7_Duty >> 8);
//    PWMB_CCR7L = (u8)(PWM7_Duty);
//    PWMB_CCR8H = (u8)(PWM8_Duty >> 8);
//    PWMB_CCR8L = (u8)(PWM8_Duty);


}void AI8051_PWM(void)
{
    WTST = 0;   //将CPU执行指令的速度设置为最快
    EAXFR = 1;   //扩展访问寄存器
    CKCON = 0;   //提高访问XRAM的速度

//=======占空比配置==================================================================================================//
//    PWM1_Duty = 4000;//PWM_PERIOD为1,占空比为50%就把PWM_PERIOD x 1/2
//    PWM2_Duty = 4000;
//    PWM3_Duty = 4000;
//    PWM4_Duty = 4000;

    PWM5_Duty = 20000;//PWM_PERIOD为1,占空比为50%就把PWM_PERIOD x 1/2
//    PWM6_Duty = 4000;
//    PWM7_Duty = 4000;
//    PWM8_Duty = 4000;

//=======通道模式配置==================================================================================================//

//    PWMA_CCER1 = 0x00;   //写CCMR之前要清零CCER
//    PWMA_CCER2 = 0x00;
PWMB_CCER1 = 0x00;   //写CCMR之前要清零CCER
    PWMB_CCER2 = 0x00;

//    PWMA_CCMR1 = 0x60;   //通道模式配置
    PWMB_CCMR1 = 0x60;   //通道模式配置

//    PWMA_CCMR2 = 0x60;
    PWMB_CCMR2 = 0x60;

//    PWMA_CCMR3 = 0x60;
    PWMB_CCMR3 = 0x60;

//    PWMA_CCMR4 = 0x60;
    PWMB_CCMR4 = 0x60;

//    PWMA_CCER1 = 0x55;   //配置通道输出和极性
//    PWMA_CCER2 = 0x55;
PWMB_CCER1 = 0x55;   //写CCMR之前要清零CCER
    PWMB_CCER2 = 0x55;

//    PWMA_CCMR1 |= 0x08;//开启预装载
//    PWMA_CCMR2 |= 0x08;
//    PWMA_CCMR3 |= 0x08;
//    PWMA_CCMR4 |= 0x08;

PWMB_CCMR1 |= 0x08;//开启预装载
    PWMB_CCMR2 |= 0x08;
    PWMB_CCMR3 |= 0x08;
    PWMB_CCMR4 |= 0x08;

// PWMB_PSCRH = 0x00; //分频
// PWMB_PSCRL = 99;

//=======周期配置==================================================================================================//
//    PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //周期时间配置,在开头define配置
//    PWMA_ARRL = (u8)PWM_PERIOD;

    PWMB_ARRH = (u8)(PWM_PERIODB >> 8); //周期时间配置,在开头define配置
    PWMB_ARRL = (u8)PWM_PERIODB;

//=======使能配置==================================================================================================//
//    PWMA_ENO |= ENO1P;   //使能输出
//    PWMA_ENO |= ENO1N;   //使能输出
//    PWMA_ENO |= ENO2P;   //使能输出
//    PWMA_ENO |= ENO2N;   //使能输出
//    PWMA_ENO |= ENO3P;   //使能输出
//    PWMA_ENO |= ENO3N;   //使能输出
//    PWMA_ENO |= ENO4P;   //使能输出
//    PWMA_ENO |= ENO4N;   //使能输出
// PWMA_ENO |= ENO4N;   //使能输出

PWMB_ENO |= ENO5P;   //使能输出
// PWMB_ENO |= ENO6P;   //使能输出
// PWMB_ENO |= ENO7P;   //使能输出
// PWMB_ENO |= ENO8P;   //使能输出

//=======通道选择配置==================================================================================================//

//    PWMA_PS = 0x00;   //通道模式
PWMB_PS = 0x00;   //通道模式

PWMB_PS |= PWMB5_0;
// PWMB_PS |= PWMB6_3;
// PWMB_PS |= PWMB7_2;
// PWMB_PS |= PWMB8_2;

//PWMA_PS |= PWM2_1;
//PWMA_PS |= PWM3_1;
// PWMA_PS |= PWM4_2;

//=======使能主输出配置==================================================================================================//
//    PWMA_BKR = 0x80;   //使能主输出
    PWMB_BKR = 0x80;   //使能主输出

//    PWMA_CR1 |= 0x81;   //使能预装载
PWMB_CR1 |= 0x81;   //使能预装载


}
4.超声波测距模块:超声波测距
void Timer1_Isr(void) interrupt 3
{
Timer1_Count++;
}

void Timer1_Init(void)//100微秒@40.000MHz
{

AUXR |= 0x40;   //定时器时钟1T模式
TMOD &= 0x0F;   //设置定时器模式
TMOD |= 0x80;
TL1 = 0x00;    //设置定时初始值
TH1 = 0x00;    //设置定时初始值
TF1 = 0;    //清除TF1标志
// TR1 = 0;    //定时器1关闭计时
TR1 = 1;    //定时器1开始计时
ET1 = 1;    //使能定时器1中断
}

void INT1_Isr(void) interrupt 2
{
u32 temp;
// u8 i;

TR1 = 0;    //定时器1关闭计时
EX1 = 0;    //关闭INT1中断

((u8*)&temp) = ((u8*)&Timer1_Count);
((u8*)&temp) = ((u8*)&Timer1_Count);
((u8*)&temp) = TH1;
((u8*)&temp) = TL1;

temp = temp * 0.0042875; // * 25 * 343000 / 1000000000 / 2

//--- 移动数据 -----------

if(temp != 0)
{
if(++csb_dat_x >= 5)csb_dat_x = 0;
csb_dat = temp;         //存入新数据
Timer1_All = temp ;/// 5;
}

TL1 = 0x00;    //设置定时初始值
TH1 = 0x00;    //设置定时初始值
Timer1_Count = 0;
TR1 = 1;
EX1 = 1;

P36 = !P36;

}



演示视频如下
934
933
         935
在设计中,力求硬件线路简单,充分发挥软件编程灵活的特点,来满足系统设计要求。系统以Ai8051U单片机为控制核心、自制信号稳定的超声波测距模块、优良的PWM调压电路,以及合理高效的单片机程序设计,使得我们顺利控制完成题目要求。经过几天努力奋战,从开始准备到第一时间接到题目,一直都全身心地投入比赛之中。
感谢STC提供的AI8051U实验箱和芯片,感谢学校老师后勤工作支持,同时也感谢大赛组委会给了我们这次重要的机会锻炼自己。


国芯人工智能 发表于 前天 21:03

尊敬的各位评审老师:

您好!感谢您在百忙之中审阅我们的参赛作品。我们是来自辽宁机电职业技术学院的参赛团队,荣获2025年全国大学生电子设计竞赛I题“非接触智能控制盘”项目国家级二等奖。在此,我们谨向组委会提交本项目的奖金申领申请,并简要汇报我们在该项目中的技术实现与成果。

在本次比赛中,我们围绕“非接触智能控制盘”这一主题,完成了从系统设计、硬件搭建到软件算法开发的全过程。项目旨在实现对设备的非接触式智能控制,通过超声波传感器检测物体位置信息,并结合电机驱动模块实现精准控制。

在硬件设计方面,我们面临诸多挑战。初期采用运放构成运算放大器和比较器处理超声波信号,但由于噪声干扰大、稳定性差,导致测量精度不理想。经过反复调试与优化,我们最终选用CS100A作为核心器件,构建了结构简单、可靠性高的超声波收发电路。该电路具有良好的抗干扰能力,能够稳定地采集目标距离信息。

在系统时序控制方面,我们设计了如图1所示的超声波距离测量时序图,确保各模块协同工作,提高整体系统的响应速度与准确性。基于采集到的距离数据,我们建立了相应的数学模型,用于计算目标与控制盘之间的相对位置关系。公式如下:

$$ d = \frac{v \cdot t}{2} $$

其中,$ d $ 表示目标与控制盘之间的距离,$ v $ 为超声波在空气中的传播速度(约340 m/s),$ t $ 为超声波发射与接收之间的时间差。

在控制部分,我们设计了电机调压调速控制电路,实现了对电机转速的精确调节。通过PWM(脉冲宽度调制)技术,我们能够根据距离变化动态调整电机输出功率,从而实现对控制对象的精准操控。

在软件算法层面,我们编写了基于单片机的控制程序,实现了对超声波信号的实时处理、数据解析与电机控制逻辑的集成。整个系统具备良好的可扩展性与适应性,能够满足不同场景下的应用需求。

通过本次比赛,我们不仅提升了自身的工程实践能力,也加深了对嵌入式系统、传感器技术和自动控制原理的理解。我们深知,此次获奖不仅是对我们努力的认可,更是对未来继续深入研究的激励。

因此,我们诚挚申请2025年电赛奖金,并希望得到组委会的审核与支持。我们将继续秉持严谨求实的态度,在今后的学习与实践中不断提升自我,为我国电子信息技术的发展贡献力量。

此致
敬礼!

辽宁机电职业技术学院
2025年电赛I题“非接触智能控制盘”参赛团队
2025年X月X日

[本文内容由国芯人工智能辅助生成,仅供参考]
页: [1]
查看完整版本: 2025年电赛奖金申领--2025年电赛I题非接触智能控制盘国二