STM32F1进行ADC采样功能学习
1.adc.c文件
#include "adc.h" void ADC1_Init_Config(void) { ADC_InitTypeDef ADC_InitStruct; //1.配置ADC的GPIO引脚 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//输入功能不用设置输出速度参数 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2; //2.配置时钟,GPIOA时钟和ADC1外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1, ENABLE); //PA2 ADC_IN2 GPIO_Init(GPIOA, &GPIO_InitStruct); //3.配置ADC模式相关参数 ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; //设置成连续转换模式(ENABLE)或者单次转换模式(DISABLE) ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐,12位的数据,右对齐不用处理高位,高位就是0 ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //若是选择外部触发转换,选择对应的触发条件,否则设置为不使用外部触发 ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//多种模式组合,选择一种 ADC_InitStruct.ADC_NbrOfChannel = 1;//需要转换的通道数,这里只有1个通道要转换 ADC_InitStruct.ADC_ScanConvMode = DISABLE;//多通道扫描转换(ENABLE),或者是单通道转换(DISABLE),这里选择单通道转换 //4.配置ADC时钟不能超过14MHz 系统时钟72MHz进行6分频,12MHz RCC_ADCCLKConfig(RCC_PCLK2_Div6); //5.ADC1初始化 ADC_Init(ADC1, &ADC_InitStruct); //6.ADC1功能使能 ADC_Cmd(ADC1, ENABLE); }
2.main函数
#include "stm32f10x.h" #include "adc.h" #include "usart1.h" uint16_t adc_val = 0; void delay(void) { uint32_t t = 0; for(t = 0; t < 0xfffef; t ++); } int main(void) { USART1_Init(); ADC1_Init_Config(); //ADC规则通道配置 ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_239Cycles5); //RANK:数值越小,越先转换;这里通道2,第一个进行AD转换;要是有多个通道的话,设定先后顺序 // ADC采样周期计算公式 = ADC_SampleTime_xxxCycles5 + 12.5个周期,这里是256个周期,频率设置成了12MHz,所以采样时间 = 256/12MHz = 21.3us,采样时间长,采样会准确些 //ADC采样前先进行校准动作 ADC_ResetCalibration(ADC1);//复位校准 while(ADC_GetResetCalibrationStatus(ADC1) != RESET); //平时是1,复位完成变成0 ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1) != RESET);//平时是1,校准完成变成0 while(1) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //平时是0,转换完成变成1 adc_val = ADC_GetConversionValue(ADC1); printf("AD-VALUE: %.3f\r\n", (float)adc_val/4096.0*3.3);//这里注意需要除以4096.0,如果写成了整数,打印输出就会变成0.0了 delay(); } }

浙公网安备 33010602011771号