教程2——stm32CubeMx—HAL库—ADC—有效值检测+输入阻抗的测试+最大值检测
写在前面:本专栏的所有代码都是在H743VIT6的基础上开发的,本人接触这块板子的时间也不长,写这个的目的是给自己规定一个ddl,很多具体管脚的用法可以直接在IDE里面看见。因为时间紧迫,文章力求简单明了,以功能实现为目标,如有错误,希望各位斧正。
一级目录
二级目录
三级目录
一、CubeMx的配置
1.芯片的选择
2.RCC的配置
3.adc单通道采样配置
配置adc的单通道采样时,选择adc独立模式,对齐的方式是右对齐,单通道时adc的扫描模式关闭(扫描模式在ADC多通道采样时会自动打开),采样的模式是间断模式连续转换使能,触发通道为1,触发方式为软件触发,注意开启adc的全局中断。 adc单通道配置完毕。
4.adc多通道采样配置
配置adc的多通道采样与单通道的区别是需要改两个地方的number,还要设置三个通道的rank,即采样的优先级,然后多通道模式ide会自动开启自动扫描模式,这个时候注意,将之前单通道设置的连续采样模式关闭,改为间断采样(之后我们是用间断模式循环采样)。 至此,adc的多通道配置完毕。
二、实验板块
实验1 单通道adc采样
uint16_t ADC_Value;
while (1)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 50);
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
{
ADC_Value = HAL_ADC_GetValue(&hadc1);
}
HAL_Delay(1000);
}
实验2 多通道adc采样测阻抗特性
uint16_t i,j = 0;
uint32_t adcBuf[3];
uint32_t Ri = 0;
uint32_t Ro = 0;
double Au = 0;
while (1)
{
HAL_ADC_Start_IT(&hadc1);
Ri = (adcBuf[2] * 5600 / (adcBuf[0] - adcBuf[2]));
Ro = (((adcBuf[1]*10000)/3080)-10000);
Au = (adcBuf[1]*100.0)/adcBuf[0];
HAL_Delay(100);
}
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
HAL_ADC_Stop_IT(&hadc1);
for(j=0;j<3;j++)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,0xffff);
adcBuf[j]=HAL_ADC_GetValue(&hadc1);
}
HAL_ADC_Stop(&hadc1);
}
我们设置的是12bit的adc采样,所以最终单片机采样的结果值应该是0~4095。还要注意的是,adc多通道采样的时候最好让每个通道属于非悬空状态(即让每个通道都要连接到需要测的值),不然测试出来的值会有问题。
实验3 最大值检测
uint32_t adcBuf[3];
uint16_t ADC_max0 = 0;
uint16_t ADC_max1 = 0;
uint16_t ADC_max2 = 0;
uint16_t ADC_min2 = 4095;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim == (&htim3))
{
i++;
if(i > 15)
{
i = 0;
ADC_max0 = 0;
ADC_max1 = 0;
ADC_max2 = 0;
ADC_min2 = 4095;
HAL_ADC_Start_IT(&hadc1);
}
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
HAL_ADC_Stop_IT(&hadc1);
HAL_TIM_Base_Stop_IT(&htim3);
for(j=0;j<3;j++)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,0xffff);
adcBuf[j]=HAL_ADC_GetValue(&hadc1);
}
if(ADC_max0 < adcBuf[0])
{
ADC_max0 = adcBuf[0];
}
if(ADC_max1 < adcBuf[1])
{
ADC_max1 = adcBuf[1];
}
if(ADC_max2 < adcBuf[2])
{
ADC_max2 = adcBuf[2];
}
if(ADC_min2 > adcBuf[2])
{
ADC_min2 = adcBuf[2];
}
HAL_ADC_Stop(&hadc1);
HAL_TIM_Base_Start_IT(&htim3);
}
实验4 有效值检测电路
ADC_Value = adcBuf[0];
if(p > 4095)
{
p = 0;
average = q;
q = 0;
}
if(ADC_Value>2048)
q++;
p++;
|