stm32之ADC
stm32f013c8t6有两个ADC,精度为12位,每个ADC最多有16 个外部通道、2个内部通道(温度传感器、内部参考电压)。实际stm32f013c8t6只有10个通道(IN0-IN9)+ 2个内部通道。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。ADC的输入时钟不得超过14MHz(常用12MHz),它是由PCLK2经分
ADC是什么?模拟数字转换器(Analog-to-Digital Converter)。
一、ADC概述
stm32f013c8t6有两个ADC,精度为 12 位,每个 ADC 最多有 16 个外部通道、2个内部通道(温度传感器、内部参考电压)。实际stm32f013c8t6只有10个通道(IN0-IN9)+ 2个内部通道。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。
ADC的输入时钟不得超过14MHz(常用12MHz),它是由PCLK2经分频产生。
1.1、电压输入范围
ADC 输入范围为:VREF- ≤ VIN ≤ VREF+。由 VREF-、VREF+ 、VDDA 、VSSA、这四个外部引脚决定。一般把 VSSA 和 VREF- 接地,把 VREF+ 和 VDDA 接 3V3,得到 ADC 的输入电压范围为:0~3.3V
1.2、通道

1.3、转换顺序
1.4、触发源
1.5、转换时间
ADC是挂载在APB2总线(PCLK2)上的,经过分频器得到ADC时钟(ADCCLK),最高 14 MHz。
转换时间 = 采样时间 + 12.5 个周期
1.6、数据寄存器
1.7、模式
二、单规则通道 case
int main(void)
{
uint32_t result;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
while (1)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 50);
result = HAL_ADC_GetValue(&hadc1);
printf("result = %f\r\n", 3.3/4096 * result);
HAL_Delay(500);
}
}
2.1、 MX_ADC1_Init
主要是来装配数据,并初始化,两个主要的步骤是HAL_ADC_Init和HAL_ADC_ConfigChannel
void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
// adc 通用配置
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
// 规则通道配置
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
2.2、HAL_ADC_Init
2.3、HAL_ADC_ConfigChannel
2.4、HAL_ADC_Start
2.5、HAL_ADC_PollForConversion
三、双规则通道 case
int main(void)
{
uint32_t result;
uint32_t result1;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
HAL_ADCEx_Calibration_Start(&hadc1);
while (1)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 50);
result = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 50);
result1 = HAL_ADC_GetValue(&hadc1);
printf("result = %f\r\n", 3.3/4096 * result);
printf("result1 = %f\r\n", 3.3/4096 * result1);
HAL_ADC_Stop(&hadc1);
HAL_Delay(1000);
}
}
四、双规则通道 case(关闭扫描模式)
核心代码如下
uint16_t ADC_Read(uint32_t Channel)
{
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = Channel; /* 通道 */
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; /* 采样时间 */
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
return (uint16_t)HAL_ADC_GetValue(&hadc1);
}
while (1)
{
result = ADC_Read(ADC_CHANNEL_0);
result1 = ADC_Read(ADC_CHANNEL_1);
printf("result = %f\r\n", 3.3/4096 * result);
printf("result1 = %f\r\n", 3.3/4096 * result1);
HAL_Delay(1000);
}
五、注入通道
待补充
更多推荐



所有评论(0)