ADC模数转换(单通道):
解释:通过ADC将GPIO读取电压的0,1转换成0V~3.3V。即模电转为数电。
一:ADC初始化函数设计思路:
(推荐设置为AD_Init)
1.开启RCC+2.GPIO初始化部分+3.ADC选择输入通道+4.初始化ADC+5.Cmd开关控制+6.校验用四函数+7.自定义函数显示AD的值。
展开说:
1.RCC开启:RCC_APB2PeriphClockCmd(是GPIOB的)+RCC_ADCClockConfig(是ADC的)
2.GPIO_Init(),选择Mode_AIN(模拟输入专用)和Pin_0引脚
3.ADC_RegularChannelConfig(ADC1,ADC_Channel1_0,1,_55Cycle5),该函数是ADC的库函数里面的。
4.使用库函数 ADC_Init()
_Count...Mode=Disable;单通道使用单次转换。转换模式指转换一个通道,传递给EOC后中止,若需要转换下个通道,则需要重新转换
_DataAlign=_...Right;使用右对齐,因为左对齐会改变数据大小
_ExternalT..=_None;该参数选择是否使用外部触发,应该使用软件触发,所以选择不使用
_Mode=_Independent;此处选择单通道模式(其实无所谓,因为此处只用到一个通道。区别就是选择单通道之后就使其他通道无法被使用)
_NbrofChannel=1;该参数是几个通道起作用,选1,1个通道。
_ScanconvMode=DISABLE;该参数是选择是否使用扫描模式,选择非扫描模式。此处只用到一个通道。区别就是选择非扫描模式之后就使其他通道无法被使用。选择扫描模式时,就是对你指定的几个通道都进行扫描,因此是与通道数目搭配使用的。
5.开关控制为库函数ADC_Cmd();
6.校验四函数为:
ADC_ResetCalibration(ADC1);复位校验
ADC_GetresetCalibration;获取复位状态,等待校验完成
ADC_StartCalibration;开始校验
ADC_GetCalibration;获取开始校验状态,等待校验完成
7.自定义函数封装思路:
推荐封装名字为uint16_t Get_Value(void),因为要显示电压
首先使用库函数ADC_SoftwareStartConvCmd();来使ADC开始转换,并触发外部中断。
之后使用查看标志位状态函数ADC_GetFlag()判断是否被置。(因为ADC通道是要传递给EOC的)
最后返回一个值来给主函数在OLED中显示,注意,此值是未处理的2的16进制值,所以用uint16_t
二:主函数部分思路:
使用OLED通过Value显示AD值,并通过Voltage显示电压值。
因为电压需要Value先转化为浮点数,再进行/4095*3.3的操作(固定公式)。对于小数部分,通过先*100后%100即可完成操作。
三:ADC相关需要掌握的库函数
//ADCCLK相关配置函数(在rcc.h里): //void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);//配置ADCCLK分频器,对APB2的72MHz时钟选择2,4,6,8分频,输入到ADCCLK //ADC相关库函数(在adc.h里): //void ADC_DeInit(ADC_TypeDef* ADCx);//恢复出厂配置 //void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);//初始化 //void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);//配置结构体 //void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);//给ADC上电,即最后一步的开关控制 //void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);//开启DMA输出信号 //void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, 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);//ADC软件开始转换控制--触发控制的软件触发 //FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx);//获取标志位状态,转换结束EOC置1 //以下为配置间断模式相关函数: //void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);//每个几个通道间断一次 //void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);//是否启用间断模式 //void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); //ADC规则组通道配置,给序列的每个位置填写指定通道(重点) //参数二:ADC_Channel为指定的通道; 参数三:ADC_Channel序列几; 参数四:ADC_SampleTime指定通道的采样时间 //void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);//判断是否允许ADC外部触发转换 //uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);//ADC获取转换值,读取结果时使用该函数。(重点) //uint32_t ADC_GetDualModeConversionValue(void);//获取双模式转换结果 //FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);//获取标志位状态 //void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);//清楚标志位 //ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);//获取中断状态 //void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);//清除中断挂起位
四:笔记