ADC代码部分

张开发
2026/4/6 1:36:43 15 分钟阅读

分享文章

ADC代码部分
ADC一. 常用库函数void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);void ADC_ResetCalibration(ADC_TypeDef* ADCx);FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);void ADC_StartCalibration(ADC_TypeDef* ADCx);FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);二. 初始化void AD_Init(void) { /*开启时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //开启ADC1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 /*设置ADC时钟*/ RCC_ADCCLKConfig(RCC_PCLK2_Div6); //选择时钟6分频ADCCLK 72MHz / 6 12MHz /*GPIO初始化*/ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); //将PA0引脚初始化为模拟输入 /*规则组通道配置*/ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //规则组序列1的位置配置为通道0 /*ADC初始化*/ ADC_InitTypeDef ADC_InitStructure; //定义结构体变量 ADC_InitStructure.ADC_Mode ADC_Mode_Independent; //模式选择独立模式即单独使用ADC1 ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; //数据对齐选择右对齐 ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; //外部触发使用软件触发不需要外部触发 ADC_InitStructure.ADC_ContinuousConvMode DISABLE; //连续转换失能每转换一次规则组序列后停止 ADC_InitStructure.ADC_ScanConvMode DISABLE; //扫描模式失能只转换规则组的序列1这一个位置 ADC_InitStructure.ADC_NbrOfChannel 1; //通道数为1仅在扫描模式下才需要指定大于1的数在非扫描模式下只能是1 ADC_Init(ADC1, ADC_InitStructure); //将结构体变量交给ADC_Init配置ADC1 /*ADC使能*/ ADC_Cmd(ADC1, ENABLE); //使能ADC1ADC开始运行 /*ADC校准*/ ADC_ResetCalibration(ADC1); //固定流程内部有电路会自动执行校准 while (ADC_GetResetCalibrationStatus(ADC1) SET); ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1) SET); }ADC时钟配置时钟源PCLK272MHz6分频后得到12MHz ADCCLK分频可选RCC_PCLK2_Div2/4/6/8GPIO引脚配置模式必须为GPIO_Mode_AIN模拟输入引脚PA0可根据需求更换为其他ADC通道引脚规则组通道配置通道ADC_Channel_0范围0~17序列位置1规则组转换顺序采样时间55.5个周期采样时间越长精度越高ADC核心初始化参数模式独立模式/双模式数据对齐右对齐/左对齐触发方式软件触发/外部触发转换模式单次/连续、扫描/非扫描校准流程复位校准→等待复位完成→启动校准→等待校准完成上电后必须执行三. 函数用法AD_Initvoid AD_Init(void);函数AD初始化作用完成ADC1时钟、GPIO、通道、工作模式配置并执行校准流程初始化ADC外设AD_GetValueuint16_t AD_GetValue(void);函数获取AD转换的值返回值AD转换的数字值范围0~409512位精度执行流程软件触发转换→等待转换完成→读取转换结果作用获取单次ADC转换的数字量结果四. 读取方式uint16_t AD_GetValue(void){ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发AD转换一次 while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) RESET); //等待EOC标志位即等待AD转换结束 return ADC_GetConversionValue(ADC1); //读数据寄存器得到AD转换的结果}五. 多通道ADvoid AD_Init(void) { /*开启时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //开启ADC1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 /*设置ADC时钟*/ RCC_ADCCLKConfig(RCC_PCLK2_Div6); //选择时钟6分频ADCCLK 72MHz / 6 12MHz /*GPIO初始化*/ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; 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); //将PA0、PA1、PA2和PA3引脚初始化为模拟输入 /*不在此处配置规则组序列而是在每次AD转换前配置这样可以灵活更改AD转换的通道*/ /*ADC初始化*/ ADC_InitTypeDef ADC_InitStructure; //定义结构体变量 ADC_InitStructure.ADC_Mode ADC_Mode_Independent; //模式选择独立模式即单独使用ADC1 ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; //数据对齐选择右对齐 ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; //外部触发使用软件触发不需要外部触发 ADC_InitStructure.ADC_ContinuousConvMode DISABLE; //连续转换失能每转换一次规则组序列后停止 ADC_InitStructure.ADC_ScanConvMode DISABLE; //扫描模式失能只转换规则组的序列1这一个位置 ADC_InitStructure.ADC_NbrOfChannel 1; //通道数为1仅在扫描模式下才需要指定大于1的数在非扫描模式下只能是1 ADC_Init(ADC1, ADC_InitStructure); //将结构体变量交给ADC_Init配置ADC1 /*ADC使能*/ ADC_Cmd(ADC1, ENABLE); //使能ADC1ADC开始运行 /*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); //在每次转换前根据函数形参灵活更改规则组的通道1 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发AD转换一次 while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) RESET); //等待EOC标志位即等待AD转换结束 return ADC_GetConversionValue(ADC1); //读数据寄存器得到AD转换的结果 }

更多文章