相比于本科组的题目,其多加入了一个条件:在数据界面下每次按下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);