蓝桥杯备赛——第十一届省赛第二场(研究生组)

本文探讨了如何在嵌入式程序中实现B3按键触发PA6和PA7脉冲频率互换,同时处理PA6手动模式与PA7切换的独特逻辑。通过状态机和代码示例,解析了状态变换和PWM定时器的调整过程。

相比于本科组的题目,其多加入了一个条件:在数据界面下每次按下B3按键,互换PA6和PA7脉冲信号频率。这个条件的加入,让我一开始的程序设计逻辑有点混乱。遇到较为复杂的设计逻辑,应尽量多梳理其状态变换。
在这里插入图片描述
注:B4其实有两种状态的变换。(PA6手动模式和手动模式地转换跟PA7的转换是不同的)
过程变换图:
在这里插入图片描述

相应代码:


	switch(ucKey_Down)
	{
		case 1:
			if(!ucState)
			{
				ucState = 1;
			}
			else
			{
				ucState = 0;
			}
		break;
		
		case 2:
			if(ucState)
			{
				PA6_Duty_Int += 10;
				if(PA6_Duty_Int >= 110)
					PA6_Duty_Int = 10;
			}
		break;

		case 3:
			if(ucState)
			{
				PA7_Duty_Int += 10;
				if(PA7_Duty_Int >= 110)
					PA7_Duty_Int = 10;
			}
			else
			{
				if(ucPWM_State == 0)
					ucPWM_State = 1;
				else if(ucPWM_State == 1)
					ucPWM_State = 0;
				else if(ucPWM_State == 2)
					ucPWM_State = 3;
				else if(ucPWM_State == 3)
					ucPWM_State = 2;
			}
		break;
		
		case 4:
			if(ucPWM_State == 0)
				ucPWM_State = 2;
			else if(ucPWM_State == 2)
				ucPWM_State = 0;
			else if(ucPWM_State == 1)
				ucPWM_State = 3;
			else if(ucPWM_State == 3)
				ucPWM_State = 1;
		break;		
	}
void PWM_Proc(void)
{
	switch(ucPWM_State)
	{
		case 0:
			__HAL_TIM_SET_AUTORELOAD(&htim3, 1000);	//100hz
			__HAL_TIM_SET_AUTORELOAD(&htim17, 500);//200hz
		
			__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, PA6_Duty_Int * 10);
			__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, PA7_Duty_Int * 5);
		break;
		
		case 1:
			__HAL_TIM_SET_AUTORELOAD(&htim3, 500);	
			__HAL_TIM_SET_AUTORELOAD(&htim17, 1000);
		
			__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, PA6_Duty_Int * 5);
			__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, PA7_Duty_Int * 10);	
		break;
		
		case 2:
			__HAL_TIM_SET_AUTORELOAD(&htim3, 1000);	
			__HAL_TIM_SET_AUTORELOAD(&htim17, 500);
		
			__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, ADC_Value / 3.3 * 1000);
			__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, ADC_Value / 3.3 * 500);
		break;
		
		case 3:
			__HAL_TIM_SET_AUTORELOAD(&htim3, 500);	
			__HAL_TIM_SET_AUTORELOAD(&htim17, 1000);
		
			__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, ADC_Value / 3.3 * 500);
			__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, ADC_Value / 3.3 * 1000);
		break;
	}
}

自动重装载值设置函数:
__HAL_TIM_SET_AUTORELOAD(&htim3, 1000);

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值