一、旋钮式滑动变阻器模块
一、旋钮式滑动变阻器模块
二、说明:
vcc,gnd,供电
out,输出电压,adc采集电压
三、配置采样时间
其中fadc根据自己的配置来设定
其中Rain 为adc采样目标的阻值
一般而言,最理想的Rain为0,但实际中由于采样时间越大结果误差越小,但用所用时间也就越长,所以采取合适的配置才会更有效。
调用:
adc分频后:75/4=18.75mhz,
18.75mhz*3.96us=74.25cycles,选取接近的。
//配置列表
hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4;
hadc2.Init.Resolution = ADC_RESOLUTION_16B; //位数
hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;//扫描
hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;// eoc中断
hadc2.Init.LowPowerAutoWait = DISABLE;//低功耗
hadc2.Init.ContinuousConvMode =ENABLE; //打开连续转换 轮询时打开,中断关闭 DISABLE;
hadc2.Init.NbrOfConversion = 1;//只转换规则序列1
hadc2.Init.DiscontinuousConvMode = DISABLE;//不开启 不连续采样
hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;//开启软触发
hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;//软触发
hadc2.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;//保存数据到dr寄存器
hadc2.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;//覆盖旧数据
hadc2.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;//不左偏移
hadc2.Init.OversamplingMode = DISABLE;
HAL_ADC_Start(&hadcx);
HAL_ADC_Start_IT(&hadcx);
float ADC_Real_Value; // 实际计算得出的电压值
__IO int32_t ADC_Cover_Value=0; // 获取的AD值
__IO uint8_t Finish_flag=0; // 记录简单滤波次数以及滤波完成
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
ADC_Cover_Value=0;
ADC_Cover_Value=HAL_ADC_GetValue(&hadcx);
Finish_flag=1;
}
//中断方式
uint8_t get_vcc_value(float *adc_value)
{
if(Finish_flag==1)
{
ADC_Real_Value =(double)ADC_Cover_Value*V_ref/Data_ref;
*adc_value =ADC_Real_Value;
// printf("AD转换原始值 = 0x%04X \r\n", ADC_Cover_Value);
// printf("计算得出电压值 = %f V \r\n",ADC_Real_Value);
/* 启动AD转换并使能AD中断 */
HAL_ADC_Start_IT(&hadcx);
Finish_flag=0;
return 0;
}
else
{
return 1;
}
}
int32_t get_adc_average(uint8_t count)
{
uint8_t i;
int32_t Value=0;
ADC_Cover_Value=0;
for(i=0;i<count;i++)
{
/* 等待完成常规组的转换 */
if (HAL_ADC_PollForConversion(&hadcx, 10) == HAL_OK)
/* 获取ADC的转换 */
Value=HAL_ADC_GetValue(&hadcx);
/* 转换数值累加 */
ADC_Cover_Value =ADC_Cover_Value+Value;
}
/* 返回平均值 */
return ADC_Cover_Value/count;
}
//轮询方式
uint8_t get_vcc_value1(float *adc_value)
{
int32_t ADC_value=0;
ADC_value=get_adc_average(40);
/* 获取转换平均值 */
// printf("AD转换原始值 = 0x%04X \r\n", ADC_value);
/* 3.3为AD转换的参考电压值,stm32的AD转换为16bit,2^16=65535 */
ADC_Real_Value =(double)ADC_value*V_ref/Data_ref;
*adc_value=ADC_Real_Value;
// printf("计算得出电压值 = %f V \r\n",ADC_Real_Value);
return 0;
}