网站优化推广招聘,山西大同网站建设,无锡seo,wordpress文字样式时间记录#xff1a;2024/2/9
一、ADC相关知识点
#xff08;1#xff09;STM32的ADC时钟不要超过14MHz#xff0c;不然结果的准确率将下降 #xff08;2#xff09;ADC分为规则组和注入组#xff0c;规则组相当于正常运行的程序#xff0c;注入组相当于中断可以打断…时间记录2024/2/9
一、ADC相关知识点
1STM32的ADC时钟不要超过14MHz不然结果的准确率将下降 2ADC分为规则组和注入组规则组相当于正常运行的程序注入组相当于中断可以打断规则组的转换 312位的数据规则组最大可设置16个外部通道序列注入组最大可设置4个外部通道序列 4结果保存在16位数据寄存器中可以设置数据左对齐或右对齐 5单次模式和连续模式数据转化时是否连续转化单次模式仅转化一次连续模式转化一次后从头开始重新转化 6扫描模式和非扫描模式扫描模式就是将序列中的数据从头到尾全部转化非扫描模式仅转化序列中的第一个 7几种转换模式介绍 1.单次非扫描模式给出一个触发后会将序列1对应的通道数据进行转换然后产生EOC中断并且只转换1次 2.连续非扫描模式给出一个触发后会将序列1对应的通道数据进行转换数据转换完成后产生EOC中断然后一直进行转换数据产生EOC中断的过程 3.单次扫描模式给出一个触发后开始从序列1开始向下转换对应的通道数据全部序列的数据转换完毕后产生EOC中断并且只转换1次 4.连续扫描模式给出一个触发后开始从序列1转换数据全部转换完毕后产生EOC中断然后继续开始转换数据产生EOC的过程
二、示例代码单次、非扫描模式
1头文件
#ifndef __MYADC_H__
#define __MYADC_H__
#include stm32f10x.h//adc初始化
void vAdcInit(void);
//获取电压值
float xAdcGetValue(void);#endif
2源文件
#include my_adc.hvoid vAdcInit(void)
{//1.使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA,ENABLE);//2.配置初始化GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode GPIO_Mode_AIN;//模拟输入GPIO_InitStruct.GPIO_Pin GPIO_Pin_5;GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);//3.设置ADC分频因子RCC_ADCCLKConfig(RCC_PCLK2_Div6);//ADC时钟72M/612M不能超过14M//4.初始化ADC参数ADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_DataAlign ADC_DataAlign_Right;//数据对齐方式右对齐ADC_InitStruct.ADC_ContinuousConvMode DISABLE;//连续转换模式非连续转换ADC_InitStruct.ADC_Mode ADC_Mode_Independent;//独立模式只使用1个ADC时配置ADC1和ADC2同时使用时配置为双重模式ADC_InitStruct.ADC_ScanConvMode DISABLE;//扫描模式非扫描模式ADC_InitStruct.ADC_ExternalTrigConv ADC_ExternalTrigConv_None;//触发方式外部触发、硬件或软件触发ADC_InitStruct.ADC_NbrOfChannel 1;//转换的通道数ADC_Init(ADC1,ADC_InitStruct);//5.设置ADC规则组通道参数3转换顺序序列参数4采样时间ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_55Cycles5);//6.使能ADCADC_Cmd(ADC1,ENABLE);//7.ADC校准ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1) SET);ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));
}float xAdcGetValue(void)
{uint16_t temp0;ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能软件触发转换while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待转换结束tempADC_GetConversionValue(ADC1);//获取电压值return (float)3.3*temp/4095;
}