题目要求
题目分析
根据题目可知,电路主要设计换挡部分和电阻测量部分,换挡部分我采用了四个继电器,四个挡位使被测电阻分别与100Ω、1KΩ、10KΩ、1MΩ进行分压,再通过单片机ADC采集被测电阻两端电压,即可换算出被测电阻的阻值,设被测电阻和基准电阻上的电压分别为Vx、Vo,根据分压关系可得被测电阻的阻值为:Rx=(Vx/Vo)/R。由于手头上没有M以上的电阻所以基础部分就搞了一堆电阻随机来测。
发挥部分(1)通过一个矩阵键盘输入阻值跟被被测电阻进行对比。
发挥部分(2)通过L298电机驱动控制电机带动电位器旋转,再通过单片机ADC采集被测电位器和基准电阻上的电压,通过实时采集到的数据在OLED打点画出电位器变化波形。
原理图设计说明
换挡电路
PCB设计说明
电源线、地线及印制导线在PCB上的排列要恰当,尽量做到短而直,以减小信号线与回线之间所形成的环路面积。电源线走大一些。
软件说明
软件部分主要是ADC采集
void ADC_Configuration(uint8_t ch)
{
__RCC_ADC_CLK_ENABLE();
__RCC_GPIOA_CLK_ENABLE();
ADC_SingleChTypeDef ADC_SingleInitStruct;
if(ch == 0)
{
PA00_ANALOG_ENABLE();
ADC_SingleInitStruct.ADC_Chmux = ADC_ExInputCH0;
}
else if(ch == 1)
{
PA01_ANALOG_ENABLE();
ADC_SingleInitStruct.ADC_Chmux = ADC_ExInputCH1;
}
ADC_SingleInitStruct.ADC_DiscardEn = ADC_DiscardNull;
ADC_SingleInitStruct.ADC_InitStruct.ADC_AccEn = ADC_AccDisable;
ADC_SingleInitStruct.ADC_InitStruct.ADC_Align = ADC_AlignRight;
ADC_SingleInitStruct.ADC_InitStruct.ADC_ClkDiv = ADC_Clk_Div16;
ADC_SingleInitStruct.ADC_InitStruct.ADC_DMAEn = ADC_DmaDisable;
ADC_SingleInitStruct.ADC_InitStruct.ADC_InBufEn = ADC_BufEnable;
ADC_SingleInitStruct.ADC_InitStruct.ADC_OpMode = ADC_SingleChOneMode;
ADC_SingleInitStruct.ADC_InitStruct.ADC_SampleTime = ADC_SampTime10Clk;
ADC_SingleInitStruct.ADC_InitStruct.ADC_TsEn = ADC_TsDisable;
ADC_SingleInitStruct.ADC_InitStruct.ADC_VrefSel = ADC_Vref_VDDA;
ADC_SingleInitStruct.ADC_WdtStruct.ADC_WdtAll = ADC_WdtDisable;
ADC_SingleChOneModeCfg(&ADC_SingleInitStruct);
ADC_Enable();
ADC_SoftwareStartConvCmd(ENABLE);
}
float Get_ADC()
{
uint16_t temp_dat_adc = 0;
ADC_SoftwareStartConvCmd(ENABLE);
while(ADC_GetITStatus(ADC_IT_EOC))
{
ADC_ClearITPendingBit(ADC_IT_EOC);
temp_dat_adc=ADC_GetConversionValue();
}
return (float)temp_dat_adc;
}
实物展示
注意事项
CW32引脚驱动能力比较强,刚开始我控制换挡的三极管基极没有上拉,导致四个继电器都处于打开状态,后面通过一个20K上拉到5V,继电器才能通过单片机正常开关。
原理图
PCB
CW开发板申请流程如下: