当前位置:网站首页>第十一届 蓝桥杯 嵌入式设计与开发项目 决赛
第十一届 蓝桥杯 嵌入式设计与开发项目 决赛
2022-06-22 11:58:00 【然而然自】
赛题

CubeMX配置
ADC


输入捕获

PWM输出

程序展示
按键功能
u8 key_state=0xf;
u8 KEY_scan(void)
{
u8 data=0;
u8 key=0;
if(!TIME.KEY)
{
TIME.KEY=KEY_TIME;
data|=(GPIOB->IDR&0x07);
data|=((GPIOA->IDR&0x01)<<3);
key=data^key_state;
key_state=data;
}
return key;
}
u8 KEY_function(void)
{
u8 key;
key=KEY_scan();
if(!key) return 0;
if(key&KEY1)
{
if( !(key_state&KEY1) ) //按下 切换界面
{
DATA.display=++DATA.display>1?0:DATA.display;
if(!DATA.display) //数据显示界面
{
sprintf((char *)LCD_LINE_BUF[1]," DATA ");
sprintf((char *)LCD_LINE_BUF[3]," V1:%3.1fV ",DATA.V1);
sprintf((char *)LCD_LINE_BUF[4]," V2:%3.1fV ",DATA.V2);
sprintf((char *)LCD_LINE_BUF[5]," F1:%dHz ",DATA.F1);
sprintf((char *)LCD_LINE_BUF[6]," F2:%dHz ",DATA.F2);
LCD_LINE_state|=LCD_Line1|LCD_Line3|LCD_Line4|LCD_Line5|LCD_Line6;
//从参数设置界面切换回数据显示界面,检查LED状态
if(!(led_state&(0x01<<DATA.VD_S)))
{
led_state|=(0x01<<DATA.VD_S);
led_state&=(~(0x01<<DATA.VD));
}
if(!(led_state&(0x01<<DATA.FD_S)))
{
led_state|=(0x01<<DATA.FD_S);
led_state&=(~(0x01<<DATA.FD));
}
DATA.VD_S=DATA.VD; //退出设置界面,参数生效
DATA.FD_S=DATA.FD;
}
else //参数设置界面
{
LCD_ClearLine(Line5);
LCD_ClearLine(Line6);
sprintf((char *)LCD_LINE_BUF[1]," PARA ");
sprintf((char *)LCD_LINE_BUF[3]," VD:LD%d ",DATA.VD+1);
sprintf((char *)LCD_LINE_BUF[4]," FD:LD%d ",DATA.FD+1);
LCD_LINE_state|=LCD_Line1|LCD_Line3|LCD_Line4;
}
}
else //松开
{
;
}
}
if(key&KEY2)
{
if( !(key_state&KEY2) ) //按下 切换电压输出指示灯
{
if(DATA.display==1) //仅在参数设置界面下有效
{
DATA.VD=++DATA.VD>7?0:DATA.VD;
if(DATA.VD==DATA.FD) DATA.VD=++DATA.VD>7?0:DATA.VD; //若与频率输出指示灯相同,本次指示灯再加1
sprintf((char *)LCD_LINE_BUF[3]," VD:LD%d ",DATA.VD+1);
LCD_LINE_state|=LCD_Line3;
}
}
else //松开
{
;
}
}
if(key&KEY3)
{
if( !(key_state&KEY3) ) //按下 切换频率输出指示灯
{
if(DATA.display) //仅在参数设置界面下有效
{
DATA.FD=++DATA.FD>7?0:DATA.FD;
if(DATA.VD==DATA.FD) DATA.FD=++DATA.FD>7?0:DATA.FD; //若与电压输出指示灯相同,本次指示灯再加1
sprintf((char *)LCD_LINE_BUF[4]," FD:LD%d ",DATA.FD+1);
LCD_LINE_state|=LCD_Line4;
}
}
else //松开
{
;
}
}
if(key&KEY4)
{
if( !(key_state&KEY4) ) //按下 //切换PA7跟随模式
{
DATA.PWM_MODE=++DATA.PWM_MODE>1?0:DATA.PWM_MODE;
}
else //松开
{
;
}
}
return 1;
}
ADC功能
void ADC_function(void)
{
static u8 ADC_flag=0;
u8 a;
u32 data=0;
if(!TIME.ADC)
{
TIME.ADC=ADC_TIME;
if(++ADC_flag==2) ADC_flag=0;
for(a=0;a<ADC_LEN/2;a++)
{
data+=ADC_buf[a*2+ADC_flag];
}
data/=(ADC_LEN/2); //均值
if(ADC_flag) //V1电压
{
DATA.V1=(float)data/1241; //转换为电压 data/(4095/3.3)
if(!DATA.display) //只在数据显示界面显示
{
sprintf((char *)LCD_LINE_BUF[3]," V1:%3.1fV ",DATA.V1);
LCD_LINE_state|=LCD_Line3;
}
}
else //V2电压
{
DATA.V2=(float)data/1241;
if(!DATA.display)
{
sprintf((char *)LCD_LINE_BUF[4]," V2:%3.1fV ",DATA.V2);
LCD_LINE_state|=LCD_Line4;
}
}
if(DATA.V1>DATA.V2) led_state&=(~(0x01<<DATA.VD_S));
else led_state|=(0x01<<DATA.VD_S);
}
}
输入捕获
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
static u8 state[TIM_IN_NUM]={
0};
if(htim==(&htim2))
{
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)
{
if(state[0]==0) TIM_IN.data[0]=TIM2->CCR2;
else
{
HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_2);
TIM_IN.state[0]=2;
if(TIM2->CCR2>TIM_IN.data[0]) TIM_IN.data[0]=TIM2->CCR2-TIM_IN.data[0];
else TIM_IN.data[0]=0xffffffff-TIM2->CCR2+TIM_IN.data[0];
}
state[0]=!state[0];
}
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_3)
{
if(state[1]==0) TIM_IN.data[1]=TIM2->CCR3;
else
{
HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_3);
TIM_IN.state[1]=2;
if(TIM2->CCR3>TIM_IN.data[1]) TIM_IN.data[1]=TIM2->CCR3-TIM_IN.data[1];
else TIM_IN.data[1]=0xffffffff-TIM2->CCR3+TIM_IN.data[1];
}
state[1]=!state[1];
}
}
}
void TIM_IN_function(void)
{
u32 buf[TIM_IN_NUM]={
TIM_CHANNEL_2,TIM_CHANNEL_3};
u8 a;
for(a=0;a<TIM_IN_NUM;a++)
{
if(!TIME.TIM_IN[a])
{
if(TIM_IN.state[a]==0) //启动
{
TIM_IN.state[a]=1;
TIME.TIM_IN_OVER[a]=1000; //1s超时检测
HAL_TIM_IC_Start_IT(&htim2,buf[a]);
}
else if(TIM_IN.state[a]==1) //超时检测
{
if(!TIME.TIM_IN_OVER[a])
{
TIM_IN.state[a]=2;
HAL_TIM_IC_Stop_IT(&htim2,buf[a]);
TIM_IN.data[a]=0; //超过1s无输入捕获,则判定为0Hz
}
}
else if(TIM_IN.state[a]==2) //结束,计算
{
TIM_IN.state[a]=0;
TIME.TIM_IN[a]=TIM_IN_TIME;
if(a==0)
{
if(TIM_IN.data[0]) DATA.F1=1000000/TIM_IN.data[0]; //捕获之非0才进行频率转换
else DATA.F1=0;
if(!DATA.display)
{
sprintf((char *)LCD_LINE_BUF[5]," F1:%dHz ",DATA.F1);
LCD_LINE_state|=LCD_Line5;
}
}
else
{
if(TIM_IN.data[1]) DATA.F2=1000000/TIM_IN.data[1];
else DATA.F2=0;
if(!DATA.display)
{
sprintf((char *)LCD_LINE_BUF[6]," F2:%dHz ",DATA.F2);
LCD_LINE_state|=LCD_Line6;
}
}
if(DATA.PWM_MODE==a)
{
TIM3->CCR2= TIM_IN.data[DATA.PWM_MODE]/2; //50%占空比
TIM3->ARR=TIM_IN.data[DATA.PWM_MODE]; //PA7输出频率跟随PULS或PULS2
}
if(DATA.F1>DATA.F2) led_state&=(~(0x01<<DATA.FD_S));
else led_state|=(0x01<<DATA.FD_S);
}
}
}
}
PWM输出
if(DATA.PWM_MODE==a)
{
TIM3->CCR2= TIM_IN.data[DATA.PWM_MODE]/2; //50%占空比
TIM3->ARR=TIM_IN.data[DATA.PWM_MODE]; //PA7输出频率跟随PULS或PULS2
}
完整程序下载
下载链接:
链接:https://pan.baidu.com/s/1LMECSy3GuABduu42YUJdSQ
提取码:qy2o
边栏推荐
猜你喜欢

Redis - 10. Master slave replication

酷开电视adb

Redis - 12、应用问题解决

MAUI使用Masa blazor组件库

Local raw file contains

Foreign lead needs energy, interest, research, diligence and is indispensable
![[ciscn2019 finals Day1 web4]laravel1](/img/99/4eb4d9447ac191fb9320cd8135f019.png)
[ciscn2019 finals Day1 web4]laravel1

CAT敏捷团队教练工作坊 (Coaching Agile Teams) | 8月20日开课

Redis - 7. Transaction operation

Redis - 11. Cluster
随机推荐
论文解读——Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model
机器学习与深度学习 --- 激活函数(未完待续)
C#中,数组、List、ArrayList、Directory、LinkedList的区别与性能
Vue mixed write Minxin, virtual dom/ref, dynamic components, cache keep
重磅直播|BizDevOps:数字化转型浪潮下的技术破局之路
OGG12处理OGG-01163故障错误
SPI 与 API的区别
TiFlash 函数下推必知必会丨十分钟成为 TiFlash Contributor
ppt数据采集方法与分析技能
[WMCTF2020]Make PHP Great Again 2.0
Latex希腊字母对照表
Struggle, programmer chapter 38 in the old days, when the road turned to the edge of the forest, I suddenly saw
EndeavourOS安装配置全攻略!
[cloud native | kubernetes] Introduction to kubernetes (I)
Handling methods of ogg-01431, 01003 and 01151
Deadlock found when trying to get lock; try restarting transaction 【MySQL死锁问题解决】
linux设置 让oracle10g自启动
HMS core news industry solution: let technology add humanistic temperature
Messari年度报告-2022
Foreign lead needs energy, interest, research, diligence and is indispensable