这个多通道采用非扫描模式--单次转换模式
1.代码配置链路图
2. ADC的输入通道
3.ADC的非扫描模式的转换模式(单次和连续)
4.ADC的扫描模式的转换模式(单次和连续)
5.采集校准
代码实验:
代码部分:
#include "stm32f10x.h" // Device header
void AD_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); //开启ADC1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //配置ADC时钟分频器
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //ADC模拟输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//配置ADC1模1块初始化
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right ;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent ;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_Init(ADC1,&ADC_InitStructure);
/*
ADC_ContinuousConvMode = DISABLE
关闭连续转换模式。ADC在每次触发时仅进行一次转换,转换完成后停止,适用于单次采样的场合。
ADC_DataAlign = ADC_DataAlign_Right
数据右对齐。ADC转换结果存储时,低位对齐方式,通常选择右对齐便于读取和处理。
ADC_ExternalTrigConv = ADC_ExternalTrigConv_None
外部触发关闭。ADC转换不依赖外部触发源,适用于单次软件触发或内部定时触发的场景。
ADC_Mode = ADC_Mode_Independent
独立模式。ADC模块工作在独立模式下,不与其他ADC模块联动。
ADC_NbrOfChannel = 1
仅采样一个通道。配置当前ADC转换序列中包含的通道数量为1,适用于单通道采样的情况。
ADC_ScanConvMode = DISABLE
关闭扫描转换模式。ADC仅对一个通道进行采样,不自动扫描多个通道。
*/
//中断
//模拟看门狗
//开启ADC电源
ADC_Cmd(ADC1,ENABLE);
//ADC校准
ADC_ResetCalibration(ADC1);
while((ADC_GetResetCalibrationStatus(ADC1) == SET));
ADC_StartCalibration(ADC1);
while((ADC_GetCalibrationStatus(ADC1)) == SET);
}
//启动转换,获取结果
uint16_t AD_GetValue(uint8_t ADC_Channel)
{
//配置规则组的输入通道
ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_55Cycles5);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while((ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET));
return ADC_GetConversionValue(ADC1);
}
float ADC_ValueToVoltage(uint16_t adc_value)
{
return (adc_value * 3.3f) / 4095.0f;
}
视频演示现象
STM32多路ADC采集