文章目录
前言
考察的模块有:输入捕获(PULS1、PULS2)、ADC(AO1、AO2)、方波输出(PA6、PA7)、EEPROM
一、cubeMX配置
1.PULS1——PA1(TIM2_CH2)
2.PULS2——PA2(TIM15_CH1)
二.相关代码
1.方波输出的分频和倍频
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM3)
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, (__HAL_TIM_GetCounter(htim) + HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2) / 2 * Dividing));
}
else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, (__HAL_TIM_GetCounter(htim) + HAL_TIM_ReadCapturedValue(&htim15, TIM_CHANNEL_1) / 2 / Doubling));
}
}
}
2.如何将方波在关闭时变为低电平输出(方波关闭时默认为高电平)
void Output_Ctrl(_Bool State)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
if(State == 1)
{
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
}
else
{
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
}
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
3.AO2电压不稳定,对其进行滤波处理(AO1也进行滤波)
void ADC_Proc(void)
{
uint16_t ADC_Buf[10];
uint16_t temp;
if((uwTick - uwTick_ADC_Set_Point) <= 20)
return;
uwTick_ADC_Set_Point = uwTick;
for(int i = 0; i < 10; i++)
{
ADC_Buf[i] = Get_ADC2_AO1();
}
for(int i = 0; i <= 5; i++)
{
for(int j = 0; j < 9 - i - 1; j++)
{
if(ADC_Buf[j] > ADC_Buf[j + 1])
{
temp = ADC_Buf[j + 1];
ADC_Buf[j + 1] = ADC_Buf[j];
ADC_Buf[j] = temp;
}
}
}
ADC_Value_AO1 = (ADC_Buf[4] + ADC_Buf[5]) / 2 / 4095. * 3.3;
for(int i = 0; i < 10; i++)
{
ADC_Buf[i] = Get_ADC2_AO2();
}
for(int i = 0; i <= 5; i++)
{
for(int j = 0; j < 9 - i - 1; j++)
{
if(ADC_Buf[j] > ADC_Buf[j + 1])
{
temp = ADC_Buf[j + 1];
ADC_Buf[j + 1] = ADC_Buf[j];
ADC_Buf[j] = temp;
}
}
}
ADC_Value_AO2 = (ADC_Buf[4] + ADC_Buf[5]) / 2 / 4095. * 3.3;
}
三.细节问题
- 虽AO2电压值不稳定,但官方代码并未对其进行滤波处理。
- 若采用方波输出(Output Compare),则发现分频/倍频时频率输出不稳定,且存在误差较大的情况;若采用PWM输出,则对于同一定时器的两路输出无法单独改变任何一路的输出频率。
四. 总结
第八届国赛难度较为简单,但仍有一些细节需要处理。