硬件信息
STM32F407ZGT6 ADC参数:
STM32F407ZGT6 有 3 个 ADC,每个 ADC 有 12 位、10 位、8 位和 6 位可选,每个 ADC 有 16 个 外部通道。
STM32F407ZGT6 ADC分配:
可调电阻原理图,PB0为8通道:
时钟配置
配置详细
单通道ADC
时钟分频计算
F407的ADC 的时钟<= 36MHZ
FCLK2为84MHZ
84/4 = 21 <= 36MHZ
配置中断
测试代码
申明接收数据变量
main.c
extern __IO uint16_t ADC_ConvertedValue;
float ADC_Vol;
在ADC 初始化函数中,启动ADC
adc.c
void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_8;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_15CYCLES;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
// 启动ADC
HAL_ADC_Start_IT(&hadc1);
}
中断函数中赋值
adc.c
__IO uint16_t ADC_ConvertedValue;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{
/* 获取结果 */
ADC_ConvertedValue = HAL_ADC_GetValue(AdcHandle);
}
main函数测试
while (1)
{
HAL_Delay(1000);
ADC_Vol =(float) ADC_ConvertedValue/4096*(float)3.3; // 读取转换的AD值
printf("\r\n AD value = 0x%04X \r\n", ADC_ConvertedValue);
printf("\r\n AD value = %f V \r\n",ADC_Vol);
}
测试
多通道DMA读取ADC
硬件配置
PB0:滑动变阻器
PB1:光敏电阻
PA6:自行测量
DMA配置
循环模式
ADC配置
中断配置
测试代码
adc.c
__IO uint16_t ADC_ByteData[4];
/* ADC1 init function */
void MX_ADC1_Init(void)
{
/* USER CODE BEGIN ADC1_Init 2 */
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_ByteData, 4);
/* USER CODE END ADC1_Init 2 */
}
main.c
while (1)
{
/* USER CODE END WHILE */
HAL_Delay(3000);
for(int i=0;i<4;i++)
{
ADC_Data[i] = (float)ADC_ByteData[i] / 65536 * (float)3.3;
printf("AD %d:0x%04X \r\n", i, ADC_ByteData[i]);
printf("AD %d:%f V \r\n", i, ADC_Data[i]);
}
/* USER CODE BEGIN 3 */
}
测试